RSpec và dưa chuột có thực sự xứng đáng không?


12

Tôi biết hầu hết các lập trình viên RoR đang thử nghiệm người nghiện và tôi hiểu những lợi thế của bộ thử nghiệm lớn nhưng khi tôi bắt đầu thử nghiệm, tôi không bao giờ có được một bộ lớn như vậy và tôi luôn tự hỏi "Tôi có thử nghiệm đúng cách không? Có thực sự hiệu quả không?". Tôi thường xử lý các thử nghiệm tích hợp chỉ kiểm tra cách ứng dụng hoạt động.

Đầu tiên, thử nghiệm có thực sự xứng đáng không? Ý tôi là, thời gian dành cho bài kiểm tra viết có thực sự xứng đáng không?

Sau đó, tôi sử dụng RSpec, gần đây tôi đã phát hiện ra Dưa chuột, đã sử dụng nó một thời gian nhưng tôi không biết liệu viết tất cả các bước này có thực sự đáng phiền không? Tôi biết tôi có thể sử dụng lại các bước nhưng tôi không bao giờ biết liệu các bước này có quá hoàn chỉnh hay không: Ví dụ: tôi đã sử dụng Given I am logged in as (.+)nhưng tôi không biết liệu tôi có phải nói theo định nghĩa của nó không Given there's a user called $1vì nó có thể nhân đôi người dùng nếu được tạo nhưng điều đó không đáng để luôn luôn có một bước trước đó Given I am logged in as (.+). Đó là khá nhiều mã có thể hiếm khi hữu ích. Tôi đoán không có lỗi mới trên các bộ phận được kiểm tra mỗi ngày ... Vậy dưa chuột có thực sự đáng giá so với RSpec?

Câu trả lời:


13

'Ah-ha!' Khoảnh khắc về thử nghiệm trong Ruby và Rails xuất hiện khi tôi thực sự ngồi xuống và đọc các tài nguyên dứt khoát về chủ đề này, các cuốn sách RspecCucumber . Tôi đã chia sẻ sự khinh thường ban đầu của bạn về Dưa chuột, nhưng sau đó tôi nhận ra rằng tôi đang nhìn bức tranh từ góc độ khá sai.

Về cơ bản, Cucumber nói về BDD (phát triển theo hành vi) - bạn sử dụng Cucumber để lên kế hoạch cho các tính năng của mình, những gì bạn sẽ làm việc tiếp theo. Hmm, tiếp theo bạn muốn người dùng có thể quảng cáo bài viết trên một diễn đàn hoặc một cái gì đó (để lấy cắp một ví dụ;)) Vì vậy, bạn viết một cái gì đó đơn giản.

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.

Lưu ý rằng không có tài liệu tham khảo cho bất kỳ mã nào liên quan trong đó khá nhiều. Điều đó đến trong các bước của bạn. Khi bạn cấu trúc lại mã của mình, bạn có thể phải thay đổi định nghĩa bước của mình, nhưng hành vi (tính năng của bạn) sẽ không bao giờ cần thay đổi.

Bây giờ mỗi khi bạn chạy tính năng Cucumber của mình, bạn sẽ được hướng dẫn cách kiểm tra tính năng này bằng cách sử dụng TDD (phát triển theo hướng kiểm tra). Điều này được thực hiện ở mức thấp hơn bằng cách sử dụng RSpec.

Lần chạy đầu tiên - định nghĩa bước đầu tiên của tôi là không xác định. Sao chép khối để xác định khối đó trong user_steps.rb hoặc thậm chí session_steps.rb vì nó liên quan đến người dùng và phiên của họ. Bây giờ, làm thế nào để bạn xác định rằng một người dùng đã đăng nhập? Bạn có thể đưa họ thông qua quá trình đăng nhập.

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

Nên tất cả đều hạnh phúc. Bước thứ hai.

Given /^I can see the post "(.+)"$/ do |name|
  visit post_path(Post.find_by_name(name))
end

