Özellik Tabanlı Test
- İngilizcesi
- Property-Based Testing
- Okunuşu
- propırti beyst testing
Kısaca
Özellik tabanlı test, elle yazılmış birkaç örnek yerine otomatik üretilen çok sayıda girdi için bir kuralın geçerli olduğunu kontrol eder.
Özellik tabanlı test nedir?
Özellik tabanlı test, her geçerli girdi için doğru olması gereken bir kuralı, yani bir özelliği (property) tanımladığınız ve bir kütüphanenin onu bozmak için yüzlerce girdi ürettiği bir tekniktir. Tipik özellikler, bir listeyi iki kez tersine çevirmenin özgün listeyi geri vermesi ya da sıralanmış çıktının düzenli olması ve girdiyle aynı öğeleri içermesidir. Yaklaşım, 2000 civarında Haskell için QuickCheck ile başladı ve artık çoğu dilde mevcut.
Çerçeveye tamsayılar, dizeler ya da kullanıcı kayıtlarından oluşan listeler gibi ne tür girdiler üreteceğini söylersiniz ve çerçeve testi rastgele verilerle çok kez çalıştırır. Üreteçler bilerek boş listeler, sıfır, negatif sayılar, çok uzun dizeler ve alışılmadık Unicode karakterleri gibi zor uç durumları da içerir. Bir hata ortaya çıktığında çerçeve girdiyi küçültür (shrink); yani hâlâ başarısız olan en küçük duruma gelene kadar adım adım basitleştirir, böylece 200 öğeli bir liste yerine [0, -1] ile hata ayıklarsınız.
Bir kilidi, sahip olduğunuz üç anahtarı denemek yerine, birini binlerce garip şekilli anahtar denetmek ve onu açan en basit olanı bildirmesini istemeye benzer. Özellik tabanlı test özellikle, kodlanmış bir değerin çözülmesinin özgün değeri vermesi gereken ayrıştırıcılar ve serileştiriciler için, ayrıca sıralama, matematik, veri dönüşümleri, saf fonksiyonlar ve optimize edilmiş bir uygulamayı basit bir referans uygulamayla karşılaştırmak için iyi çalışır.
Özellik tabanlı test sıklıkla fuzz testiyle karıştırılır. İkisi de girdileri otomatik üretir, ancak fuzzing genellikle çökmeleri ve güvenlik açıklarını bulmak için bir programa saatlerce çok miktarda rastgele ya da bozuk veri yağdırır; özellik tabanlı test ise normal test takımında hızlı çalışır ve belirli doğruluk kurallarını kontrol eder. Örnek tabanlı birim testlerinin yerini almaz, onları tamamlar; çünkü net örnekler beklenen davranışın hâlâ en iyi belgesidir.
Önemli noktalar
- Tek bir beklenen çıktıyı değil, tüm geçerli girdiler için geçerli olması gereken bir kuralı belirtirsiniz.
- Çerçeve, zor uç durumlar dahil çok sayıda girdi üretir.
- Başarısız girdiler, hâlâ başarısız olan en küçük örneğe kadar küçültülür.
- decode(encode(x)) == x gibi gidiş-dönüş özellikleri klasik bir başlangıç noktasıdır.
- Doğruluk kurallarını kontrol eder; fuzzing ise esas olarak çökmeleri arar.
Örnek
import json
from hypothesis import given, strategies as st
# Property: turning a dict into JSON and back must give the same dict.
# The library generates hundreds of dicts, including empty and unusual ones,
# and shrinks any failing input to the smallest example.
@given(st.dictionaries(keys=st.text(), values=st.integers()))
def test_json_round_trip(data):
assert json.loads(json.dumps(data)) == dataSık sorulan sorular
Özellik tabanlı testte özellik (property) nedir?
Özellik, bir sıralamanın çıktısının girdisiyle aynı uzunlukta olması gibi her geçerli girdi için doğru olması gereken bir ifadedir. Test, bu ifadeyi üretilmiş çok sayıda girdiye karşı kontrol eder.
Shrinking nedir?
Shrinking, çerçevenin başarısız bir girdiyi alıp öğeleri kaldırarak ya da sayıları küçülterek, hâlâ başarısız olan minimal girdiyi bulana kadar tekrar tekrar basitleştirdiği adımdır. Bu, hatayı anlamayı çok kolaylaştırır.
İlgili sayfalar
- Birim TestiTest ve Kalite, s. 4Birim testi, bir fonksiyonun, metodun ya da sınıfın programın geri kalanından yalıtılmış olarak doğru davrandığını doğrulayan küçük ve otomatik bir kontroldür.
- Fuzz TestiTest ve Kalite, s. 9Fuzz testi, çökmeleri, takılmaları ve güvenlik açıklarını bulmak için bir programa çok sayıda beklenmedik ya da bozuk girdi veren otomatik bir tekniktir.
- Saf fonksiyonProgramlamanın Temelleri, s. 47Saf fonksiyon, aynı girdi için her zaman aynı çıktıyı döndüren ve yan etkisi olmayan, yani kendi dışındaki hiçbir şeyi değiştirmeyen fonksiyondur.
- Mutasyon TestiTest ve Kalite, s. 17Mutasyon testi, koda küçük kasıtlı hatalar ekleyip testlerin her birini yakalayarak başarısız olup olmadığına bakarak bir test takımının kalitesini ölçer.
- AssertionTest ve Kalite, s. 2Assertion, kodun o noktasında bir koşulun doğru olması gerektiğini bildiren ve koşul yanlışsa testi ya da programı bir hatayla durduran ifadedir.
- SerileştirmeBackend ve API'ler, s. 42Serileştirme, bellekteki veri yapılarını JSON ya da bayt gibi bir biçime dönüştürme işlemidir; böylece veriler saklanabilir veya ağ üzerinden gönderilebilir.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin