Assertion — test yoki dastur bajarilishida ma’lum shart to‘g‘ri bo‘lishi kerakligini ifodalovchi tekshiruv. Shart bajarilmasa test yiqiladi yoki dastur assertion xatosi chiqaradi. Testlashda assertion actual natijani expected qiymat bilan solishtirib, tekshirilayotgan behavior to‘g‘ri ekanini tasdiqlaydi.
Masalan:
expected: 200
actual: 200
yoki:
user.is_active == true
Testdagi vazifasi
Test odatda uch bosqichdan iborat:
- sharoit tayyorlanadi;
- action bajariladi;
- natija assertion bilan tekshiriladi.
Assertion bo‘lmasa test kodni ishga tushiradi, ammo natijaning to‘g‘riligini tasdiqlamaydi.
Equality assertion
Eng keng assertion actual va expected qiymat tengligini tekshiradi:
assert result == 10
Objectlarda equality qoidasi muhim.
Agar class identity bo‘yicha taqqoslansa, mazmuni bir xil ikki object teng bo‘lmasligi mumkin.
Identity assertion
Ikki reference ayni objectni ko‘rsatishini tekshiradi.
Bu equality’dan farq qiladi.
Masalan, singleton yoki cache ayni instance qaytarishi kerak bo‘lsa identity muhim.
Oddiy value uchun identity ishlatish noto‘g‘ri xulosa berishi mumkin.
Boolean assertion
Shart true yoki false bo‘lishi tekshiriladi:
assert user.is_active
assert not cart.is_empty
Shart juda murakkab bo‘lsa failure xabari tushunarsiz bo‘ladi.
Murakkab expression bir nechta ma’noli assertionga bo‘linishi mumkin.
Null tekshiruvi
Qiymat mavjud yoki mavjud emasligi tekshiriladi.
Misollar:
is null;is not null;- optional qiymat;
- empty va null farqi.
Null bo‘lmaganini tekshirgandan keyin boshqa fieldlar tekshiriladi.
Bitta uzun expression null sababini yashirishi mumkin.
Collection assertion
Ro‘yxat uchun faqat umumiy equality emas, ma’noli tekshiruvlar ishlatiladi:
- uzunlik;
- element mavjudligi;
- tartib;
- subset;
- duplicate yo‘qligi;
- har element sharti.
Tartib business uchun muhim bo‘lmasa order-insensitive assertion tanlanadi.
Exception assertion
Ma’lum input xato chiqarishi kerak bo‘lsa exception tekshiriladi.
Assertion:
- exception turi;
- message;
- error code;
- sabab;
- qaysi actionda chiqqani
ni tasdiqlashi mumkin.
Juda keng exception turi noto‘g‘ri xatoni ham qabul qilib yuboradi.
Approximate equality
Floating-point qiymatlar exact teng bo‘lmasligi mumkin.
Shuning uchun tolerance bilan solishtiriladi:
actual ≈ expected ± epsilon
Absolute yoki relative tolerance qiymat scale’iga mos tanlanadi.
Juda katta tolerance testni ma’nosiz qiladi.
String assertion
Matn uchun:
ishlatiladi.
Userga ko‘rinadigan to‘liq xabarni exact tekshirish localization va punctuation o‘zgarganda mo‘rt bo‘lishi mumkin.
Muhim semantic qism tekshiriladi.
Snapshot assertion
Katta object, HTML, UI tree yoki JSON output snapshot bilan solishtiriladi.
Farq ko‘rilib, yangi snapshot tasdiqlanadi.
Snapshotni tekshirmasdan ommaviy update qilish regressiyani yashiradi.
Dynamic timestamp va ID normalize qilinadi.
Soft assertion
Oddiy assertion birinchi xatoda testni to‘xtatadi.
Soft assertion bir nechta xatoni yig‘ib, oxirida barchasini ko‘rsatadi.
Formadagi ko‘p fieldni tekshirishda qulay.
Biroq keyingi assertion oldingi muvaffaqiyatga bog‘liq bo‘lsa cascading xato yuz beradi.
Custom assertion
Domain uchun maxsus assertion yozilishi mumkin:
assert_order_paid(order)
assert_valid_invoice(invoice)
U ichki bir nechta shartni tekshiradi va tushunarli failure xabari beradi.
Custom assertion testlarni o‘qishni yaxshilaydi.
Failure xabari
Yaxshi assertion failure quyidagilarni ko‘rsatadi:
- expected;
- actual;
- farq;
- context;
- muhim identifier.
“Assertion failed”ning o‘zi diagnostika uchun kam.
Framework structured diff va source qatorini ko‘rsatishi mumkin.
Bitta testdagi assertionlar
“Har testda faqat bitta assertion” qat’iy universal qoida emas.
Bitta behaviorning bir nechta natijasini tekshirish tabiiy:
Ammo bir-biriga aloqasiz ko‘p behavior bitta testda bo‘lsa failure sababini ajratish qiyin.
Assertion tartibi
Avval fundamental shart tekshiriladi.
Masalan, response null emasligi, keyin fieldlar.
Shunda keyingi assertion runtime xato bermaydi.
Collection uzunligini tekshirmasdan indexga murojaat qilish testning asl failure xabarini yo‘qotishi mumkin.
Production assertion
Ba’zi tillarda assert production runtime’da o‘chirilishi mumkin.
User input validation yoki security check uchun shunday assertionga tayanish xavfli.
Production validation har doim ishlaydigan explicit shart va exceptiondan foydalanadi.
Assertion developer invariantlarini tekshirish uchun mos.
Invariant
Dastur ichida har doim to‘g‘ri bo‘lishi kerak bo‘lgan shart invariant deyiladi.
Masalan:
balance >= 0
Agar bu biznes qoidasi user inputdan buzilishi mumkin bo‘lsa normal error handling kerak.
Ichki “bu holatga kelish mumkin emas” sharti assertion bo‘lishi mumkin.
Property-based test
Assertion bir nechta aniq misol o‘rniga umumiy xususiyatni tekshiradi.
Masalan:
decode(encode(x)) == x
Framework turli random inputlar yaratadi.
Failure topilganda minimal counterexample ko‘rsatiladi.
Async assertion
Asynchronous tizimda holat darhol yuz bermasligi mumkin.
Test ma’lum vaqt ichida shart bajarilishini kutadi.
Faqat fixed sleep emas, polling yoki framework wait ishlatiladi.
Timeout failure xabari oxirgi actual holatni ko‘rsatishi kerak.
Fluent assertion
Ba’zi kutubxonalar chained, o‘qilishi qulay sintaksis beradi:
expect(order).to be_paid and have_total(100)
Fluent API failure xabarini boyitishi mumkin. Juda ko‘p custom DSL esa yangi developer uchun yashirin qoidalar yaratadi.
Bog‘liq tushunchalar
Assertion, Expected value, Actual value, Test failure, Exception assertion, Snapshot testing, Soft assertion, Invariant, Unit testing, Property-based testing