Lại khá dễ. Lưu ý rằng nếu chúng tôi hoàn toàn làm lại quá trình đăng nhập của mình hoặc cách bài viết của chúng tôi được xác định và hiển thị, chúng tôi không phải thay đổi hành vi. Bước thứ ba.

When /^I vote the post up$/ do
  pending 
end 

Đây là nơi bạn bắt đầu nói về chức năng mới, nhưng bạn hoàn toàn không biết nó sẽ hoạt động như thế nào. Làm thế nào để bạn bỏ phiếu một bài viết lên? Bạn có thể nhấp vào hình ảnh của +1 hoặc một cái gì đó, bài đăng ajax cho bộ điều khiển, trả về JSON hoặc một số thứ khác. Vì vậy, bây giờ bạn có thể chuyển sang thử nghiệm Rspec thuần túy.

  • Kiểm tra chế độ xem của bạn để đảm bảo hình ảnh +1 được hiển thị,
  • Kiểm tra bộ điều khiển của bạn rằng nó hoạt động chính xác khi nhận được yêu cầu ajax đã cho đúng định dạng (cả đường dẫn hạnh phúc và không vui - điều gì xảy ra nếu nhận được ID bài đăng không hợp lệ? Điều gì xảy ra nếu người dùng đã sử dụng hết 25 lượt upvote trong một ngày? Nó có tăng số phiếu chính xác không?)
  • Kiểm tra javascript của bạn rằng nó phản hồi chính xác khi được cung cấp một blob JSON đúng định dạng (nó có cập nhật hình ảnh +1 để hiển thị nó đã được sử dụng không? (Nghĩ về Google+ ở đây ...) Nó có hiển thị thông báo cảm ơn không? V.v. )

Tất cả những điều này không ảnh hưởng đến hành vi - nhưng khi bạn hoàn thành việc xử lý kiểm tra cấp thấp hơn, sẽ rất đơn giản để điền vào định nghĩa bước cho cách bỏ phiếu đăng bài. Nó có thể đơn giản như click_link '+1'. Và các bước còn lại là kiểm tra kết quả, điều này một lần nữa nên đơn giản để làm. Và khi bạn hoàn thành, sau đó bạn biết tính năng của bạn đã hoàn tất và kết thúc. Nếu hành vi cần thiết thay đổi, bạn có thể điều chỉnh tính năng của mình, ngoài ra bạn có thể điều chỉnh mã triển khai của mình một cách an toàn tuyệt đối.

Tôi hy vọng điều này có ý nghĩa. Tất cả đều nằm ngoài đỉnh đầu của tôi, nhưng tôi nghĩ nó thể hiện sự khác biệt giữa BDD và TDD, và tại sao Cucumber và RSpec phục vụ các nhu cầu khác nhau.


Điều này thực sự hữu ích với tôi. Nhưng tôi có thêm một câu hỏi: Tôi đã bắt đầu một dự án sử dụng RSpec để kiểm tra cả bộ điều khiển và chế độ xem, mã được bao phủ khoảng 90% với các thử nghiệm. Bạn có nghĩ rằng tôi thực sự cần Cucumber và dành thời gian cho việc viết các bước và kịch bản bây giờ không? Ý tôi là, tôi có thể làm tất cả những điều đó với RSpec.
Cydonia7

@Skydreamer: Có lẽ không cần thiết, nhưng nó có thể là một thực hành tốt. Miễn là bạn đang thực hiện thử nghiệm, bạn đang đi đúng hướng :)
Sevenseacat

10

Kiểm tra, theo tôi, là một nghệ thuật. Làm TDD (sử dụng RSpec hoặc bất kỳ khuôn khổ nào khác) ban đầu cảm thấy như bạn đang "lãng phí thời gian của mình". Điều này là dễ hiểu bởi vì bạn không viết bất kỳ mã sản xuất nào.

Tuy nhiên, bạn bắt đầu thấy lợi ích của TDD khi bạn cần tăng cường cơ sở mã của mình trong khi đảm bảo mọi thứ khác vẫn hoạt động. TDD giúp bạn bắt lỗi hồi quy càng sớm càng tốt. Làm điều này đã giúp tôi tiết kiệm được nhiều ngày làm việc vì tôi đã tập trung vào các bài kiểm tra chỉ ra lỗi của mình.

