Bir fonksiyon yazdığınızda akla gelen ilk soru şudur: "Bu kod her zaman doğru çalışıyor mu?" İşte bu sorunun güvenilir cevabı birim test yazmaktan geçer ve Python dünyasında bu işi en sade şekilde yapmanın yolu pytest kullanmaktır. Kısaca anlatmak gerekirse: bir fonksiyon yazarsınız, ayrı bir dosyada test_ önekiyle başlayan küçük bir fonksiyon içinde assert ile beklediğiniz sonucu gerçek sonuçla karşılaştırırsınız, ardından pytest bu dosyayı otomatik bulup çalıştırır ve size sonucu raporlar.
Bu yaklaşımın en güzel yanı, testin bir yük değil, kod yazarken elinizi güvende tutan bir alışkanlık olmasıdır. Aşağıdaki bölümlerde bu mantığı sıfırdan, adım adım kuracağız.
Bir Fonksiyonun Doğru Çalıştığından Nasıl Emin Oluruz?
Bir fonksiyon yazdıktan sonra genellikle yapılan ilk şey, onu bir kez çalıştırıp ekrana yazdırılan sonuca göz atmaktır. Örneğin bir sepetin toplam tutarını hesaplayan bir fonksiyon yazdığınızı düşünün: birkaç ürün fiyatını topluyor, üzerine belki bir indirim uyguluyor. Fonksiyonu bir kez çağırıp sonucu print() ile ekrana bastığınızda "5 lira çıktı, doğru görünüyor" diyip geçebilirsiniz. Ancak bu kontrol, sadece o anki tek bir senaryo için geçerlidir.
Sorun şu ki, gerçek hayattaki fonksiyonlar tek bir durumla sınırlı kalmaz. Sepet boş olabilir, indirim yüzdesi sıfır olabilir, fiyatlardan biri negatif girilmiş olabilir. Manuel kontrol yönteminde her yeni durumu test etmek için kodu yeniden çalıştırıp çıktıyı gözle kontrol etmeniz gerekir. Kodunuz büyüdükçe, aynı fonksiyonu başka bir yerde küçük bir değişiklik yaptıktan sonra tekrar elle kontrol etmeniz gerektiğinde bu süreç hem yorucu hem de güvenilmez hâle gelir. İnsan gözü, tekrarlanan aynı işlemde küçük hataları gözden kaçırmaya son derece yatkındır.
İşte tam bu noktada devreye test kavramı girer. Test, bir fonksiyonun belirli bir girdi için hangi çıktıyı üretmesi gerektiğini önceden yazılı hâle getirip, bu beklentiyi otomatik olarak kontrol eden küçük bir kod parçasıdır. Sepet örneğine dönersek: "üç ürünlü bir sepette toplam şu olmalı" cümlesini bir defa yazarsınız ve bu kontrolü istediğiniz kadar, istediğiniz an, insan hatasına yer bırakmadan tekrar çalıştırabilirsiniz. Fonksiyonda küçük bir değişiklik yaptığınızda, o değişikliğin beklenen davranışı bozup bozmadığını saniyeler içinde öğrenirsiniz. Bu, kod yazarken "acaba bir şeyi bozdum mu?" kaygısını azaltan, güven veren bir alışkanlıktır. Test yazmayı öğrenmek, aslında kodunuzla daha sağlam bir ilişki kurmayı öğrenmektir; ilerleyen bölümlerde bu ilişkiyi pytest ile nasıl kurduğumuzu göreceğiz.
pytest Nedir ve Neden Kullanılır?

