Benim 'ah-ha!' Ruby ve Rails'te test ile ilgili anlar gerçekten oturdum ve konuyla ilgili kesin kaynakları, Rspec ve Salatalık kitaplarını okuduğumda geldi . İlk Salatalık küçümsemenizi paylaştım, ama sonra resme oldukça yanlış açıdan baktığımı fark ettim.
Temel olarak, Salatalık BDD (davranış güdümlü geliştirme) ile ilgilidir - özelliklerinizi, bir sonraki adımda ne yapacağınızı planlamak için Salatalık kullanırsınız. Hmm, daha sonra kullanıcıların bir forumda veya bir şeyde yayınları tanıtmasını istersiniz (bir örnek çalmak için;)) Yani basit bir şey yazıyorsunuz.
Given I am logged in
And I can see the post "BDD is awesome"
When I vote the post up
Then the post should have one more vote
And the page should show a message thanking me for my vote.
Orada hemen hemen ilgili kod herhangi bir referans yok unutmayın. Bu sizin adımlarınızda gelir. Kodunuzu yeniden düzenlediğinizde, adım tanımlarınızı değiştirmeniz gerekebilir, ancak davranışın (özelliğiniz) hiçbir zaman değişmesi gerekmez.
Şimdi Salatalık özelliğini her çalıştırdığınızda, TDD (test odaklı geliştirme) kullanarak bu özelliğin nasıl test edileceğine yönlendirileceksiniz. Bu, RSpec kullanılarak daha düşük bir seviyede yapılır.
İlk çalıştırma - ilk adım tanımım tanımsız. Kullanıcıları ve oturumlarını ilgilendirdiği için bloğu kopyalayın. Şimdi, bir kullanıcının oturum açtığını nasıl tanımlarsınız? Bunları giriş işleminden geçirebilirsiniz.
Given /^I am logged in$/ do
visit login_path
fill_in :name, :with => 'Joe'
fill_in :password, :with => 'Password'
click_button 'submit'
end
Hepsi mutlu olmalı. İkinci adım.
Given /^I can see the post "(.+)"$/ do |name|
visit post_path(Post.find_by_name(name))
end
Yine oldukça kolay. Giriş işlemimizi tamamen yeniden yaparsak veya yayınlarımızın nasıl tanımlandığını ve gösterildiğini gösterirsek, davranışı değiştirmek zorunda değiliz. Üçüncü adım.
When /^I vote the post up$/ do
pending
end
İşte yeni işlevsellik hakkında konuşmaya başladığınız yer, ancak bunun nasıl çalışacağını tam olarak bilmiyorsunuz. Bir gönderiyi nasıl oylarsın? +1 veya benzeri bir görüntüyü, bir denetleyiciye JSON döndüren bir ajax yayını yapan bir şey tıklatabilirsiniz. Artık saf Rspec testine geçebilirsiniz.
- +1 görüntüsünün görüntülendiğinden emin olmak için görünümünüzü test edin,
- Denetleyicinize, doğru biçime (hem mutlu hem de mutsuz yollar verilen belirli bir ajax isteği geldiğinde doğru davrandığını test edin - geçersiz bir posta kimliği alınırsa ne olur? Kullanıcı bir günde 25 upvot kullandığında ne olur? Oy sayısını doğru bir şekilde arttırıyor mu?)
- JavaScript biçiminizi doğru biçimde verildiğinde javascript'inizi doğru yanıt verdiğini test edin (+1 resmini kullanıldığını gösterecek şekilde güncelliyor mu? (Google + 'yı burada düşünüyor ...) Teşekkür mesajı gösteriyor mu? Vb. )
Tüm bunlar davranışı etkilemez - ancak daha düşük seviyeli testlerle uğraşmayı bitirdiğinizde, bir gönderiyi nasıl oylayacağınız için adım tanımını doldurmak önemsiz olacaktır. Bu kadar basit olabilir click_link '+1'
. Ve adımların geri kalanı, yine doğrudan yapılması gereken test sonuçlarını test ediyor. İşiniz bittiğinde, özelliğinizin tamamlandığını ve bittiğini biliyorsunuzdur. Gerekli davranış değişirse, özelliğinizi düzenleyebilirsiniz, aksi takdirde mükemmel güvenlikle uygulama kodunuzu düzenleyebilirsiniz.
Umarım bu mantıklı gelir. Her şey kafamın üstünde, ama bence BDD ve TDD arasındaki farkı ve neden Salatalık ve RSpec'in farklı ihtiyaçlara hizmet ettiğini gösteriyor.