Hơn nữa, việc kiểm tra có thể có lợi cho việc đánh giá mã bởi vì người đánh giá của bạn có thể thấy những kịch bản bạn đang kiểm tra và cách sử dụng mã của bạn.

Một khi bạn rơi vào vòng xoáy của TDD, làm bất cứ điều gì khác cảm thấy sai.


2
+1 mặc dù nói từ kinh nghiệm, "hòa mình vào TDD" là một nỗ lực của Herculean và rất khó thực hiện đối với phần lớn các nhà phát triển.
Wayne Molina

@Wayne M: Đồng ý. Đi vào rãnh TDD rất khó, nhưng lợi ích thì rất lớn. :)
David Weiser

Thật khó để làm cho nó nhẹ đi .. đã cố gắng trong nhiều năm để có được cái đầu của tôi xung quanh nó :)
Wayne Molina

Ồ vâng, nó cũng đáng nỗ lực.
Sevenseacat

2

Tôi nghĩ rằng bạn đang ở ngay trên mặt trận dưa chuột. Viết tất cả các bước đó rất nhiều rắc rối và lợi ích không thể biện minh cho nỗi đau. Tôi đã viết nhiều về sáu nhược điểm của việc sử dụng Dưa chuột ở đây: Tại sao lại làm phiền với việc kiểm tra dưa chuột?

Các bài kiểm tra đơn vị và kiểm tra tích hợp thường xuyên, được thực hiện bằng Rspec hoặc Test :: Đơn vị thực sự có ý nghĩa rất lớn, nhưng may mắn là những bài này nhanh hơn nhiều so với các bài kiểm tra Cucumber. Đối với một người bạn có thể sử dụng Ruby thuần túy thay vì phải chiến đấu với cú pháp khó hiểu và lúng túng của Gherkin.


2
Tôi hoàn toàn có thể nói rằng tôi không đồng ý với mọi quan điểm của bạn về thử nghiệm dưa chuột. * Nó không phá vỡ các trình soạn thảo văn bản tốt (gedit của tôi sẽ làm nổi bật và tự động hoàn thành nó tốt), * bạn không nên sao chép bất kỳ thiết lập thử nghiệm nào từ thiết lập Rspec hiện tại sang thiết lập Cucumber của bạn (hai bộ thử nghiệm chạy ở các cấp độ khác nhau về độ chi tiết), * nếu bạn không nhất quán về việc đặt tên cho các trang của mình không phải là lỗi của Cucumber (Rails sẽ không cho phép bạn gọi các tuyến đường khác nhau vào các ngày khác nhau, vậy tại sao Cucumber?) (sẽ được tiếp tục)
Sevenseacat

1
* Bạn nói quy ước về các tập tin bước là gì nhưng sau đó nói rằng bạn sẽ không biết tìm ở đâu để tuân theo quy ước? Tại sao việc quảng cáo một bài đăng sẽ ở bất cứ thứ gì khác ngoài post_steps.rb? * Các tính năng của bạn không được coi là mã, vì vậy tính không liên quan - các tính năng của bạn là tài liệu về cách ứng dụng của bạn hoạt động; * Và cuối cùng, tôi chỉ có thể phê bình 'sử dụng lại mã không khuyến khích' khi bạn làm sai .
Sevenseacat

2

Những gì cá nhân tôi tin là như vậy RSpec testing is a definite must. Ví dụ, giả sử bạn muốn viết một tính năng mới và cũng có tham chiếu đến một số tính năng khác và tính năng đó có thể được tham chiếu với một số mô-đun hoặc phương thức khác. Vậy làm thế nào bạn có thể chắc chắn rằng những gì bạn đang viết không phá vỡ bất kỳ phần nào khác của ứng dụng?

Giả sử rằng bạn có một ứng dụng lớn và bạn đã mã hóa thứ gì đó tầm thường so với ứng dụng tổng thể, bạn sẽ kiểm tra lại toàn bộ ứng dụng bằng cách nhấp vào từng liên kết trong ứng dụng để đảm bảo nó hoạt động mỗi khi bạn thay đổi một dòng mã?