pytest, Python ekosisteminde yaygın olarak kullanılan, açık kaynak bir test çerçevesidir. Herhangi bir şirkete veya kursa bağlı olmayan, topluluk tarafından geliştirilen ve Python ile yazılmış projelerde fonksiyonların, sınıfların ve modüllerin beklenen şekilde çalışıp çalışmadığını otomatik olarak kontrol etmek için tasarlanmış bağımsız bir araçtır. Sektörde küçük ölçekli kişisel projelerden büyük yazılım ekiplerine kadar geniş bir kullanım alanına sahiptir çünkü test yazmayı olabildiğince sade bir söz dizimine indirger.
Manuel test ile otomatik test arasındaki fark, aslında zaman ve güvenilirlik farkıdır. Manuel kontrolde her değişiklik sonrası kodu tekrar çalıştırıp çıktıyı gözle karşılaştırırsınız; bu hem zaman alır hem de dikkat dağınıklığına açıktır. pytest ile yazılan bir test ise bir kez yazılır ve sonrasında tek bir komutla, saniyeler içinde, hatasız biçimde tekrar tekrar çalıştırılabilir. Bir proje büyüdükçe, onlarca fonksiyonun her birini elle kontrol etmek pratik olarak mümkün olmaktan çıkar; pytest bu kontrolü sizin yerinize otomatikleştirir ve sonucu net bir raporla önünüze koyar.
Burada önemli bir noktayı netleştirmek gerekir: pytest bir eğitim programı ya da kapalı bir sistem değildir, herkesin kullanabildiği bağımsız bir araçtır. Bu aracı doğru şekilde öğrenmek isteyenler için Python öğrenimine dair güncel yazılar takip etmek, temel kavramları pratik örneklerle görmenin faydalı bir yolu olabilir. Testin mantığını bir kez içselleştirdiğinizde, hangi projede çalışırsanız çalışın aynı disiplini uygulayabilirsiniz; çünkü öğrenilen şey bir araç değil, bir düşünme biçimidir. Sonraki bölümlerde bu aracı bilgisayarınıza nasıl kuracağınızı ve ilk testinizi nasıl yazacağınızı adım adım göreceksiniz.
pytest Kurulumu: Adım Adım
pytest'i kullanmaya başlamak için karmaşık bir yapılandırmaya gerek yoktur; Python'ın paket yöneticisi pip üzerinden tek bir komutla kurulur. Kurulumdan önce bilgisayarınızda çalışan bir Python ortamının bulunması ve tercihen bu ortamın bir sanal ortam (virtual environment) içinde olması, projeler arası paket karışıklığını önlemek açısından önerilir.
Kurulum sürecini şu şekilde sıralayabiliriz:
- Terminali veya komut satırını açın ve çalışmak istediğiniz proje klasörüne geçin.
- Mümkünse önce bir sanal ortam oluşturup etkinleştirin; bu, pytest'in yalnızca ilgili proje kapsamında kurulmasını sağlar.
pip install pytestkomutunu çalıştırarak pytest paketini ve bağımlılıklarını yükleyin.- Kurulumun tamamlanmasını bekleyin; pip işlemin sonunda kurulan paketleri listeleyerek işlemin başarılı olduğunu bildirir.
Kurulumun gerçekten tamamlandığından emin olmak için terminale pytest --version yazmanız yeterlidir. Bu komut çalıştırıldığında pytest'in yüklü olduğunu doğrulayan bir çıktı görürsünüz; eğer bu komut "böyle bir komut bulunamadı" gibi bir hata veriyorsa, kurulumun sanal ortamın dışında yapılmış olabileceğini veya terminalin farklı bir Python yorumlayıcısına bakıyor olabileceğini gösterir. Böyle bir durumda sanal ortamı yeniden etkinleştirip kurulum komutunu tekrar çalıştırmak genellikle sorunu çözer.
Kurulum tamamlandıktan sonra pytest, projenizde herhangi bir ek ayara gerek kalmadan çalışmaya hazır hâle gelir. Bir yapılandırma dosyası yazmanıza, karmaşık bir proje yapısı kurmanıza gerek yoktur; pytest, birazdan göreceğimiz gibi belirli bir isimlendirme kuralına uyan dosyaları ve fonksiyonları kendi başına bulup çalıştırma yeteneğine sahiptir. Bu basitlik, aracın hem yeni başlayanlar hem de deneyimli geliştiriciler tarafından tercih edilmesinin temel nedenlerinden biridir. Sıradaki bölümde, kurduğumuz bu aracı kullanarak ilk fonksiyonumuzu ve ona karşılık gelen test dosyasını birlikte yazacağız.
İlk Fonksiyon ve Test Dosyasını Yazmak
Teoriyi bir kenara koyup elimizi koda değdirelim. En sık karşılaşılan örneklerden biri olan bir indirim hesaplama fonksiyonunu ele alalım. Fonksiyon basit olsun ki test mantığı karmaşık sözdiziminin arkasında kaybolmasın: bir ürün fiyatı ve bir indirim yüzdesi alsın, indirimli fiyatı döndürsün.
Önce asıl fonksiyonu hesapla.py adlı bir dosyaya yazalım:
def indirimli_fiyat(fiyat, indirim_yuzdesi):
if indirim_yuzdesi < 0 or indirim_yuzdesi > 100:
raise ValueError("İndirim yüzdesi 0-100 arasında olmalı")
return fiyat - (fiyat * indirim_yuzdesi / 100)
Bu fonksiyon tek başına çalışır ama "doğru çalıştığını" kimse garanti etmiyor. Şimdi aynı klasöre test_hesapla.py adında ikinci bir dosya oluşturuyoruz. Dosya adının test_ ile başlaması rastgele bir tercih değil; pytest'in bu dosyayı otomatik olarak tanıması için gereken kuraldır. Bu konuyu bir sonraki bölümde daha ayrıntılı açacağız.
from hesapla import indirimli_fiyat
def test_indirimli_fiyat_normal_durum():
sonuc = indirimli_fiyat(200, 10)
assert sonuc == 180
def test_indirimli_fiyat_indirimsiz():
sonuc = indirimli_fiyat(150, 0)
assert sonuc == 150
Terminalde bu klasördeyken sadece pytest yazmak yeterli. pytest, test_ ile başlayan dosyayı bulur, içindeki test_ ile başlayan fonksiyonları çalıştırır ve sonuçları özetler. Hiçbir ekstra yapılandırma, hiçbir sınıf tanımlama zorunluluğu yoktur; fonksiyon ve test dosyası bu kadar kısa sürede birbirine bağlanabilir.
Burada dikkat edilmesi gereken küçük ama önemli bir nokta var: test dosyası, test ettiği fonksiyonu normal bir Python modülü gibi import eder. Yani birim test yazmak, aslında Python'daki modül ve fonksiyon mantığını bir kez daha pratikte görmek demektir. Bu ilişkiyi daha sağlam kurmak isteyenler için birebir Python dersleri kapsamında fonksiyon tasarımı ve test alışkanlığı birlikte ele alınır; çünkü iyi yazılmış bir fonksiyon, zaten test edilmesi kolay bir fonksiyondur.
Bu ikili yapı -bir tarafta gerçek kod, diğer tarafta onu sınayan kod- pytest'in tüm felsefesinin özeti gibidir. Fonksiyonu yazarsınız, ne yapmasını beklediğinizi test dosyasında ifade edersiniz ve aradaki uyumu pytest'e bırakırsınız.
assert Mantığı: Beklenen ile Gerçek Değeri Karşılaştırmak

