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.
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.
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("nom", function() { ... })โ biz tavsiflayotgan funksionallik. Testlarni guruhlaydi;it("holat tavsifi", function() { ... })โ aniq bir foydalanish holatining tavsifi va tekshiruvi;assert.equal(a, b)โavabteng ekanini tekshiradi. Teng bo'lmasa, test xato beradi.
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:
assert.equal(a, b)โa == bekanini tekshiradi;assert.strictEqual(a, b)โa === b(qat'iy tenglik);assert.notEqual(a, b)โ teng emasligini tekshiradi;assert.deepEqual(a, b)โ obyekt/massivlarni chuqur solishtiradi.
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:
- Avval test yoziladi (funksiya hali yo'q โ test xato beradi);
- So'ng testni o'tkazadigan minimal kod yoziladi;
- Test o'tsa โ keyingi holat uchun yangi test qo'shiladi;
- 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;
}
Xulosa
- Avtomatik testlar kodni har o'zgartirishda qo'lda sinashdan qutqaradi;
- BDD โ testlar bir vaqtda hujjat va misol vazifasini bajaradi;
- Mocha'da
describeguruhlaydi,itholatni tavsiflaydi,asserttekshiradi; - TDD โ avval test, keyin kod yozish usuli; testlar refactoringni xavfsiz qiladi.