İçeriğe geç →

Python (Django) ile Test Odaklı Geliştirme (TDD) – 2

Önceki bölümlerde; Python (Django) ile Test Odaklı Geliştirme (TDD) – 1

Bölüm 1:  TDD Temelleri ve Django (Part 1: The Basics of TDD and Django)

​Kısım 2: unittest Modülü Kullanarak Functional Testimizi Genişletmek (Extending Our Functional Test Using the unittest Module)

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 Test == Acceptance Test == End-to-End Test

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.

İyi işti!

Gelecek Kısım:  Python (Django) ile Test Odaklı Geliştirme (TDD) – 3

Not;

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.

Kategori: Python

Yorumlar

Siz de düşüncelerinizi paylaşın

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.