RSpec ve Salatalık gerçekten buna değer mi?


12

Çoğu RoR programcısının bağımlıları test ettiğini biliyorum ve büyük bir test paketinin avantajlarını anlıyorum, ancak teste başladığımda asla böyle büyük bir paket almıyorum ve her zaman "Doğru yolu test ediyor muyum? Gerçekten verimli mi?" Diye merak ediyorum. Sık sık yalnızca uygulamanın davranış biçimini test eden entegrasyon testleri ile uğraşıyorum.

İlk olarak, test gerçekten buna değer mi? Demek istediğim, sınavları yazmaya harcanan zaman gerçekten buna değer mi?

Sonra, RSpec kullanıyorum, yakın zamanda Salatalık keşfettim, bir süredir kullandım ama tüm bu adımları yazmanın gerçekten zahmete değip değmeyeceğini bilmiyorum? Adımları yeniden kullanabileceğimi biliyorum ama bu adımların çok eksiksiz olup olmadığını asla bilemiyorum: Örneğin, kullanıyorum Given I am logged in as (.+)ama tanımında söylemem gerekip gerekmediğini bilmiyorum Given there's a user called $1çünkü hiç yaratılmışsa kullanıcıyı çoğaltabilir ama bu her zaman bir adım atmaya değmez Given I am logged in as (.+). Nadiren yararlı olacak oldukça fazla kod var. Her gün test edilen parçalarda yeni hatalar yok sanırım ... Peki Salatalık RSpec ile karşılaştırıldığında gerçekten değerli mi?

Yanıtlar:


13

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.


Bu bana çok yardımcı oldu. Ama bir sorum daha var: Hem denetleyicileri hem de görünümleri test etmek için RSpec kullanarak bir projeye başladım, kod yaklaşık% 90 testlerle kaplıdır. Gerçekten salatalık ihtiyacım olduğunu ve şimdi adım ve senaryo yazmak için zaman harcadığımı düşünüyor musunuz? Yani, hepsini RSpec ile yapabilirim.
Cydonia7

@Skydreamer: Muhtemelen gerekli değildir, ancak iyi bir uygulama olabilir. Test yaptığınız sürece, doğru yoldasınız :)
sevenseacat

10

Bence test etmek bir sanat. TDD (RSpec veya başka bir çerçeve kullanarak) yapmak başlangıçta "zamanınızı boşa harcıyorsunuz" hissini verir. Herhangi bir üretim kodu yazmadığınız için bu anlaşılabilir bir durumdur.

Ancak, kod tabanınızı geliştirmeniz ve diğer her şeyin hala çalışmasını sağlamanız gerektiğinde TDD'nin avantajını görmeye başlarsınız . TDD, regresyon hatalarını olabildiğince erken yakalamanıza yardımcı olur. Bunu yapmak günlerimi kurtardı çünkü hatalarımı belirten odaklanmış testler yapmıştım.

Ayrıca, inceleme yapmak kod incelemeleri için yararlı olabilir, çünkü gözden geçireniniz hangi senaryoları test ettiğinizi ve kodunuzun nasıl kullanıldığını görebilir.

TDD'nin salınımına girdikten sonra, başka bir şey yapmak yanlış geliyor.


2
+1, deneyimden bahsetmiş olsa da, "TDD'nin sallanmasına girmek" kendi başına bir Herkül çabasıdır ve geliştiricilerin çoğunluğu için çok zor.
Wayne Molina

@Wayne M: Kabul etti. TDD-yivine girmek zor, ama faydaları çok büyük. :)
David Weiser

Bu zor hafifçe koyarak .. yıllardır başımı etrafında almak için çalışıyoruz :)
Wayne Molina

Ah evet, çabaya değer.
sevenseacat

2

Benim değerlendirmem, Salatalık cephesinde olduğun. Tüm bu adımları Yazma olduğu bir sürü sorun ve faydaları ağrıyı haklı yoktur. Burada Salatalık kullanmanın altı dezavantajı hakkında kapsamlı bir şekilde yazdım: Neden Salatalık Testi ile Rahatsız Etmeliyim?

Rspec veya Test :: Unit ile yapılan birim testleri ve düzenli entegrasyon testleri çok mantıklıdır, ancak neyse ki bunlar Salatalık testlerinden çok daha hızlıdır. Birincisi, Gherkin'in wordy ve garip sözdizimiyle savaşmak yerine saf Ruby kullanabilirsiniz.


