JavaScript kodni testlash

Kodni har o’zgartirishda qo’lda tekshirish uzoq va ishonchsiz. Test — kodni tekshiradigan kod: bir marta yoziladi, har safar avtomatik ishlaydi.

Nima uchun kerak

Asosiy foyda — regressiyadan himoya: eski kodni o’zgartirganda nimadir buzilsa, test darhol aytadi.

Testsiz tekshiruv

Avval oddiy yondashuvni ko’ramiz:

JavaScript

Har o’zgarishdan keyin natijalarni ko’z bilan solishtirish kerak. Test buni avtomatlashtiradi.

Oddiy test yozuvchi

Kutubxonasiz ham tamoyilni ko’rsatish mumkin:

JavaScript

Haqiqiy test kutubxonalari ham aynan shu ishni bajaradi — faqat ancha boyroq imkoniyatlar bilan.

Vitest bilan

npm install -D vitest

package.json ga:

{
  "scripts": {
    "test": "vitest"
  }
}

discount.js:

export function discount(price, percent) {
  if (percent < 0 || percent > 100) throw new RangeError("foiz 0-100");
  return Math.round(price * (1 - percent / 100));
}

discount.test.js:

import { describe, it, expect } from "vitest";
import { discount } from "./discount.js";

describe("discount", () => {
  it("10% chegirmani to'g'ri hisoblaydi", () => {
    expect(discount(100000, 10)).toBe(90000);
  });

  it("0% da narxni o'zgartirmaydi", () => {
    expect(discount(100000, 0)).toBe(100000);
  });

  it("noto'g'ri foizda xato beradi", () => {
    expect(() => discount(100, 150)).toThrow(RangeError);
  });
});

Ishga tushirish: npm test.

AAA naqshi

Har test uch qismdan iborat bo’lsin:

it("savatga mahsulot qo'shadi", () => {
  // Arrange — tayyorlash
  const cart = createCart();
  const product = { title: "Olma", price: 12000 };

  // Act — bajarish
  cart.add(product);

  // Assert — tekshirish
  expect(cart.count()).toBe(1);
  expect(cart.total()).toBe(12000);
});

Bu tuzilma testni o’qishni osonlashtiradi va bitta testda bir necha ishni tekshirishdan saqlaydi.

Asosiy matcherlar

MatcherTekshiradi
toBe(x)Aynan tenglik (===) — sonlar, matnlar
toEqual(x)Tuzilma tengligi — obyekt va massivlar
toBeCloseTo(x)Kasr sonlar (yaxlitlash xatosi bilan)
toContain(x)Massiv yoki matn ichida bormi
toThrow()Xato beradimi
toHaveLength(n)Uzunlik

Nimani sinash kerak

JavaScript

Ustuvorlik tartibi:

  1. Chegara qiymatlar — 0, bo’sh massiv, null, chegaraning ikki tomoni;
  2. Xato holatlari — noto’g’ri kirish;
  3. Asosiy holat — odatiy ishlash;
  4. Tuzatilgan xatolar — har buzilgan joyga test yoziladi, qaytmasligi uchun.

Testga qulay kod

JavaScript

Sof funksiyalar testga eng qulay: tayyorgarlik kerak emas, natija bashorat qilinadi.

Tashqi bog’liqlikni argument sifatida uzatish ham yordam beradi:

// Qiyin: ichida vaqtga bog'lanadi
function isStaleHard(date) {
  return Date.now() - date > 86400000;
}

// Oson: vaqt tashqaridan beriladi
function isStaleEasy(date, now = Date.now()) {
  return now - date > 86400000;
}

Qamrov haqida

Amaliy mashq

  1. Sodda funksiya yozing va uni qo’lda tekshiring;
  2. yuqoridagi test/expect yordamchisi bilan uni sinang;
  3. chegara qiymatlar uchun test qo’shing;
  4. xato beradigan holatni sinang;
  5. toBe va toEqual farqini obyektda ko’ring;
  6. tashqi holatga bog’liq funksiyani sof qilib qayta yozing.

Qisqacha xulosa

  • Test — kodni tekshiradigan kod; regressiyadan himoya qiladi.
  • Birlik testlari ko’p va tez, E2E kam va sekin.
  • AAA: Arrange → Act → Assert.
  • Obyekt uchun toEqual, aniq qiymat uchun toBe, kasr uchun toBeCloseTo.
  • Avval chegara va xato holatlarini sinang.
  • Sof funksiya va tashqaridan uzatilgan bog’liqlik testni osonlashtiradi.

Keyingi darsda tezlik va optimallashtirish.

Bu dars foydali bo'ldimi?

—
— marta ko'rildi