Upgrade to Pro — share decks privately, control downloads, hide ads and more …

TDD - Test Driven Development

TDD - Test Driven Development

Test'le Yürüyen Geliştirme metodolojisine yakından bakış.

Uğur Özyılmazel

April 29, 2015
Tweet

More Decks by Uğur Özyılmazel

Other Decks in Programming

Transcript

  1. TDD
    Test Driven Development

    View Slide

  2. Test'le Yürüyen/İlerleyen Geliştirme

    View Slide

  3. ??
    ?

    View Slide

  4. TEST TÜRLERİ
    • Verification & Validation
    • Quality Assurance
    • TDD

    View Slide

  5. Verification & Validation / QA
    KODU YAZ
    TEST'i YAZ
    TEST'i ÇALIŞTIR
    REFACTOR

    View Slide

  6. TDD

    View Slide

  7. ÖNCE
    HAYAL ETTİĞİN UYGULAMAYI TANIMLA
    BEKLENTİLERİNİ BELİRLE!
    TEST'LERİNİ ÇALIŞTIR

    View Slide

  8. View Slide

  9. SONRA
    TEST'LERİ ÇALIŞTIR VE
    HEPSİNİ BAŞARIYLA GEÇ!

    View Slide

  10. View Slide

  11. EN SONDA
    YAZDIĞIN KOD'LARI
    DÜZENLE!

    View Slide

  12. RED (Kırmızı)
    1
    TEST FAIL EDECEK!
    Henüz ilgili fonksiyonlar/sınıflar yazılmadı!

    View Slide

  13. GREEN (YEŞİL)
    2
    TÜM TESTLER PASS ETTİ!
    Şimdi sırada REFACTOR etmek var!

    View Slide

  14. TEST YAZ / ÇALIŞTIR
    FAIL EDENLERİ GÖR
    KOD'U DÜZELT TEKRAR ÇALIŞTIR
    REFACTOR

    View Slide

  15. FAYDALARI
    • BUG FREE geliştirme
    • Hızlı geliştirme
    • Dökümantasyon yazma zahmetinden kurtarıyor
    • Sürdürülebilir kod yazma
    • Uçtan uca uygulamayı görmek
    • Deployment otomasyonunda kolaylık
    • Test Coverage

    View Slide

  16. DEZAVANTAJLARI
    • Legacy code'a entegre etmek sorun olabilir
    • Test'lerin maintenance işi ve test süresi
    • "Quick Edit" mini değişimler için zor
    • False Positives
    • Edge Case'leri mutlaka tamamlamak gerek

    View Slide

  17. TEST YAZACAK
    ZAMANIM YOK

    View Slide

  18. !

    View Slide

  19. TEST YAZACAK
    ZAMANIM YOK
    BUNU SÖYLEYEN CAHİLDİR!

    View Slide

  20. require 'test/unit'
    class TestPalindrome < Test::Unit::TestCase
    def test_palindrome
    palindromes = ["anastas mum satsana", "kuk"]
    not_palindromes = ["hello", "mello"]
    palindromes.each{|str| assert palindrome?(str)}
    not_palindromes.each{|str| assert !palindrome?(str)}
    end
    end
    def palindrome?(string)
    string.reverse == string
    end

    View Slide

  21. Loaded suite untitled
    Started
    .
    Finished in 0.001015 seconds.
    1 tests, 4 assertions, 0 failures, 0 errors, 0
    pendings, 0 omissions, 0 notifications
    100% passed
    985.22 tests/s, 3940.89 assertions/s

    View Slide

  22. Unit Tests
    Uygulama içindeki en küçük parçaları
    fonksiyonları test ettiğimiz test. Hatta
    buna Functionality Testing de denir.

    View Slide

  23. Integration Tests
    Kod içindeki farklı parçacıkların
    birbirleriyle olan entegrasyonlarını /
    ilişkilerini test eden test.

    View Slide

  24. Acceptance Tests
    Baştan sona tüm fonksiyonalitenin,
    entegrasyonun test edildiği test. Bu
    test'e END to END Testing de denir.

    View Slide

  25. Sağlıklı Test Akışı
    1. Unit Tests
    2. Integration Tests
    3. Acceptance Tests

    View Slide

  26. TEST ARAÇLARI

    View Slide

  27. rspec cucumber mini-test
    test-unit capybara selenium

    View Slide

  28. Fixture ve Factory
    Testleri yapabilmek için gerekebilecek
    fake datalar / dublörler

    View Slide

  29. it "allows setting these responses" do
    fake_person = double("Person")
    allow(fake_person).to receive_messages(:full_name =>
    "Uğur Özyılmazel")
    expect(fake_person.full_name).to eq("Uğur Özyılmazel")
    end
    it "stubs desired year on a real Time object" do
    time = Time.new.now
    allow(time).to receive(:year).and_return(1972)
    expect(time.year).to eq(1975)
    end

    View Slide

  30. factory_girl rspec-mocks
    mocha rr faker fabrication

    View Slide

  31. TEST FIRST!
    Teşekkürler

    View Slide