Önceki bölümlerde; Python (Django) ile Test Odaklı Geliştirme (TDD) – 1
Bir önceki kısımda yazdığımız test, Django’nun “it worked” sayfasının çalışıp çalışmadığını kontrol ediyordu. Şimdi bu testi, kendi uygulamamıza göre geliştireceğiz. Ama öncesinde, şu “functional test (FT)
” deyimini biraz açıklamak gerek;
Functional testler (FT), uygulamamızın fonksiyonlarını son kullanıcı gözünden görmemizi sağlar. “Functional test” denmesinin sebebi de bu zaten. FT’yi bir çeşit uygulamamızın tanımlaması olarak da düşünebiliriz. “User Story”leri takip edip, kullanıcıların uygulamamızın belirli özellikleriyle çalıştığında uygulamanın nasıl cevap verdiğini izler.
FT’ler okunabilir ve takip edebileceğimiz hikayelere sahip olmalı. Test kodları yazarken açık ve net yorumlarla bunu sağlayabiliriz. Yeni bir FT yazarken, öncelik yorumları yazmakta olmalı. Yorumlar “User Story”lerin anahtar noktalarını yakalamalı. Ayrıca, öyle okunabilir olmalı ki, programcılar dışındaki kişilerle de bu yorumları paylaşıp, uygulamanın gereksinimleri ve özellikleri hakkında tartışma yapabilmeliyiz.
FT’nin yanında, diğer önemli bir anahtar kelime ise; “minimum viable app (minimum yaşayabilir uygulama)
“. Direkt çevirince anlaması güç olabilir. MVP ile kastedilmek istenen şey, “yapabileceğimiz en basit yine de kullanışlı” olan uygulama. Bizim yapacağımız uygulama “To-Do” uygulaması olacak. Dolayısıyla, bizim uygulamamız için MVP, kullanıcıların yapılacaklar listesi oluşturmasına olanak vermek ve uygulamaya geri döndüklerinde listelerini görmelerini sağlamak olabilir.
functional_tests.py
dosyamızı açıp, şu şekilde bir hikaye ile güncelleyelim;
from selenium import webdriver browser = webdriver.Firefox() # Edith havalı yeni bir yapılacaklar listesi uygulaması olduğunu duydu # Kontrol etmek için sitenin ana sayfasını ziyaret eder. browser.get('http://localhost:8000') # Sayfanın "title" kısmında ve başlığında "to-do" listelerinden bahsedildiğini fark etti. assert 'To-Do' in browser.title # Doğruca, yapılacak listesi için madde girmek istedi # Textbox'a "Tavuskuşu tüyü satın al" yazar (Edith'in değişik bir hobisi var) # Enter'a basınca sayfa güncellenir, ve sayfada yapılacak listesinde şu madde vardır; # "1: Tavuskuşu tüyü satın al" # Sayfada hala yeni bir madde girmek için textbox durmakta. # Edith şöyle yazar "Uçan bi şey yapmak için tavuskuşu tüylerini kullan" (Edith ayrıca çok sistemli) # Sayfa yeniden güncellenir, ve listedeki 2 maddeyi de gösterir # Edith, sitenin yaptığı listeyi hatırlayıp hatırlamayacağını merak ediyor. # Sonra fark ediyor ki site onun için bir URL hazırlamış -- bu özelliği açıklayan biraz daha yazı varmış burada. # URL'i ziyaret eder ve yapılacaklar listesinin onu beklediğini görür. # Edith tatmin oldu, uyumaya gider. browser.quit()
Hikayemizde Edith’in farklı hobisi dışında değinmemiz gereken bir nokta var yorumlar hakkında. O da; gereksiz yorumlardan kaçınmak. Yorum satırı yazmamak, bazen yorum yazmak kadar önemlidir. Çünkü gereksiz yorumlar hem zaman kaybıdır hem de güncellemesi unutulan yorumlar kafa karışıklığı oluşturabilir. Mesela şu yorum gereksiz;
# increment wibble by 1 wibble += 1
Yukarıdaki gibi gereksiz yorumlar yazmak yerine, daha okunabilir ve kendini açıklayan değişken, fonksiyon isimlerine odaklanmak gerekir. Böylece koda ilk göz attığımızda bile, genel olarak kodların ne yaptığını anlamamız rahat olacaktır. Bırakın kodlar kendisi anlatsın 🙂 .
functional_tests.py
testimize dönecek olursak, assert 'To-Do' in browser.title
olarak kodun güncellendiğini görüyoruz. Öncesinde title
içinde “Django”yu arıyorduk. Yani testi çalıştırırsak, testin başarısız olacağını biliyoruz, –beklenildiği üzere-.
$ python functional_tests.py Traceback (most recent call last): File "functional_tests.py", line 10, in <module> assert 'To-Do' in browser.title AssertionError
Şu anki FT’miz pek iyi değil. Öncelikle hata mesajı biraz daha açıklayıcı olabilir ve test bittiğinde Firefox otomatik kapanabilir. Var olan kodlarımızı, Python’ın standart kütüphanesinde bulunan unittest
modülü ile geliştirebiliriz;
from selenium import webdriver import unittest class NewVisitorTest(unittest.TestCase): def setUp(self): self.browser = webdriver.Firefox() def tearDown(self): self.browser.quit() def test_can_start_a_list_and_retrieve_it_later(self): # Edith havalı yeni bir yapılacaklar listesi uygulaması olduğunu duydu # Kontrol etmek için sitenin ana sayfasını ziyaret eder. self.browser.get('http://localhost:8000') # Sayfanın "title" kısmında ve başlığında "to-do" listelerinden bahsedildiğini fark etti. self.assertIn('To-Do', self.browser.title) self.fail('Finish the test!') # Doğruca, yapılacak listesi için madde girmek istedi # [...geri kalan yorumlar...] if __name__ == '__main__': unittest.main(warnings='ignore')
Şimdi testi çalıştıralım;
$ python functional_tests.py F ====================================================================== FAIL: test_can_start_a_list_and_retrieve_it_later (__main__.NewVisitorTest) --------------------------------------------------------------------- Traceback (most recent call last): File "functional_tests.py", line 18, in test_can_start_a_list_and_retrieve_it_later self.assertIn('To-Do', self.browser.title) AssertionError: 'To-Do' not found in 'Welcome to Django' --------------------------------------------------------------------- Ran 1 test in 1.747s FAILED (failures=1)
Testimiz artık biraz daha kullanışlı halde. Hata mesajımız daha detaylı ve Firefox penceresini elimizle kapatmamıza gerek kalmadı.
Commit yapmak için iyi bir zaman. Sonraki kısımda kaldığımız yerden devam edeceğiz.
Gelecek Kısım: Python (Django) ile Test Odaklı Geliştirme (TDD) – 3
Bu yazı, Test-Driven Development with Python: Obey the Testing Goat: Using Django, Selenium, and JavaScript kitabının, yazarından da onayı alınarak, geniş şekilde Türkçe olarak özetlenmiş halidir. Kitabı okumaya ücretsiz olarak devam edebilir, destek olmak için satın alabilirsiniz. Detaylar için buraya tıklayabilirsiniz.
Celery ile alakalı "best practice"leri ve faydalı araçları bir araya getiren güzel bir checklist'e denk…
Diziler en temel ve sık kullandığımız araçlardan... Kod yazarken işimizi kolaylaştıracak, daha temiz kod yazmamızı…
listve tuple bilginizi test etmek ister misiniz? realpython.com da keşfettiğim ve Türkçe'ye çevirdiğim mini teste…
Rehberlik sağlaması ve bilgi tazelemesi açısından faydalı olduğunu düşündüğüm bir Toptal blog paylaşımınıTürkçe'ye çevirdim.Devamını okuyunBilmeniz…
Angular componentlerine console üzerinden hızlıca erişmek için kullanılan bir teknik. Unutmamak için kendime not düşüyorum.Devamını…
Geçtiğimiz günlerde keşfettiğim ve oldukça da hoşuma giden repoyu paylaşmak istiyorum: lydiahallie/javascript-questions Genel olarak temel…