Kurs
Test etmek, kodunuzun beklediğiniz gibi çalıştığına dair güven verir. Bu eğitimde, Python kullanarak test odaklı geliştirme (TTD) temellerini öğreneceğiz. Başlamadan önce, test odaklı geliştirme hakkında – ne olduğu ve neden kod yazarken önce test yazmanın faydalı olduğu – kısa bir arka plan sunacağız. Uygulamak istediğimiz işlevsellik için önce başarısız testler yazıp ardından asıl fonksiyonları yazacağımız bir test-öncelikli yaklaşım izleyeceğiz.
Eğitim İçin Ön Koşullar
Bu eğitim için temel düzeyde Python bilgisine ihtiyacınız olacak; Python bilginizi tazelemeniz gerekiyorsa şu kursa göz atabilirsiniz: Introduction to Python for Developers.
Test-öncelikli bir yaklaşım, istenen davranışı ve beklenen çıktıları en baştan düşünmemizi sağlar. Python'da test yazmak için pytest ve unnitest gibi çeşitli kütüphaneleri kullanabilirsiniz. Ancak şimdilik, beklenen işlevselliğin beklenen çıktıyı ürettiğini doğrulayacak Yerel (Native) Python ile basit test vakalarının nasıl yazılacağına odaklanacağız.
Basit bir test vakasıyla başlayacak ve testleri kademeli olarak farklı senaryoları kapsayacak şekilde genişleteceğiz. Test vakalarımızı genişlettikçe, geliştirmemiz gereken hatalar veya ilk uygulama mantığımızdaki boşluklar ortaya çıkabilir. Daha gelişmiş test vakalarını yinelemeli olarak yazmak, başarısız olduklarını görmek ve ardından uygulamamızı geliştirmek üzere geri dönmek – Python ile test odaklı geliştirmenin özünde bu süreç vardır.
Bu eğitimde, hiçbir yerel kurulum yapmadan Python kodu yazıp çalıştırmanızı sağlayan, DataCamp'in bulut tabanlı veri defteri DataLab'i kullanacağız. Hadi başlayalım!
DataLab ile Başlarken
Test odaklı geliştirmeye başlamadan önce DataLab'i keşfedip nasıl kullanacağımızı anlamamız gerekiyor ki öğrenme yolculuğumuzda bize yardımcı olsun. DataLab'i açarsanız birçok seçenek olduğunu fark edeceksiniz. Şimdilik DataLab'de Python yazmaya odaklanacağız.

Python'u seçerseniz, çalışma kitabı Python yazmanız için bir kod hücresi açar. Şuna benzer görünecektir:

Burada bazı faydalı seçenekleriniz var. Örneğin, çıktıyı görmek için hücreyi çalıştırabilir, öğrenmenizi desteklemek üzere yorumlar ya da notlar ekleyebilir ve başlamanıza ya da takıldığınız yeri açmanıza yardımcı olması için yapay zekadan yararlanabilirsiniz. Ayrıca ihtiyaç duyduğunuz kadar hücre ekleyip silebilirsiniz. Biz "Run" seçeneği ile hücreyi çalıştırmaya odaklanacağız. Aşağıdaki kodda da görebileceğiniz gibi, hücreyi çalıştırdığınızda kodunuzun ürettiği her çıktı altta kaydedilir.
Kısa bir not: Birden fazla hücre kullandıysanız ve bir hücrede bir değişken tanımladıysanız ancak onu başka bir hücrede kullanmaya çalışıyorsanız, her hücreyi ayrı ayrı veya tüm çalışma kitabını (çalışma kitabınızın sağ üst kısmındaki "Run" düğmesinden) çalıştırmanız gerekir.

Artık DataLab'in temelini öğrendiğimize göre, test odaklı geliştirmeye başlayalım.
Test Odaklı Geliştirme
Test odaklı geliştirme, kodunuzu yazmadan önce testlerini yazmanız anlamına gelir. TTD'yi açıklamak için, sayıları toplayan bir Python betiği yazmayı içeren basit bir örnekle başlayalım. Ancak fonksiyonu yazmadan önce, 1 + 1'in 2'ye eşit olup olmadığını kontrol edecek bir test yazacağız. Bunu aşağıda gösterildiği gibi yerel Python kullanarak yapabilirsiniz.
assert 1 + 1 == 2
Python'daki assert anahtar sözcüğü, test vakaları yazmak ve program koşullarının Doğru'ya (True) değerlendirdiğini teyit etmek için kullanılır. Kodunuzun davranışını ve çıktıları doğrulamanızı sağlar. Bir assert ifadesi başarısız olduğunda bir AssertionError fırlatır ve bu, kodda bir sorun olduğuna işaret eder. Bu durum DataLab çalışma kitabınızda şöyle görünür:

Örnek 1: Basit Bir Fonksiyonun Testi
Test fonksiyonuyla başlayalım. Öncelikle, DataLab'de bir Python dosyası açın. Test odaklı geliştirme, önce başarısız olacak bir test yazmayı içerir. O halde, henüz tanımlanmamış olan add() fonksiyonunu çağırarak başarısız olacak bir test yazalım.
assert add(1, 1) == 2
Bu, bir uygulama olmadığını belirten bir NameError ile sonuçlanacaktır; bu aşama "kırmızı" adıyla bilinir. Tanımlanmamış bir fonksiyonu veya değişkeni çağırmaya çalıştığınızda NameError alırsınız.

