Kod sifati

Avtomatlashtirilgan testlar (Mocha)

Avtomatlashtirilgan testlar โ€” bu bizning kodimiz to'g'ri ishlashini avtomatik tekshiradigan maxsus kod. Ularsiz har o'zgarishdan keyin kodni qo'lda sinash kerak bo'ladi, bu esa juda ko'p vaqt oladi va xatolarni yo'qotib qo'yadi.

Mocha va assert kutubxonalari bu maydonchada (playground) ishlamaydi. Shuning uchun bu darsda test kodlari statik ko'rinishda beriladi โ€” ularni haqiqiy Node.js muhitida ishga tushiring.

Nega qo'lda sinash yetarli emas?

Aytaylik, biz pow(x, n) โ€” darajaga ko'tarish funksiyasini yozdik. Uni yozayotganda, biz konsolda pow(2, 3) ni tekshirib ko'ramiz. Natija 8 โ€” to'g'ri.

Ammo keyinroq kodni takomillashtirsak, uni yana qo'lda sinashimiz kerak. Bir nechta holatni har safar qo'lda tekshirish โ€” zerikarli va ishonchsiz. Odam bir holatni tekshirib, boshqasini unutib qo'yadi.

Qo'lda sinashning asosiy muammosi: kodni har o'zgartirganda, avval ishlagan qismlar buzilmaganini tekshirish qiyin. Avtomatik testlar aynan shu muammoni hal qiladi.

BDD โ€” testlar spetsifikatsiya sifatida

BDD (Behavior Driven Development โ€” xatti-harakatga asoslangan ishlab chiqarish) uchtta narsani birlashtiradi: testlar, hujjat va misollar. BDD'da test kodi bir vaqtning o'zida funksiya nima qilishini ham tavsiflaydi.

Test tuzilishi: describe va it

Mocha kutubxonasida testlar describe va it funksiyalari yordamida tuziladi:

describe("pow", function() {

  it("2 ni 3-darajaga ko'taradi", function() {
    assert.equal(pow(2, 3), 8);
  });

  it("3 ni 4-darajaga ko'taradi", function() {
    assert.equal(pow(3, 4), 81);
  });

});

Bu yerda it ichidagi matn โ€” ingliz yoki o'zbek tilida yozilgan tavsif. Test bajarilganda u shu tavsif bilan ko'rsatiladi, shuning uchun natijani o'qish oson bo'ladi.

assert modulidan foydalanish

Node.js'da assert moduli o'rnatilgan. Uning eng ko'p ishlatiladigan metodlari:

const assert = require('assert');

assert.equal(2 + 2, 4);          // OK, hech narsa chiqarmaydi
assert.strictEqual(1 + 1, 2);    // OK
// assert.equal(1, 2);           // xato: AssertionError

TDD jarayoni

TDD (Test Driven Development โ€” testga asoslangan ishlab chiqarish) โ€” bu kodni yozishdan oldin test yozish usuli. Jarayon shunday:

  1. Avval test yoziladi (funksiya hali yo'q โ€” test xato beradi);
  2. So'ng testni o'tkazadigan minimal kod yoziladi;
  3. Test o'tsa โ€” keyingi holat uchun yangi test qo'shiladi;
  4. Kod takomillashtiriladi, testlar esa hech narsa buzilmaganini kafolatlaydi (bu "refactoring" bosqichi).

Masalan, avval bir necha test yozamiz, keyin ularni o'tkazadigan funksiyani:

// 1-qadam: testlar (funksiya hali yo'q)
describe("pow", function() {
  it("musbat darajalarni to'g'ri hisoblaydi", function() {
    assert.equal(pow(2, 3), 8);
    assert.equal(pow(3, 3), 27);
  });
});
// 2-qadam: testni o'tkazadigan kod
function pow(x, n) {
  let natija = 1;
  for (let i = 0; i < n; i++) {
    natija *= x;
  }
  return natija;
}
TDD'ning kuchi shundaki: har bir yangi holat uchun test yozib, funksiyani asta-sekin mustahkamlaysiz. Testlar to'plami kod ustida ishonchli "himoya to'ri" bo'lib qoladi.
Kichik funksiyalarni ham test bilan qoplang. Kod qanchalik ko'p test bilan qoplansa, uni o'zgartirish shunchalik xavfsiz bo'ladi.

Xulosa