CodeBlanks Logo Icon CodeBlanks

parametrize

@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) == expected

Bu 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

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

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

Soru
import pytest

@____("a,b,expected", [(1, 2, 3), (10, 5, 15)])
def test_add(a, b, expected):
    assert add(a, b) == expected
Cevap
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.

İleri seviye bölümündeki tüm dersler