1 puan yazan GN⁺ 2024-07-06 | 1 yorum | WhatsApp'ta paylaş
  • Özellik tabanlı test, 30 yıl içinde ana akım haline gelen nadir akademik araştırma örneklerinden biri.
  • "Test yazma, üret" sloganı altında çeşitli programlama dili topluluklarında destek gördü.
  • Aslen bir Haskell kütüphanesi olan QuickCheck'in Wikipedia sayfasında, diğer diller için 57 yeniden uygulama listeleniyor.

Özellik tabanlı test kütüphaneleri incelemesi

  • Bugün en çok kullanılan özellik tabanlı test kütüphaneleri incelenerek 15 yıl önceki (2009) son teknolojiyle karşılaştırılıyor.
  • Kütüphanelerin çoğu, en gelişmiş özellik tabanlı test yeteneklerini sunmuyor.

Özellik tabanlı test kütüphaneleri neden bu kadar üzücü bir durumda?

Durum tabanlı ve paralel testler, saf testler kadar kullanışlı değil

  • Durum tabanlı modelleme eğitim gerektiriyor.
  • Kapalı kaynağın, kurumsal benimsemeye yardımcı olduğu iddiası.

Durum tabanlı modelleme eğitim gerektiriyor

  • Durum tabanlı ve paralel testler, genel testlerden farklı bir düşünme biçimi gerektiriyor.
  • Bu araçlar yeni kullanıcılara sunulurken uygun eğitim gerekiyor.

Kapalı kaynağın kurumsal benimsemeye yardımcı olduğu iddiası

  • Açık kaynağın işe yaramadığı, kapalı kaynak ürünler ve ilgili hizmetlerin benimsemeyi kolaylaştırdığı iddia ediliyor.

Yapabileceklerimiz

  • Durum tabanlı ve paralel özellik tabanlı testler için kısa açık kaynak uygulamalar sunmak.
  • Geliştiricilerin daha az eğitime ihtiyaç duyması için biçimsel belirtim kısmını daha kolay hale getirmek.

Saf özellik tabanlı test özeti

  • Yeni bir fonksiyonu ya da özelliği test etmek iyi bir pratik olarak görülüyor.
  • Örneğin, bağlı listeyi tersine çeviren reverse fonksiyonunu yazdıysanız, boş liste gibi birkaç liste üzerinde test yapmak mantıklı olur.
  • Rastgele girdi üretmek, özellik tabanlı testin temel işlevlerinden biri.
  • Fikir şu: rastgele girdiler sonunda köşe durumları da bulacaktır.

Durum tabanlı özellik testleri

  • Durum tutan bileşenler test edilirken aynı girdi her zaman aynı çıktıyı vermez.
  • Durum tabanlı testte, sistemin zaman içinde nasıl değiştiğini sınamak için girdi dizileri üretilir.
  • Bellek içi bir referans uygulama (model) kullanılarak durum açıkça tanımlanır.

Örnek: sayaç

  • Sayaç, global değiştirilebilir bir değişken kullanılarak uygulanır.
  • Model bir tamsayı olarak ifade edilir.
  • Test, komut dizileri üretip çalıştırarak gerçek çıktıyla model çıktısını karşılaştırır.

Paralel özellik tabanlı testler

  • Paralel testler, yarış durumlarını tespit etmek için durum tabanlı test modelini yeniden kullanır.
  • Paralel testler, doğrusal hale getirilebilirlik üzerinden paralel testi yürütmek için sıralı durum makinesi modelini kullanır.

Sonuç ve gelecekteki çalışmalar

  • Özellik tabanlı testlerin durumunu iyileştirmek için açık kaynak uygulamalar sunmak ve biçimsel belirtimleri daha kolay hale getirmek gerekiyor.

GN⁺ görüşü

  • Bu yazı, özellik tabanlı testin tarihini ve mevcut durumunu iyi açıklıyor.
  • Durum tabanlı ve paralel testlerin önemini vurgularken açık kaynak uygulamalara duyulan ihtiyacı da ortaya koyuyor.
  • Özellik tabanlı testi daha erişilebilir hale getirmenin yollarını öneriyor.
  • Benzer işlevlere sahip diğer projeler arasında Hypothesis(Python) ve PropEr(Erlang) bulunuyor.
  • Yeni bir teknolojiyi ya da açık kaynağı benimserken eğitim ve desteğin gerekli olduğunu vurguluyor.

1 yorum

 
GN⁺ 2024-07-06
Hacker News görüşleri
  • clojure.spec.alpha ve test.check kullanma deneyimi iyiydi
    • Python'daki hypothesis, büyük veri kümelerini işleyemediği için kullanmayı bıraktım
  • Go dilinde kapsam tabanlı fuzzing iyi destekleniyor
    • Fuzzing testleri ve değişmezlik kontrolleriyle özellik testiyle benzer sonuçlar elde edilebilir
  • Araştırma makalelerinin açık kaynak araçlarla yeniden üretilebilir olması gerektiği yönündeki talep, faydalı bilgilerin kaybolmasına yol açabilir
  • Rust'ta proptest kullanarak sık sık durum tabanlı özellik testleri yazıyorum
    • Paralel testler bazen faydalı olsa da, birden fazla testi paralel çalıştırmak daha kolay olabilir
  • Quviq QuickCheck makalesini okudum, ancak durum tabanlı testleri doğrudan yazmak daha iyi olabilir
    • StateModel, ek framework kodu gerektirdiği için verimli değil
  • Durum makineleri ve paralel yönlerin yanı sıra, kapsam tabanlı özellik testleri daha büyük etki yaratabilir
    • Otomatik küçültme özelliğini korurken değer üretimi sırasında tüm değişmezlikleri korumak önemli
    • Hypothesis'in "içsel küçültme" yaklaşımı en etkili olanı
  • Clojure için de durum tabanlı bir QuickCheck kütüphanesi var
    • Paralel testler henüz büyük bir sorun değil
  • Özellik tabanlı testler, sıkı testler yazılabildiğinde tip sistemine entegre edilse daha iyi olur
    • Basit "smoke test"ler için rastgele girdi kullanmak daha kolay
  • QuviQ Erlang QuickCheck'in ücretsiz sürümü olan QuickCheck Mini de var
  • JavaScript'te özellik tabanlı test kütüphaneleriyle belirli koşulları sağlamayan rastgele değerler üretmenin mümkün olup olmadığını merak ediyorum