Mocha — JavaScript va Node.js loyihalari uchun moslashuvchan test framework. U testlarni guruhlash, hooklar, asynchronous test va reporterlarni boshqaradi. Assertion, mock va coverage vositalari ko‘pincha alohida kutubxonalar orqali qo‘shiladi.
Mocha “hamma narsa bir paketda” modelidan ko‘ra composable ekotizimga yaqin.
Test strukturasi
describe;it;before;after;beforeEach;afterEach.
Misol:
describe("calculator", () => {
it("adds numbers", () => {
// assertion
})
})
TDD interface kabi boshqa UI variantlari ham mavjud bo‘lishi mumkin.
Assertion kutubxonasi
Mocha o‘zi to‘liq assertion API bermaydi.
Node assert, Chai yoki boshqa kutubxona ishlatiladi.
Masalan:
assert.equal(sum(2, 3), 5)
Jamoa matcher uslubi va pluginlarni tanlaydi.
Synchronous test
Test function oddiy tugasa muvaffaqiyatli hisoblanadi.
Exception tashlansa test yiqiladi.
Assertion failure odatda exception shaklida keladi.
Unutilgan assertion testni bo‘sh holda o‘tkazishi mumkin.
Promise
Test promise qaytarsa Mocha uning tugashini kutadi.
Promise reject bo‘lsa test yiqiladi.
async function avtomatik promise qaytaradi.
Await qilinmagan ichki asynchronous operation testdan keyin xato berishi mumkin.
done callback
Callback API uchun test done parameter oladi.
Asynchronous ish tugagach:
done()
xatoda:
done(error)
chaqiriladi.
Promise qaytarish va doneni birga ishlatish noto‘g‘ri.
Hook
beforeEach har test oldidan setup bajaradi.
afterEach cleanup qiladi.
before va after suite bo‘yicha bir marta ishlaydi.
Shared mutable fixture testlar tartibiga bog‘lanmasligi kerak.
Nested suite
describe ichida boshqa describe bo‘lishi mumkin.
Hooklar hierarchy bo‘yicha ishlaydi.
Juda chuqur nesting test nomini uzun va setupni yashirin qiladi.
Domain behaviorga mos sodda guruhlash afzal.
Timeout
Har test uchun maksimal vaqt belgilanadi.
Uzun integration test alohida timeout olishi mumkin.
Timeoutni juda katta qilish hangni yashiradi.
Asl sabab fixed sleep, network yoki tugamagan callback bo‘lishi mumkin.
Retry
Test ma’lum marta qayta bajarilishi mumkin.
Bu tashqi beqaror integration uchun vaqtinchalik yordam.
Retry o‘tgan testni to‘liq sog‘lom deb hisoblash mumkin emas.
Flaky status report qilinadi.
Reporter
Mocha turli output reportlarini qo‘llaydi:
CI machine-readable format olishi mumkin.
Local developmentda o‘qilishi qulay reporter tanlanadi.
Test discovery
Command argument va glob test fayllarini belgilaydi.
Masalan:
test/**/*.spec.js
Build output va source testlari ikki marta topilmasligi kerak.
ESM va TypeScript loader configurationga bog‘liq.
ESM
Node ES module va CommonJS testlari turli import va configga ega.
Package type, extension va loader bir-biriga mos bo‘ladi.
Module cache test isolationga ta’sir qiladi.
Dynamic import ayrim mock usullarini murakkablashtiradi.
TypeScript
Mocha TypeScriptni to‘g‘ridan-to‘g‘ri compile qilmaydi.
Runtime loader, transpiler yoki oldindan compilation ishlatiladi.
Source map stack trace’ni original .ts qatoriga qaytaradi.
Type checking CI’da alohida bajariladi.
Mock va spy
Sinon kabi kutubxona mock, stub, spy va fake timer beradi.
Mocha test lifecycle hooklari ularni restore qiladi.
Sandbox har testdan keyin barcha fake’larni tozalashga yordam beradi.
Global monkey patch qolib ketmasligi kerak.
Coverage
NYC/Istanbul yoki V8ga oid tool orqali coverage yig‘iladi.
Mocha faqat test runner.
Instrumentation ESM, TypeScript va child processlar bilan to‘g‘ri sozlanadi.
Coverage threshold CI’da tekshiriladi.
Parallel mode
Test fayllari parallel bajarilishi mumkin.
Root hook, global fixture va portlar parallelga mos bo‘lishi kerak.
Bir xil database yoki temp filename conflict yaratadi.
Parallelizm unit suite’da osonroq.
Root hook
Bir nechta test fayliga umumiy setup plugin orqali berilishi mumkin.
Masalan, global database connection yoki environment.
Yashirin root hook testni alohida ishga tushirganda tushunishni qiyinlashtirishi mumkin.
Scope hujjatlashtiriladi.
Exclusive va skip
only bitta suite yoki testni tanlaydi.
skip vaqtincha o‘tkazib yuboradi.
Repositoryga tasodifan only kirsa CI faqat oz testni bajarishi mumkin.
Lint yoki CI check bunga yo‘l qo‘ymaydi.
Mocha va Jest
Jest assertion, mock, snapshot va coverage’ni integratsiyalashgan tarzda beradi.
Mocha esa kerakli kutubxonalarni tanlashga moslashuvchan.
Legacy Node loyihalari va custom stackda Mocha qulay.
Konfiguratsiya qismlari ko‘proq bo‘lishi mumkin.
Chai uslublari
Chai assert, expect va should uslublarini taklif qilishi mumkin. Jamoa bitta asosiy uslubni tanlasa testlar izchil bo‘ladi. should object prototype’iga ta’sir qilishi mumkin, shuning uchun cheklovlari tushuniladi.
Sinon sandbox
Sandbox har test uchun spy, stub va fake timerlarni guruhlaydi. restore barcha o‘zgarishlarni tiklaydi. Bu global method patchi keyingi testga qolishining oldini oladi.
Leak aniqlash
Tugamagan timer, server yoki socket processni testlardan keyin ochiq ushlab turishi mumkin. Mocha run tugamasligi shunday resource leak signalidir. Cleanup hook va handle diagnostikasi ishlatiladi.
Integration suite
Unit va integration testlar boshqa directory, timeout va command bilan ajratiladi. Tez unit testlar localda doim, sekin integration testlar CI’da kerakli service bilan ishlaydi.
Bog‘liq tushunchalar
Mocha, JavaScript testing, Node.js, Test runner, Chai, Sinon, Async testing, Test hook, Reporter, Code coverage, Jest