Bosh sahifa Wiki Assertion

Assertion

Assertiontest 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:

  1. sharoit tayyorlanadi;
  2. action bajariladi;
  3. 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:

  • exact equality;
  • contains;
  • starts with;
  • regex;
  • normalized equality;
  • multiline diff

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