وقتی تست برای یک حالت خاص برنامه مینویسیم خیلی وقت ها بعضی شرایط خاص را در نظر نمی گیریم و با اینکه تمام تست ها pass می شوند, باگ در برنامه حضور داره.
یکی از راه های کم تر کردن این سناریو و تقویت تست ها استفاده از تست خواص یا Property Based Testing هستش. این متود اولین بر توسط John Hughes در برنامه QuickCheck
در زبان هسکل پیاده شد و بعد در زبان های دیگه کتابخانه های شبیه ساخته شد
در Property Based Testing ما فقط شرح میدیم که ورودی و خروجی چه خواصی دارند و کتابخانه به صورت اتوماتیک ورودی های تصادفی می سازه و بارها function را تست میکنه تا بتونه یک مثال نقض پیدا کنه
مثال اسکالا
object StringSpecification extends Properties("String") {
property("concatenate") = forAll { (a: String, b: String) =>
(a+b).length > a.length && (a+b).length > b.length
}
}
خروجی
+ String.startsWith: OK, passed 100 tests.
! String.concat: Falsified after 0 passed tests.
> ARG_0: ""
> ARG_1: ""
+ String.substring: OK, passed 100 tests.
اینجا وقتی دو string خالی باشند شرط ما نقض میشه