parametrize
- Python kursu
- İleri seviye
- Ders 16/83
- 5 dk
@pytest.mark.parametrize ile parametreli testleri öğrenirsin.
parametrize
@pytest.mark.parametrize, aynı testi farklı verilerle çalıştırır. Tek bir test fonksiyonu, birden çok giriş için otomatik yinelenir.
import pytest
@pytest.mark.parametrize("a,b,expected", [
(1, 2, 3),
(10, 5, 15),
(-1, 1, 0),
])
def test_add(a, b, expected):
assert add(a, b) == expectedBu biçimde her üçlü için ayrı bir test çalışır. Herhangi biri başarısız olursa pytest hangi verinin hataya yol açtığını gösterir. Veri güdümlü (data-driven) test için idealdir.
Veri güdümlü test
parametrize ile çok sayıda üç durumu tek bir testte toplarsın. Her satır bir test verisi; ilk dize parametre adlarını, liste ise veri demetlerini içerir.
Örnek: "n,expected" adlarıyla [(0, 0), (1, 1), (5, 25)] verirsen, test üç kez çalışır; her seferinde n ve expected değerleri bağlanır.
Bu yaklaşım, tekrarlanan test fonksiyonları yazmaktan kurtarır; tek bir hata tüm veriyi gösterir.
Uygulama parametrize ile square testi
square(n) fonksiyonu n * n döndürsün. test_square fonksiyonunu @pytest.mark.parametrize ile süsle; ilk dize "n,expected", ikinci argüman [(2, 4), (3, 9), (4, 16)]. Test gövdesi assert square(n) == expected içersin. Dosya sonunda test_square'ı tek tek verilerle çağır: test_square(2, 4); test_square(3, 9); print("ok").
Başlangıç kodu
import pytest
# square(n): n değerinin karesini döndür
# test_square: parametrize ile iki veri kullan
# test gövdesinde square(n) ile expected değerini karşılaştır
# son olarak test_square(2, 4); test_square(3, 9); print("ok")Örnek çözüm
import pytest
def square(n):
return n * n
@pytest.mark.parametrize("n,expected", [(2, 4), (3, 9), (4, 16)])
def test_square(n, expected):
assert square(n) == expected
test_square(2, 4)
test_square(3, 9)
print("ok")Beklenen çıktı
ok
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 parametrize decorator'ünü ekle
import pytest
@____("a,b,expected", [(1, 2, 3), (10, 5, 15)])
def test_add(a, b, expected):
assert add(a, b) == expected
import pytest
@pytest.mark.parametrize("a,b,expected", [(1, 2, 3), (10, 5, 15)])
def test_add(a, b, expected):
assert add(a, b) == expected
Açıklama: pytest.mark.parametrize decorator'ü veri güdümlü test için kullanılır.
2 parametrize parçalarını eşleştir
| Kavram | Anlamı |
|---|---|
"a,b,expected" |
Parametre adları |
(1, 2, 3) |
Bir test verisi |
@pytest.mark.parametrize |
Testi yineler |
def test_add(a, b, expected) |
Test imzası |
3 parametrize'in ilk dize argümanı neyi belirtir?
- Test fonksiyonunun adını
- Beklenen çıktıyı
- Modül adını
- Parametre adlarını (virgülle ayrılmış) Doğru cevap
Açıklama: İlk dize parametre adlarını listeler; veri demetleri bu sırayla bağlanır.