CodeBlanks Logo Icon CodeBlanks

Property test

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

main.dart
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

main.dart
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ı

Soru
for (var i = 0; i < ____; i++) { check(random()); }
Cevap
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

Uzman bölümündeki tüm dersler