Şimdi fonksiyonu uygulama zamanı. Bunu fonksiyonu tanımlayarak yapabiliriz:
def add(num1, num2):
return
add fonksiyonumuzu, num1 ve num2 olmak üzere iki parametre alacak şekilde tanımladık. Fonksiyonumuz henüz herhangi bir şey döndürmüyor. Bakalım fonksiyonumuzun bu uygulaması testlerimizden geçiyor mu!

Artık bir NameError görmüyoruz. Ancak hücreyi çalıştırmak hâlâ bir hata üretiyor! Bu kez bir AssertionError. Yani testimiz yine başarısız oldu! Bu hatayı neden alıyor olabiliriz? Çünkü henüz hiçbir şey döndürmeyen bir fonksiyon tanımladık.
Testi çalıştırdığımızda, boş uygulamamızla 1 + 1, 2'ye eşit olmadığı için bir AssertionError alıyoruz. Son olarak, fonksiyonun içindeki mantığı doğru şekilde uygulayarak testi geçmesini sağlayabiliriz.

Hücrenin köşesindeki yeşil noktayı fark edeceksiniz. Bu, kodunuzun geçerli olduğunu ve hücreyi çalıştırdığınızda testten geçtiğini gösterir. Önceden, bir çalışma hatasıyla kırmızıydı ve hücrenin altında hata türünü gösteriyordu. Bu özellik, DataLab'de kodunuzu hata ayıklamak için kullanışlıdır.
Artık test odaklı geliştirme kullanarak Python'da ilk testinizi yazdınız. Harika iş! Şimdi testlerimizi genişletmeye ve fonksiyonumuzun başarısız olmasına veya beklenen çıktıyı üretmemesine neden olabilecek olası hataları yakalamayı düşünmeye geçeceğiz.
Örnek 2: Birden Fazla Test Vakası
Yalnızca tek bir girdi değeriyle test yapmak, potansiyel hataları ortaya çıkaramayabilir. Özellikle fonksiyonunuz değişken kullanıcı girdisine veya harici mantığa dayanıyorsa hatalar kolayca gizlenebilir. Peki bir fonksiyonu birden çok değere karşı kapsamlı şekilde nasıl test edebiliriz?
Örneğin, fonksiyona yanlış bir veri tipi iletilirse ne olur? Python test çatılarını kullanabilirsiniz, ancak bunun yerine temel Python kullanalım. Önce, farklı kullanım senaryolarını simüle etmek için bir girdi sözlükleri listesi tanımlayacağım:
test_cases = [
{"num1": 1, "num2": 3, "expected": 4},
{"num1": 1, "num2": "invalid", "expected": "Error: num2 must be a number"},
{"num1": [1,2,3], "num2": 2, "expected": "Error: num1 must be a number"},
{"num1": -1, "num2": 1, "expected": 0},
{"num1": 3.5, "num2": 2.5, "expected": 6.0},
{"num1": 100, "num2": 200, "expected": 300}
]
Yukarıdaki kod, fonksiyon için girdileri ve beklenen çıktıları gösterir. Ancak testimizi bu vakaları dolaşacak şekilde güncellemeliyiz. For döngüsü içinde assert kullanarak listedeki her sözlüğü doğrulayabiliriz.
for test in test_cases:
assert add(test["num1"], test["num2"]) == test["expected"]
Fonksiyon değişmediğine göre, bu testin geçmesini mi yoksa başarısız olmasını mı bekleriz? Ve hangi hata oluşabilir?

Test, sayı olmayan girdileri ele almadığımız için bir TypeError hatası fırlatıyor; peki bir int yerine string veya boolean iletilirse ne olur? Bu durumları yakalayacak şekilde fonksiyonu güncelleyebiliriz! Girdi değişkeninin tamsayı veya float olduğunu kontrol ederek geçersiz tiplerde özel bir mesaj döndürebiliriz.
def add(num1, num2):
if type(num1) is not int and type(num1) is not float:
return "Error: num1 must be a number"
elif type(num2) is not int and type(num2) is not float:
return "Error: num2 must be a number"
else:
return num1 + num2
Testleri yeniden çalıştırdığımızda artık hata almıyoruz; yani testlerimiz geçti. Şimdi yeşil dairenin, geçmekte olan bazı testler uyguladığımızı gösterdiğini görebiliriz. Tebrikler!

Son Düşünceler
Bu eğitimde, DataLab kullanarak Python'da test odaklı geliştirmenin temellerini ele aldık. DataLab, yerel kurulum gerektirmeden Python kodu yazıp çalıştırmanızı sağlayan bir bulut IDE sunar. Testler, kod davranışını doğrular ve hataları erken yakalar. Assert ifadeleri koşulları kontrol eder ve başarısızlıklarda istisna fırlatır.
Daha fazla test vakasını keşfedebilir ve kendi testlerinizi DataLab'de yazmaya başlayabilirsiniz! Python'da test etmeyi daha fazla öğrenmek isterseniz DataCamp kursumuza göz atın - Introduction to Testing in Python.
Amina, Datacamp'te içerik geliştirme stajyeridir. Mimarlık ve Eğitim geçmişine sahipken kariyer değiştirerek yazılım geliştirmeye yöneldi; JavaScript ile başlayıp şimdi Python'a odaklanıyor.

