# Özellik Tabanlı Test

Adres: https://softwaredictionary.org/tr/terimler/property-based-testing
Kategori: Test ve Kalite
Son güncelleme: 2026-09-30
İ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: Python'ın Hypothesis kütüphanesiyle test edilen gidiş-dönüş özelliği

```python
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)) == data
```

## Sı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.

---

Software Dictionary: https://softwaredictionary.org/tr · https://softwaredictionary.org/tr/llms.txt