Yukarıdaki test fonksiyonlarının kalbinde tek bir kelime var: assert. Türkçeye "iddia etmek" olarak çevrilebilecek bu anahtar kelime, pytest'in test yazma dilinin temelidir ve öğrenmesi gerçekten zor değildir.
assert ifadesinin mantığı şu şekilde işler: yanına yazılan koşul doğru (True) ise hiçbir şey olmaz, program sessizce devam eder. Koşul yanlış (False) ise Python bir hata fırlatır ve pytest bu hatayı "test başarısız" olarak işaretler. Yani assert sonuc == 180 satırı şunu söylüyor: "Ben bu fonksiyonun 180 döndürmesini bekliyorum; eğer öyle değilse beni uyar."
Bu noktada iki değer devreye girer: beklenen değer ve gerçek değer. Beklenen değer, fonksiyonun ne döndürmesi gerektiğine dair sizin (ya da işin gereksinimlerinin) belirlediği sayı, metin veya nesnedir. Gerçek değer ise fonksiyon çalıştırıldığında fiilen ürettiği sonuçtur. assert, bu iki değeri karşılaştırır; aralarında fark varsa testi çökertir ve size tam olarak hangi satırda, hangi değerle karşılaştığını gösterir.
Basit bir örnekle düşünelim: bir toplama fonksiyonunuz olsun ve topla(2, 3) çağrısının 5 döndürmesini bekliyorsunuz. Test satırınız assert topla(2, 3) == 5 olur. Fonksiyon gerçekten 5 döndürüyorsa test sessizce geçer; eğer bir yazım hatası yüzünden fonksiyon 6 döndürüyorsa pytest size "beklenen 5 ama gerçek değer 6" mesajını verir. Bu mesaj, hatanın nerede olduğunu tahmin etmenize gerek bırakmaz.
assert ifadesi yalnızca eşitlik için değil, karşılaştırma için de kullanılabilir: assert sonuc > 0, assert isinstance(sonuc, float) veya assert "hata" not in mesaj gibi ifadeler de birer geçerli test satırıdır. Önemli olan, koşulun her zaman doğru veya yanlış olarak değerlendirilebilen bir ifade olmasıdır. Bu basitlik, pytest'in öğrenme eğrisini düşük tutan en önemli özelliklerinden biridir; karmaşık bir doğrulama kütüphanesi öğrenmeden, sadece Python'ın kendi karşılaştırma operatörlerini kullanarak anlamlı testler yazabilirsiniz.
İsimlendirme Kuralları ve pytest'in Testleri Bulma Mantığı
pytest'in bu kadar az yapılandırmayla çalışabilmesinin sırrı, belirli bir isimlendirme kuralına dayanmasıdır. Siz herhangi bir yapılandırma dosyası yazmasanız da pytest, projenizdeki dosyaları tarayarak hangi dosyaların test içerdiğini kendi başına anlar. Bu yeteneğe "otomatik keşif" (test discovery) denir.
Bu keşfin çalışabilmesi için üç temel kural vardır: dosya adı test_ ile başlamalı veya _test ile bitmelidir; dosya içindeki fonksiyon adları test_ ile başlamalıdır; eğer testler bir sınıf içinde gruplanıyorsa sınıf adı Test ile başlamalıdır. Önceki bölümdeki test_hesapla.py dosyası ve içindeki test_indirimli_fiyat_normal_durum fonksiyonu tam olarak bu kurala uyduğu için pytest komutunu çalıştırdığınızda hiçbir ek belirtme yapmadan bulunur ve çalıştırılır.
Bu kuralın pratikte ne anlama geldiğini birkaç noktada özetlemek faydalı olur:
- Dosya adında
test_önekini unutmak, o dosyadaki testlerin sessizce atlanmasına yol açar; pytest hata vermez, sadece dosyayı görmezden gelir. - Fonksiyon adı
testkelimesini içerse de önek olarak başında değilse (örneğinhesapla_test) pytest tarafından test olarak tanınmaz. - Test dosyalarını ayrı bir
testsklasöründe toplamak, projeniz büyüdükçe gerçek kodla test kodunu birbirinden ayırmanıza yardımcı olur. - Bir fonksiyona birden fazla test yazmak istediğinizde, her senaryoya açıklayıcı bir isim vermek (
test_indirimli_fiyat_sifir_indirimgibi) hangi durumu sınadığınızı ileride hatırlamanızı kolaylaştırır.
Bu isimlendirme disiplinini bir kez oturttuğunuzda, pytest komutunu proje kök dizininde çalıştırmak yeterli olur; araç kendi başına tüm test dosyalarını tarar, toplar ve sonuçları özetler. Bu, büyük projelerde yüzlerce test fonksiyonunu tek tek çağırmak zorunda kalmadan bütün sistemin sağlığını tek komutla görebilmenizi sağlar. Kendi kod yazma ve isimlendirme alışkanlıklarınızı ölçmek isterseniz ücretsiz kodlama bilgisi testi ile mevcut seviyenizi görmek, hangi konularda daha çok pratik yapmanız gerektiğine dair size somut bir başlangıç noktası verebilir.
Testin Pratik Faydası: Hatayı Teslimden Önce Yakalamak
Bir ödevi ya da bir proje dosyasını teslim etmeden önce elle birkaç örnek değer deneyip "çalışıyor gibi görünüyor" demek, çoğu zaman yeterli değildir. Kodun sadece göze çarpan senaryoda değil, akla gelmeyen kenar durumlarda da doğru sonuç verdiğinden emin olmak gerekir. İşte pytest'in asıl değeri burada ortaya çıkar: yazdığınız testleri saniyeler içinde tekrar tekrar çalıştırarak, kodda yaptığınız her küçük değişikliğin mevcut davranışı bozup bozmadığını anında görürsünüz. Bu, hatayı teslimden önce yakalamak demektir — hoca, ekip lideri ya da müşteri kodu incelemeden önce sorunu siz fark edersiniz.
Gerçek yazılım ekiplerinde bu mantık çok daha büyük bir sisteme dönüşür. Bir geliştirici kod deposuna değişiklik gönderdiğinde, CI/CD (Continuous Integration/Continuous Deployment) hattı devreye girer ve pytest gibi test araçlarını otomatik olarak çalıştırır. Testlerden biri başarısız olursa değişiklik doğrudan ana koda birleştirilmez; geliştirici geri bildirimi dakikalar içinde alır. Böylece bir kişinin yaptığı hata, ekibin diğer üyelerinin çalışmasını bozmadan erken aşamada durdurulur. Öğrenme sürecinde küçük ölçekte uyguladığınız "önce test yaz, sonra güven" alışkanlığı, ileride tam da bu profesyonel iş akışının temelini oluşturur. Bu noktada tek başına ilerlemek yerine, yazdığınız her fonksiyonu neden ve nasıl test etmeniz gerektiğini birebir geri bildirimle görmek öğrenme sürecini kısaltır. birebir Python dersleri kapsamında, öğrencinin kendi kodu üzerinden hangi senaryoların gözden kaçtığı, hangi assert ifadesinin eksik kaldığı somut örneklerle gösterilir; bu da testin soyut bir kural değil, günlük çalışma alışkanlığı olarak içselleştirilmesini sağlar.
Ayrıca düzenli test yazma alışkanlığı, öğrenci portalındaki soru bankası ve günlük alıştırmalarla birleştiğinde daha da güçlenir. Bir kategori bazlı soru bankasında çözülen fonksiyon sorularını kendi test senaryolarınızla desteklemek, sadece doğru cevabı bulmakla kalmayıp "bu cevap her durumda doğru mu" sorusunu da sormayı öğretir. Zamanla bu refleks, kod yazma hızınızdan çok daha değerli bir beceri hâline gelir: kendi işinize güvenme becerisi.
Sık Sorulan Sorular
pytest kullanmak için Python'ı çok iyi bilmek gerekir mi?
Hayır. pytest'i kullanmak için fonksiyon tanımlamayı, temel veri tiplerini ve basit karşılaştırma mantığını bilmek yeterlidir. Aslında pytest'i öğrenme süreci, Python'ın temel yapılarını daha sağlam anlamanıza da yardımcı olur; çünkü bir fonksiyonu test etmek, önce o fonksiyonun ne yapması gerektiğini net biçimde düşünmeyi zorunlu kılar.
assert ile normal if-else kontrolü arasındaki fark nedir?
Bir if-else bloğu, programın akışını bir koşula göre yönlendirmek için kullanılır ve genellikle uygulamanın normal çalışma mantığının parçasıdır. assert ifadesi ise bir varsayımı doğrulamak içindir; koşul yanlışsa programı durdurup hemen bir hata bildirir. Testlerde assert kullanılır çünkü amaç akışı yönlendirmek değil, "bu değer gerçekten beklediğim değer mi" sorusuna kesin bir cevap almaktır.
Test dosyasını nereye kaydetmeliyim, fonksiyonla aynı klasöre mi?
Küçük ve öğrenme amaçlı projelerde test dosyasını fonksiyonun bulunduğu klasörle aynı yere kaydetmek pratik ve yeterlidir. Dosya sayısı arttığında ise test dosyalarını ayrı bir "tests" klasöründe toplamak, hem proje düzenini korur hem de pytest'in tüm testleri tek bir komutla bulmasını kolaylaştırır.
Bir projede kaç test yazmak yeterlidir?
Sabit bir sayı yoktur; önemli olan her fonksiyonun en azından normal çalışma durumunu ve olası bir kenar durumunu (boş değer, negatif sayı, beklenmeyen giriş gibi) kontrol eden en az bir testinin olmasıdır. Karmaşık ve kritik fonksiyonlar için daha fazla test senaryosu yazmak, basit yardımcı fonksiyonlar için ise az sayıda test genellikle yeterlidir.
pytest testleri nasıl otomatik bulur, ben hiçbir şey belirtmesem ne olur?
pytest, çalıştırıldığı klasördeki dosyalar arasında adı "test_" ile başlayan veya "_test" ile biten dosyaları tarar ve bu dosyaların içindeki "test_" önekli fonksiyonları otomatik olarak test olarak kabul eder. Siz herhangi bir yapılandırma belirtmeseniz de, sadece bu isimlendirme kuralına uyduğunuzda pytest komutunu çalıştırmanız testlerin bulunması için yeterlidir.
Test yazmak, kod yazma sürecinin dışında kalan ek bir yük değil, tam tersine o sürecin doğal ve güven veren bir parçasıdır. pytest ile küçük adımlarla başlayıp bu alışkanlığı düzenli hâle getirmek, hem ödev ve proje teslimlerinde hem de ileride katılacağınız gerçek yazılım ekiplerinde işinizi büyük ölçüde kolaylaştırır. Bu temeli daha derinlemesine ve uygulamalı biçimde geliştirmek isteyenler Python yazılım kursu sayfasındaki içerikleri inceleyebilir.