Tuy nhiên, tôi tin rằng thử nghiệm dưa chuột không phải là một điều bắt buộc. Tôi nghĩ rằng thử nghiệm tích hợp sử dụng RSpec tự nó có ý nghĩa hơn cho đến khi và trừ khi bạn phải kiểm tra bởi khách hàng của mình. Mà theo kinh nghiệm của tôi là HIẾM. Nếu nhóm của bạn bao gồm toàn bộ các nhà phát triển thì tôi nghĩ rằng bạn nên thay thế các bước Cucumber để thử nghiệm tính năng RSpec. Và tôi nghĩ sau RSpec 3 DSL, các bài kiểm tra có thể đọc được khá nhiều.

Ví dụ :

Bước định nghĩa dưa chuột:

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

Kiểm tra tính năng RSpec:

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

Tôi nghĩ rằng thay vì có các tính năng Cucumber, các tính năng RSpec làm điều tương tự mà không phải đau đầu thêm khi viết các định nghĩa bước khác.

Khác hơn đó cũng hoàn toàn là sở thích của riêng bạn.

Hy vọng điều này có thể giúp bạn hiểu một chút.


0

Theo tôi, điều đầu tiên cần phân biệt giữa thực tiễn và khung cụ thể. Dưa chuột không phải là BDD, RSpec không phải TDD.

Nếu bạn muốn kiểm tra RSpec hệ thống của mình, đây là một công cụ tốt, bạn có thể thực hiện TDD hoặc BDD với RSpec, trên thực tế TDD và BDD là như nhau. Ai đó nói rằng "BDD TDD của nó được thực hiện đúng" và tôi hoàn toàn đồng ý với điều đó, BDD chủ yếu nói về các tính năng / hành vi kiểm tra thay vì các phương thức / lớp kiểm tra. Trên thực tế, TDD mà Kent Beck mô tả về các tính năng của nó, nhưng BDD giúp nhiều người hiểu được sự khác biệt chính này và sự đóng góp to lớn của Dan North cho cộng đồng phát triển.

Sử dụng Dưa chuột nếu bạn cảm thấy rằng bạn cần một công cụ tốt hơn để giao tiếp với những người kinh doanh, ví dụ nếu dưa chuột cho phép người kinh doanh hoặc chủ sở hữu sản phẩm của bạn giúp nhóm viết hoặc sửa đổi các tình huống. Những người khác thích dưa chuột vì kịch bản này là một tài liệu trực tiếp thực sự tốt của một hệ thống, nếu bạn cảm thấy rằng bạn cần loại tài liệu này hãy thử dưa chuột.

Tóm tắt:

  • Nếu bạn muốn tự làm TDD / BDD hoặc nhóm của bạn -> hãy thử RSpec
  • Nếu bạn muốn một cách tốt hơn để giao tiếp với doanh nghiệp với Lịch sử và Kịch bản người dùng -> hãy thử dưa chuột
  • Nếu bạn muốn tài liệu trực tiếp về các tính năng hệ thống của bạn -> hãy thử dưa chuột.

Tất nhiên hai cái cuối cùng có chi phí cao, bạn cần đánh giá xem bạn có thực sự cần điều đó và đáng để nỗ lực hay không, khóa học này phụ thuộc hoàn toàn vào dự án và môi trường của bạn và quyết định tùy thuộc vào bạn.

Nhưng hãy luôn nhớ rằng RSpec và Cucumber chỉ là công cụ và công cụ giải quyết các vấn đề cụ thể, bạn muốn giải quyết vấn đề gì?, Hãy tự hỏi mình câu hỏi này và có lẽ bạn đang ở vị trí tốt hơn để chọn đúng công cụ. Trở thành một lập trình viên tốt hơn về việc đưa ra các quyết định này chứ không phải về việc sử dụng khung hoặc công cụ / thư viện / công nghệ X hoặc Y.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.