Dasturiy testlash asoslari: Unit, Integration va E2E testlar, Jest freymvorki, matchers (.toBe vs .toEqual), asinxron kodni testlash hamda Mocking (jest.fn).
Bu bobda kodni avtomatik tekshirish — dasturiy testlashning asoslarini o'rganamiz. Bu — professional dasturlashning ajralmas qismi.
Test — kodning kutilgan natijani berishini avtomatik ravishda tekshiruvchi, o'zi ham kod bo'lgan dastur.
Loyiha kattalashgan sari, bitta joyni o'zgartirish boshqa joyda kutilmagan xatoga olib kelishi mumkin. Testlar — bunday "yashirin" xatolarni, kod ishga tushirilishidan oldin, avtomatik ravishda aniqlaydi.
🔬 Test yozish — bu ko'prik qurilgandan keyin, unga haqiqiy mashinalar o'tishidan oldin, avtomatik sensorlar bilan mustahkamligini tekshirishga o'xshaydi. Har safar ko'prikka biror o'zgarish kiritilganda, sensorlar qayta tekshiradi — "hali ham mustahkammi?"
| Test turi | Nimani tekshiradi | Miqyosi |
|---|---|---|
| Unit Test | Bitta function/metodni, alohida | Eng kichik |
| Integration Test | Bir nechta qism birga qanday ishlashini | O'rtacha |
| End-to-End (E2E) Test | Butun dasturni, foydalanuvchi nuqtai nazaridan | Eng katta |
💡 Key Idea
Bu bobda asosan Unit Testlarga e'tibor qaratamiz, chunki ular eng ko'p yoziladigan va JavaScript function'larini (kitobning Chapter 6-46'da o'rgangan barcha function turlarini) tekshirish uchun eng mos keladi.
Jest — JavaScript uchun eng mashhur test framework'laridan biri, u testlarni yozish va ishga tushirish uchun tayyor vositalarni taqdim etadi.
script.jsJavaScript// mathUtils.jsfunction add(a, b) {return a + b;}module.exports = { add };
script.jsJavaScript// mathUtils.test.jsconst { add } = require("./mathUtils");test("2 va 3 ni qo'shish 5 ni beradi", function () {expect(add(2, 3)).toBe(5);});
test(description, callback) — bitta test holatini belgilaydi, description — testning nima qilishini tushuntiruvchi matn.expect(value) — tekshirilayotgan qiymatni "o'raydi"..toBe(expected) — matcher, kutilgan natija bilan solishtiradi.terminal.shBashnpm test
🔗 Connection
Bu — Chapter 49'da o'rgangan package.jsondagi "scripts": { "test": "jest" } orqali ishga tushiriladi.
| Matcher | Vazifasi |
|---|---|
.toBe(value) | Aniq tenglikni tekshiradi (===) |
.toEqual(value) | Object/array'larning mazmunini solishtiradi (chuqur tenglik) |
.toBeTruthy() / .toBeFalsy() | Truthy/Falsy ekanini tekshiradi (Chapter 4.4) |
.toContain(item) | Array/string ichida borligini tekshiradi |
.toThrow() | Function xatolik chiqarishini tekshiradi |
Bu — Chapter 8/16'da o'rgangan reference type tushunchasi bilan bevosita bog'liq.
script.jsJavaScripttest("Object'larni solishtirish", function () {let obj1 = { name: "Ali" };let obj2 = { name: "Ali" };expect(obj1).toBe(obj2); // ❌ FAILS — ikkalasi turli object'lar (reference)expect(obj1).toEqual(obj2); // ✅ PASSES — mazmuni bir xil});
toBe() — Chapter 8.7'da o'rgangan === operatoriga o'xshab, aynan bir xil obyektga ishora qilishni talab qiladi (reference tenglik). toEqual() esa — obyektlarning ichidagi qiymatlarini solishtiradi (chuqur tenglik, "deep equality"), garchi ular xotirada boshqa-boshqa obyektlar bo'lsa ham.
⚠️ Common Mistake
Object yoki array'larni solishtirishda .toBe() ishlatish — deyarli har doim testni "muvaffaqiyatsiz" qiladi, chunki ikkita alohida yaratilgan (garchi bir xil mazmunli) obyekt — hech qachon === bo'yicha teng emas. Bunday hollarda har doim .toEqual() ishlatilishi kerak.
Chapter 26-28'da o'rgangan asinxron function'larni test qilish uchun, Jest'da async/await to'g'ridan-to'g'ri ishlatiladi.
script.jsJavaScriptasync function fetchUserName(id) {// haqiqiy loyihada bu yerda fetch() chaqirilardi (Chapter 37)return "Ali";}test("fetchUserName to'g'ri ismni qaytaradi", async function () {let name = await fetchUserName(1);expect(name).toBe("Ali");});
🔗 Connection
Bu — Chapter 28'da o'rgangan async/await bilimining, test yozishdagi to'g'ridan-to'g'ri qo'llanilishi: test function'ining o'zi ham async bo'lishi mumkin.
Mock — haqiqiy function yoki modul o'rniga ishlatiladigan, "soxta" (sun'iy) versiya. Bu, ayniqsa, tarmoq so'rovlari (Chapter 37) yoki tasodifiy qiymatlar (Chapter 10) kabi ishonchsiz yoki sekin narsalarni test qilishda foydali.
Agar test haqiqiy serverga so'rov yuborsa (Chapter 37'dagi fetch), test — internet aloqasiga, server holatiga bog'liq bo'lib qoladi, bu esa testlarni ishonchsiz va sekin qiladi.
script.jsJavaScriptfunction processPayment(amount, paymentGateway) {if (amount <= 0) {throw new Error("Noto'g'ri summa");}return paymentGateway.charge(amount);}test("processPayment paymentGateway.charge'ni chaqiradi", function () {let mockGateway = {charge: jest.fn(() => "muvaffaqiyatli")};let result = processPayment(100, mockGateway);expect(mockGateway.charge).toHaveBeenCalledWith(100);expect(result).toBe("muvaffaqiyatli");});
jest.fn(() => "muvaffaqiyatli") — haqiqiy charge metodi o'rniga ishlatiladigan soxta function yaratadi.toHaveBeenCalledWith(100) — mock function qanday argumentlar bilan chaqirilganini tekshiradi — bu, function to'g'ri ishlaganini tasdiqlashning qo'shimcha usuli.🔥 Important
Mocking — Chapter 37'dagi fetch() kabi tashqi bog'liqliklarni test qilishda muhim texnika: haqiqiy server so'rovi yubormasdan, "agar server shunday javob bersa, mening kodim to'g'ri ishlaydimi?" degan savolga javob berish imkonini beradi.
Task:
Chapter 9'dagi toUpperCase() metodini ishlatuvchi oddiy function uchun Jest test yozing: shout(text) — matnni katta harflarga o'tkazadi, "!" qo'shadi.
Required Concepts:
test(), expect().toBe()expect(shout("salom")).toBe("SALOM!");Task:
Chapter 7'dagi array metodlarini ishlatuvchi getEvenNumbers(arr) function uchun test yozing (.toEqual() bilan, chunki natija — array).
Required Concepts:
toEqual() array uchunexpect(getEvenNumbers([1,2,3,4])).toEqual([2,4]);Task:
Chapter 18'dagi kabi xatolik chiqaruvchi divide(a, b) function uchun (agar b === 0 bo'lsa xatolik chiqarsin), .toThrow() matcheri bilan test yozing. Bundan tashqari, jest.fn() yordamida oddiy "logger" mockini yaratib, divide funksiyasi muvaffaqiyatli natijani logger orqali "yozib qo'yishini" tekshiring.
Required Concepts:
toThrow(), jest.fn()expect(() => divide(5, 0)).toThrow();script.jsJavaScripttest("Array solishtirish", function () {let arr1 = [1, 2, 3];let arr2 = [1, 2, 3];expect(arr1).toBe(arr2);});
Bu test muvaffaqiyatli o'tadimi (PASS) yoki muvaffaqiyatsiz (FAIL) bo'ladimi?
🧠 Think first! Javobni ko'rishdan oldin kamida 30 soniya o'ylang.
<details> <summary>Answer</summary> FAIL (muvaffaqiyatsiz).Why?
arr1 va arr2 — ikkita alohida array (Chapter 7.7, reference type), garchi ularning ichidagi qiymatlar bir xil bo'lsa ham. .toBe() — reference tenglikni (===) tekshiradi, shuning uchun bu test FAIL bo'ladi. .toEqual() ishlatilganda edi, test PASS bo'lardi.
Quyidagi testda muammo bor:
script.jsJavaScriptfunction getUser() {return { name: "Ali", age: 25 };}test("getUser to'g'ri ma'lumot qaytaradi", function () {let user = getUser();expect(user).toBe({ name: "Ali", age: 25 }); // FAIL bo'ladi});
Your Task:
Yechim:
</details>script.jsJavaScripttest("getUser to'g'ri ma'lumot qaytaradi", function () {let user = getUser();expect(user).toEqual({ name: "Ali", age: 25 }); // PASS});
test(), expect(), va turli matcher'lar orqali ishlaydigan mashhur framework..toBe() — reference tenglik, .toEqual() — mazmun tengligi uchun ishlatiladi..toEqual() ishlating, .toBe() emas.script.jsJavaScripttest("tavsif", function () {expect(actualValue).toBe(expectedValue);expect(obj).toEqual(expectedObj);expect(value).toBeTruthy();expect(array).toContain(item);expect(() => fn()).toThrow();});test("async test", async function () {let result = await someAsyncFunc();expect(result).toBe(expected);});let mockFn = jest.fn(() => "natija");expect(mockFn).toHaveBeenCalledWith(arg);
Mavzu bo‘yicha tushunchalaringizni interaktiv test orqali sinovdan o‘tkazing va natijalarni bilib oling.
Darslikda o‘rganilgan qoidalarga asosan real kod yozing, testlardan o‘tkazing va yechimlarni mustahkamlang.
Test Sinovi
Hali topshirilmagan (kamida 75% kerak)
Amaliy Masalalar
0 / 3 ta yechildi (kamida 75% kerak)
Dars sifati va mazmunini yaxshilash uchun o‘z haqqoniy bahoingizni qoldiring.
Mavzuni to‘liq o‘zlashtirish uchun test sinovi, amaliy kodlash va bog‘liq darslar
O‘z bilimingizni interaktiv test savollari orqali tekshiring va darhol xatolarni tahlil qiling.
Nazariyani real kod yozish bilan mustahkamlang, avtomatik testlardan o‘ting va XP to‘plang.
Kurs bo‘yicha keyingi va bog‘liq mavzular: