Bir konu araştırma yaparken karşıma çıkan bir yazıyı paylaşmak istiyorum. Özellikle ilk paragrafı çok çok çok önemli ve mantıklı. Bu nedenle o kısmı farklı bir renkle alıntılıyorum.

Bu konuda çıkarılması gereken şey; iyice tasarlanmadan kod yazılmaz. Standart yapımızdan kurtulup işi "olması gerektiği gibi" yapmaya başlamalıyız. Örneğin bir üye kayıt işleminde "iki gir çık tamamdır!" anlayışından kurtulup, "unit testing" ve "functional testing" ile uygulamalarımızı test etmeliyiz.

---
Alıntı
Yaptığınız veya yapmayı planladığınız proje için test yazmak tabi ki ortaya çıkaracağınız işin daha sağlam, daha sistemli ve daha efektif olmasını sağlayacaktır. Bu işi kitabına uygun şekilde yapmak isterseniz önce uygulamanın planlanmış durumlarını içeren testleri yazmalısınız. Daha sonra bu testlerden başarıyla geçecek özellikleri bir araya getirerek uygulamayı oluşturmalısınız. Ama genellikle testleri uygulamadan sonra yazmak daha kolay geliyor insanlara. Bu da bir yöntemdir ama şunu aklınızdan çıkarmamalısınız. Uygulamaya göre test yazılmaz, testler uygulamanın açıklarını ortaya çıkaracak, uygulamayı patlatacak şekilde yazılmalıdır.

Bu küçük hatırlatmayı yaptığımıza göre birim test ve fonksiyonel testleri tanımlamaya başlayabiliriz.


Birim (Unit) Test: Bir uygulamanın içerisindeki bir fonksiyonu veya bir sınıfın (class) içerisindeki bir metodu test etmek için yazılan, o metodu veya fonksiyonu dışarıdan tamamen soyutlayarak (alacağı parametreler hazırlanarak veya etkileşime geçeceği fonksiyonların dönüş değerleri yine dışardan etkilenmeyecek şekilde belirlenerek) çalıştırıp beklenen sonucu üretip üretmediğini kontrol etmek için yazılmış testlerdir.

Yani bilinen bir girdiye karşılık, beklenen sonucu üreten program parçaları birim testi geçer. Birim test yazmak yazılan kodları programcı gözüyle çalıştırmaktır.

Fonksiyonel (Functional) Test: Bir uygulamanın içerisindeki fonksiyonların, metotların, sınıfların ve hatta veritabanının bütün bu yapılarla beraber olan etkileşimlerini test eder. Burada dikkat edilmesi gereken nokta testin etki alanının geniş olmasıdır. Burada belirli bir senaryo vardır ve bu senaryo sürerken bütün bu yapıların birbirleri ile doğru etkileşimi kurup doğru sonuçlar vermesi beklenir.

Yani bilinen bir senaryoya karşılık beklenen sonucu üreten program parçaları fonksiyonel testi geçer. Fonksiyonel test yazmak yazılan kodları kullanıcı gözüyle çalıştırmaktır.

Örneğin;

Bir controller olsun diyelim. Bu controller'ın içinde kullanıcı bilgilerini veritabanına kaydeden bir metot olsun. Biz bu metoda parametre olarak (POST, GET vs. isteği ile) kullanıcı bilgilerini verip, metot çalıştıktan sonra da beklenen çıktıyı (değerler yanlışsa ilgili ilgili hata mesajı verilmiş mi?, değerler doğruysa doğru sayfaya yönlenmiş mi?) vermiş mi diye kontrol edersek birim test çalıştırmış oluruz.

Eğer bu fonksiyona doğrudan erişmeyip kullanıcı arayüzünden bir form doldurup onay butonuna basıp, daha sonra da kullanıcıların listelendiği sayfa üzerinden yeni eklenen kullanıcının bilgileri gelmiş mi diye kontrol edersek fonksiyonel test çalıştırmış oluruz.

Dikkat edilirse ilk durumda bütün dış parametreleri biz hazırlıyoruz, isteği biz yapıyoruz, veritabanından metodu biz soyutluyoruz ve gerekirse veritabanından dönecek cevabı kendi elimizle veriyoruz (mock). Ama ikinci durumda sadece kullanıcı ekleme işlemini tetikleyecek durumu oluşturup geri kalanını uygulamanın kendisine bırakıyoruz.

Son olarak birim test ile fonksiyonel test arasındaki farklı özetleyen bir sözü paylaşayım.

"Unit tests tell a developer that the code is doing things right; functional tests tell a developer that the code is doing the right things"

Türkçeye çevirirsek; "Birim test, uygulama geliştiren kişiye kodun görevini doğru şekilde yaptığını, fonksiyonel test ise kodun doğru görevleri yaptığını söyler"
http://www.cagataybulut.com/2013/06/...test-unit.html