2
Salatalık testi ile ilgili her bir noktanıza katılmadığımı rahatlıkla söyleyebilirim. * İyi metin editörlerini bozmaz (gedit'im vurgulayıp otomatik olarak tamamlar), * Mevcut Rspec kurulumunuzdan herhangi bir test kurulumunu Salatalık kurulumunuza kopyalamamalısınız (iki test testi çok farklı seviyelerde çalıştırılmamalıdır) ), * Salatalık hatası olmayan sayfalarınızı adlandırma konusunda tutarlı olamıyorsanız (Raylar, farklı günlerde rotaları farklı şeyler aramanıza izin vermez, neden Salatalık?) (devam edecek)
sevenseacat

1
* Adım dosyaları ile ilgili konvansiyonun ne olduğunu söylüyorsunuz, ancak konvansiyonu takip etmek için nereye bakacağınızı bilmediğinizi söylüyorsunuz? Bir gönderiyi tanıtmak neden post_steps.rb dışında bir şeyde olsun? * Özelliklerinizin kod olması gerekmemektedir, bu nedenle kelime anlamı önemsizdir - özellikleriniz, uygulamanızın nasıl davrandığına dair belgelerdir; * Ve son olarak, sadece yanlış yaptığınız için 'cesaret kırıcı kod kullanımını' eleştirebilirim .
sevenseacat

2

Şahsen inandığım şey bu RSpec testing is a definite must. Diyelim ki yeni bir özellik yazmak istiyorsunuz ve başka bir özelliğe de referans var ve bu özelliğe başka bir modül veya yöntemle referans verilebilir. Öyleyse, yazdıklarınızın uygulamanın başka bir bölümünü bozmadığından nasıl emin olabilirsiniz?

Büyük bir uygulamanız olduğunu ve genel uygulamaya kıyasla önemsiz bir şey kodladığınızı varsayın, tek bir kod satırını her değiştirdiğinizde çalıştığından emin olmak için uygulamadaki her bağlantıyı tıklatarak tüm uygulamayı yeniden test edersiniz?

Ancak, salatalık testinin bir zorunluluk olmadığına inanıyorum. RSpec'in kendisini kullanarak entegrasyon testinin, müşteriniz tarafından test yaptırmanız gerekene kadar ve daha mantıklı olduğunu düşünüyorum. Hangi benim deneyim NADİR olduğunu. Ekibiniz tamamen geliştiricilerden oluşuyorsa, RSpec özellik testi için Salatalık adımlarını değiştirmeniz gerektiğini düşünüyorum. Sanırım RSpec 3 DSL'den sonra testler oldukça okunabilir.

Örn:

Salatalık Basamak Tanımı:

Given /^I am logged in$/ do
  visit login_path
  fill_in :name, :with => 'Joe'
  fill_in :password, :with => 'Password'
  click_button 'submit'
end

RSpec Özellik testi:

feature 'Given the user is logged in' do
      visit login_path
      fill_in :name, :with => 'Joe'
      fill_in :password, :with => 'Password'
      click_link_or_button 'submit'
end

Salatalık özelliklerine sahip olmak yerine, RSpec özelliklerinin başka bir adım tanımı yazmanın ekstra baş ağrısı olmadan aynı şeyi yaptığını düşünüyorum.

Bunun dışında tamamen kendi tercihiniz.

Umarım bu biraz anlamanıza yardımcı olabilir.


0

Bence ilk şey uygulamalar ve somut çerçeveler arasında ayrım yapmak. Salatalık onun BDD değil, RSpec onun TDD değil.

Sisteminizi test etmek istiyorsanız RSpec iyi bir araçtır, TDD veya BDD'yi RSpec ile yapabilirsiniz, aslında TDD ve BDD aynı şeydir. Birisi "BDD TDD doğru yapılmış" diyor ve ben tamamen buna katılıyorum, BDD öncelikle test yöntemleri / sınıfları yerine özellikleri / davranışları test hakkında. Aslında Kent Beck'in özellikleriyle ilgili tanımladığı TDD, ancak BDD birçok insana bu önemli farkı ve Dan North'dan kalkınma topluluğuna büyük bir katkı anlamasına yardımcı oluyor.

İş adamları ile iletişim kurmak için daha iyi bir araca ihtiyacınız olduğunu düşünüyorsanız, örneğin salatalık iş adamlarınızın veya Ürün sahibinizin ekibin senaryoları yazmasına veya gözden geçirmesine yardımcı olmasına izin veriyorsa Salatalık kullanın. Diğer insanlar salatalık sever, çünkü bu senaryolar bir sistemin gerçekten iyi bir canlı dokümantasyonudur, bu tür belgelere ihtiyacınız olduğunu düşünüyorsanız salatalık deneyin.

Özetle:

  • TDD / BDD'yi kendiniz veya takımınız yapmak istiyorsanız -> RSpec'i deneyin
  • Kullanıcı Geçmişleri ve Senaryoları ile iş ile iletişim kurmanın daha iyi bir yolunu istiyorsanız -> salatalık deneyin
  • Sistem özelliklerinizin canlı dokümantasyonunu istiyorsanız -> salatalığı deneyin.

Tabii ki son ikisi ilişkili bir yüksek maliyet var, gerçekten ihtiyacınız olup olmadığını değerlendirmek gerekir ve çabaya değer, bu ders elbette tamamen projenize ve ortamınıza ve karar size bağlıdır.

Ancak her zaman RSpec ve Salatalığın sadece araçlar olduğunu ve araçların somut sorunları, hangi sorunu çözmek istediğinizi çözdüğünü unutmayın; kendinize bu soruyu sorun ve muhtemelen doğru aracı seçmek için daha iyi bir konumdasınız. Daha iyi bir programcı olmak, bu kararları X veya Y framework / tool / library / technology kullanmakla ilgili değil.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.