Bosh sahifa Wiki Property-based testing

Property-based testing

Property-based testing — test muallifi alohida misollar ro‘yxatini yozish o‘rniga, kirish ma’lumotlari generatori va barcha yaroqli kirishlarda bajarilishi kerak bo‘lgan property’larni belgilaydigan testlash usuli. Framework ko‘plab turli qiymatlarni yaratadi, property buzilsa failure keltirgan misolni kichraytirishga harakat qiladi.

Generator va property

Generator domain’ga mos input ishlab chiqaradi. Butun son, Unicode matn, daraxt, API command ketma-ketligi yoki bir-biriga bog‘liq obyektlar generatsiya qilinishi mumkin. Property natijaning universal xususiyatini ifodalaydi.

@given(lists(integers()))
def test_sort_properties(values):
    result = sorted(values)
    assert result == sorted(result)
    assert Counter(result) == Counter(values)

Birinchi property natija idempotent saralanganini, ikkinchisi elementlar yo‘qolmagan yoki qo‘shilmaganini tekshiradi. Faqat len tengligi duplicate va almashtirish xatosini topmasligi mumkin.

Property turlari

Property Misol
Invariant Balans ruxsat etilgan chegarada
Round-trip decode(encode(x)) == x
Idempotency normalize(normalize(x)) == normalize(x)
Commutativity a + b == b + a mos operatsiyada
Metamorphic Inputga element qo‘shilsa count bittaga oshadi
Model comparison Soddaroq reference model bilan tenglik

Algebraik nom faqat operatsiya uchun haqiqiy bo‘lsa ishlatiladi. Floating-point qo‘shish qat’iy associative emas; noto‘g‘ri property sog‘lom kodni yiqitadi.

Shrinking

Random katta input failure bersa uni tushunish qiyin. Shrinker xatoni saqlagan holda listni qisqartiradi, sonni nolga yaqinlashtiradi yoki command ketma-ketligini kamaytiradi. Yakunda [0, -1] kabi minimal counterexample olinishi mumkin.

Custom generator custom shrink bilan uyg‘un bo‘lishi kerak. Shrinking yaroqsiz domain obyektlar yaratib yuborsa failure asl property emas, validatsiya sabab bo‘ladi. Framework compositional generatorlardan avtomatik shrink hosil qilishi mumkin.

Tasodif va reproducibility

Framework pseudo-random seed ishlatadi. Failure report seed va minimal misolni saqlaydi; CI xatosi lokal muhitda qayta bajariladi. Faqat seedga tayanmasdan counterexample regression testga explicit qo‘shilishi ham mumkin.

Testlar butunlay tasodifiy sampling bilan correctness isbotlamaydi. Case distribution generatorga bog‘liq. Edge case, null, juda uzun input va maxsus Unicode qiymatlar uchun weighted strategy yoki explicit example qo‘shiladi.

Precondition va filtr

assume yoki filter faqat domain preconditionini cheklaydi. Generator ko‘p yaroqsiz qiymat chiqarib, ularning 99,9 foizini rad etsa test sekin va qamrovi yomon bo‘ladi. Constraintni to‘g‘ridan-to‘g‘ri qanoatlantiradigan generator tuziladi.

Masalan, start <= end interval uchun ikki mustaqil son yaratib filtrlash o‘rniga start va non-negative length generatsiya qilinadi. Bu shrinkingni ham mazmunli qiladi.

Stateful testing

State machine modeli commandlar, precondition va expected transitionlarni belgilaydi. Framework create, update, delete, read kabi ketma-ketliklarni generatsiya qiladi va har qadamdan keyin real tizimni model bilan solishtiradi. Oddiy misolda topilmaydigan ketma-ketlik xatolari shu usulda chiqadi.

Tashqi tizim bilan test izolyatsiyalangan resurs va deterministic cleanup talab qiladi. Minglab command production APIga yuborilmaydi; lokal yoki test muhit ishlatiladi.

Chegaralari

Property noto‘g‘ri yoki kuchsiz bo‘lsa ko‘p input hech narsani isbotlamaydi. result is not None deyarli har noto‘g‘ri natijani o‘tkazadi. Example-based test aniq biznes ssenariy va tushunarli hujjat sifatida baribir zarur.

Property-based test generative fuzzingga yaqin, lekin asosiy urg‘u crash topishdan tashqari semantik invariantga qaratiladi. Security fuzzing coverage va malformed byte’ga ko‘proq e’tibor berishi mumkin; ikki usul birga ishlaydi.

Bog‘liq tushunchalar

Invariant, Generator, Shrinking, Fuzz testing, Metamorphic testing, Model-based testing, Parametrized testing