Property test
- Dart kursu
- Uzman
- Ders 38/47
- 5 dk
Property-based testing öğrenirsin.
Property test
Property-based testing, rastgele girdilerle değişmezleri (invariant) kontrol eder. Sabit bir girdi yerine, 100+ rastgele değer üretilip özellik sınanır.
Örnek: toplama işlemi için değişmez a + b == b + a (değişmeli). Her rastgele a ve b için bu doğrulanır. Bir karşı örnek bulunursa test başarısız olur.
Başarısızlıkta araç, en küçük karşı örneği bulmaya çalışır (shrinking). Örn. [3, -1, 2] yerine [0, -1]'e küçültür. Bu, hatanın kaynağını bulmayı kolaylaştırır.
Değişmez örneği
Yaygın bir değişmez: sort(sort(list)) == sort(list) (idempotent). Yani bir liste bir kez sıralandıktan sonra tekrar sıralamak değiştirmez.
Başka örnek: reverse(reverse(list)) == list (tersine çevirme ters çevirme). Her rastgele liste için bu doğrulanır.
Property test, bu değişmezleri 100+ rastgele girdiyle sınar. Bir tanesi bile başarısız olursa test düşer ve karşı örnek raporlanır.
Uygulama Sıralama değişmezini sına
Bir List<int> sortList(List<int> input) fonksiyonu tanımla: final out = List<int>.from(input)..sort(); return out;. Bir bool isSorted(List<int> list) fonksiyonu tanımla: for (var i = 1; i < list.length; i++) { if (list[i - 1] > list[i]) return false; } return true;. main içinde final lists = [[3, 1, 2], [5, 4, 6], [9, 7, 8]]; tanımla; var pass = true;; her liste için if (!isSorted(sortList(list))) pass = false; çağır; sonunda print(pass ? 'PASS: idempotent' : 'FAIL'); ekle.
Başlangıç kodu
void main() {
// sortList fonksiyonunu tanımla (kopyala ve sırala)
// isSorted fonksiyonunu tanımla (artan sırada mı)
// birkaç listeyi sına; hepsi sıralıysa PASS yazdır
}Örnek çözüm
List<int> sortList(List<int> input) {
final out = List<int>.from(input)..sort();
return out;
}
bool isSorted(List<int> list) {
for (var i = 1; i < list.length; i++) {
if (list[i - 1] > list[i]) return false;
}
return true;
}
void main() {
final lists = [
[3, 1, 2],
[5, 4, 6],
[9, 7, 8],
];
var pass = true;
for (final list in lists) {
if (!isSorted(sortList(list))) pass = false;
}
print(pass ? 'PASS: idempotent' : 'FAIL');
}Beklenen çıktı
PASS: idempotent
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Deneme sayısı
for (var i = 0; i < ____; i++) { check(random()); }
for (var i = 0; i < 100; i++) { check(random()); }
Açıklama: property test tipik olarak 100 deneme yapar.
2 Property test neyi kontrol eder?
- Tek bir sabit değeri
- Yalnızca null durumu
- Rastgele girdilerde değişmezleri Doğru cevap
- Yalnızca boş listeyi
Açıklama: property test rastgele girdilerle değişmezleri sınar.
3 Property test parçalarını eşleştir
| Kavram | Anlamı |
|---|---|
property |
Değişmez |
generator |
Rastgele üretici |
forAll |
Tümü için |
shrink |
Başarısız küçültme |