PyTest ile Birim Testleri: 5 Pratik Örnek ve İpuçları
Yazılım Test ve Hata Ayıklama
PyTest ile Birim Testleri: 5 Pratik Örnek ve İpuçları

PyTest ile Birim Testlerine Giriş
PyTest, Python için güçlü ve esnek bir test çerçevesidir. Basit birim testlerinden karmaşık entegrasyon testlerine kadar kullanılabilir ve okunabilir test yazımını teşvik eder. Resmi belgeler, PyTest'in söz dizimi ve temel davranışlarına dair kapsamlı rehberlik sunar ve test fonksiyonlarının genellikle "test_" ile başladığını ve standart assert ifadelerinin yeterli olduğunu belirtir.
Daha fazla ayrıntı için PyTest'in resmi başlangıç sayfasına bakabilirsiniz: https://docs.pytest.org/en/stable/getting-started.html ve genel tanım için https://docs.pytest.org/en/7.0.x/.
Hızlı Kurulum ve İlk Test
Kurulum genellikle pip ile yapılır. Bir proje dizininde aşağıdaki komut test çalıştırmaya başlamanız için yeterlidir:
pip install pytest
Basit bir örnek dosya yapısı ve ilk test:
# calc.py
def add(a, b):
return a + b
# test_calc.py
from calc import add
def test_add():
assert add(2, 3) == 5
Testleri çalıştırmak için proje kökünde pytest veya daha kısa çıktı için pytest -q komutunu kullanabilirsiniz. PyTest test isimlendirme kuralları ve çalıştırma davranışı hakkında resmi bilgiye başlangıç rehberinden ulaşabilirsiniz.
5 Pratik Örnek
1. Basit Fonksiyon Testi
En temel seviye, küçük bir fonksiyonun beklenen sonucu döndürdüğünü sınamaktır. Yukarıdaki add örneği tipik bir basit birim testidir. Test fonksiyonunun adı "test_" ile başlamalıdır ve PyTest, standart assert ifadelerini daha açıklayıcı hata çıktılarıyla yeniden işler.
2. Fixture ile Ortak Veri ve Kaynak Yönetimi
Fixture'lar testler için tekrar kullanılabilir veri veya kaynak sağlar. Fixture tanımlamaları sayesinde setup/teardown mantığını merkezi hale getirebilirsiniz. Ayrıntılar için resmi belgelerin fixture bölümüne bakın: https://docs.pytest.org/en/7.1.x/explanation/fixtures.html.
# test_sample.py
import pytest
@pytest.fixture
def sample_data():
return { 'a': 1, 'b': 2 }
def test_sample_sum(sample_data):
assert sample_data['a'] + sample_data['b'] == 3
Bu yaklaşımla aynı sample_data fixture'ını birden fazla testte kullanabilir, veri oluşturma/temizleme işini tek bir yerde yönetebilirsiniz.
3. Parametrik Testler ile Tekrarı Azaltma
Benzer testleri tekrar yazmak yerine @pytest.mark.parametrize kullanarak çeşitli girdilerle aynı testi çalıştırabilirsiniz. Parametrizasyon, test bakım yükünü azaltır ve bir fonksiyonun birden fazla durum için davranışını hızlıca kontrol etmenizi sağlar. Resmi rehber: https://docs.pytest.org/en/stable/how-to/parametrize.html.
# test_calc_param.py
import pytest
from calc import add
@pytest.mark.parametrize('a,b,expected', [
(1, 2, 3),
(0, 0, 0),
(-1, 1, 0),
])
def test_add_param(a, b, expected):
assert add(a, b) == expected
4. İstisna Testleri (Exception Testing)
Bazen bir fonksiyonun belirli girdilerde istisna fırlatması beklenir. PyTest'in raises bağlam yöneticisi bu durumu doğrulamak için kullanılır.
# test_divide.py
import pytest
def divide(a, b):
return a / b
def test_divide_zero():
with pytest.raises(ZeroDivisionError):
divide(1, 0)
Bu test, divide(1, 0) çağrısının ZeroDivisionError fırlatmasını bekler ve exception doğrulaması yapar.
5. Komut Satırı ile Test Çalıştırma ve unittest Uyumluluğu
PyTest güçlü komut satırı seçenekleri sunar; belirli testleri seçme, çıktı seviyesini ayarlama ve hata yakalama davranışını değiştirme gibi yetenekler günlük hata ayıklamada çok faydalıdır. Resmi kullanım bilgileri: https://docs.pytest.org/en/7.1.x/usage.html.
# Sık kullanılan örnekler
pytest -q # kısa çıktı
pytest -k add # adı 'add' geçen testleri çalıştır
pytest tests/test_calc.py::test_add # tek bir testi çalıştır
pytest -x # ilk hatada dur
pytest -s # çıktı yakalamayı kapat (printleri gör)
Ayrıca PyTest, unittest tabanlı testleri çalıştırabilir; mevcut unittest testlerini PyTest ile çalıştırmak mümkündür. Ayrıntılar için: https://docs.pytest.org/en/7.1.x/how-to/unittest.html.
İpuçları ve En İyi Uygulamalar
- Test adlandırması: Fonksiyon isimlerini anlamlı yazın ve "test_" ile başlayın; bu PyTest'in testleri keşfetmesini sağlar.
- Küçük ve izole testler: Her test tek bir davranışı doğrulasın. Böylece başarısızlık nedenini izole etmek kolaylaşır.
- Fixture kullanımı: Ortak setup/teardown kodunu fixture'larda toplayın; tekrar eden kodları azaltır.
- Parametrize kullanın: Aynı mantık için farklı girdiler test edilecekse parametrizasyon hem okunabilirliği hem de bakımı iyileştirir.
- Hızlı çalıştırma: Testleri sürekli ve sık çalıştırın; küçük testler hızlı geri bildirim sağlar.
Hata Ayıklama Adımları
- İlk olarak ilgili testi tek başına çalıştırın (örneğin:
pytest tests/test_foo.py::test_bar -q). - Çıktıyı detaylandırmak için
-vveya yakalamayı kapatmak için-skullanın. - Hata durumunu izole etmek için fixture ve girdi değerlerini kontrol edin.
- Gerekirse test içindeki print/log ifadelerini gözlemleyin veya adım adım yeniden üretin.
Test Yazma Kontrol Listesi
- Test isimleri açık ve açıklayıcı mı?
- Her test tek bir davranışı kontrol ediyor mu?
- Ortak hazırlık kodu fixture'larda mı?
- Parametrizasyon ile gereksiz tekrar azaltıldı mı?
- Testler hızlı mı ve sürekli entegre (CI) pipeline'ına uygun mu?
Sınırlamalar ve Son Notlar
Unit testler yazılım kalitesini artırır fakat tek başına tüm hataları önlemez; kapsamlı test stratejileri (birim, entegrasyon, e2e) ile desteklenmelidir. Bu yazıda sunulan örnekler öğreticidir; projeye özgü durumlarda fixture ve test yapısını proje gereksinimlerine göre genişletin. Detaylı ve güncel bilgiler için PyTest resmi belgelerine başvurun: https://docs.pytest.org/en/stable/getting-started.html.