RSpec: Sự khác biệt giữa một tính năng và một đặc tả yêu cầu là gì?


113

Sự khác biệt về khái niệm giữa thông số tính năng của Rspec và thông số kỹ thuật yêu cầu là gì?

Từ các tài liệu về đặc điểm kỹ thuật:

Thông số tính năng là các bài kiểm tra cấp cao nhằm thực hiện các phần chức năng thông qua một ứng dụng. Họ chỉ nên điều khiển ứng dụng thông qua giao diện bên ngoài của nó, thường là các trang web.

Và đối với thông số kỹ thuật yêu cầu:

Thông số kỹ thuật yêu cầu cung cấp một lớp bao bọc mỏng xung quanh các bài kiểm tra tích hợp của Rails và được thiết kế để thúc đẩy hành vi thông qua toàn bộ ngăn xếp, bao gồm định tuyến (do Rails cung cấp) và không bị lỗi (điều đó tùy thuộc vào bạn). Với thông số kỹ thuật yêu cầu, bạn có thể:

  • chỉ định một yêu cầu duy nhất
  • chỉ định nhiều yêu cầu trên nhiều bộ điều khiển
  • chỉ định nhiều yêu cầu trong nhiều phiên

Tôi biết rằng thông số kỹ thuật tính năng sử dụng Capybara và thông số kỹ thuật yêu cầu thì không. Nhưng điều đó hầu như không xứng đáng với các khái niệm khác nhau.

Câu trả lời:


147

Sự khác biệt về khái niệm là bạn thường thử nghiệm một câu chuyện người dùng và tất cả các tương tác phải được điều khiển thông qua giao diện người dùng. Đó là nơi Capybara xuất hiện. Một thông số kỹ thuật yêu cầu vẫn đang kiểm tra hành vi của ứng dụng của bạn và không có kỳ vọng về khả năng đọc mà kiểm tra chấp nhận sẽ có. Vì vậy, có tính năng cho cú pháp cải tiến cho các thử nghiệm chấp nhận.

Sự khác biệt về mặt kỹ thuật bao gồm thông số kỹ thuật yêu cầu bao gồm các bài kiểm tra tích hợp Rails, trong khi thông số kỹ thuật tính năng thì không. Điều này có nghĩa là với các thông số kỹ thuật yêu cầu, bạn có thể sử dụng các phương thức lấy, đăng, đặt, xóa và khẳng định chống lại phản hồi. Với thông số kỹ thuật tính năng, bạn nên thúc đẩy tất cả tương tác thông qua trình duyệt và sử dụng các phương pháp như truy cập và xác nhận đối với trang.

Tôi khuyên bạn nên đọc feature_spec.feature trong mã nguồn rspec-rails trên github. Tôi hi vọng cái này giúp được.


2
Vì vậy, bạn có khuyên bạn nên sử dụng cả thông số kỹ thuật tính năng và yêu cầu, hay một trong hai là đủ? (Là mới đến TDD ...)
robertwbradford

2
Tôi sử dụng cả hai, @robertwbradford. Tôi sử dụng các thông số kỹ thuật của tính năng để thúc đẩy hoạt động bên ngoài của mình trong các thử nghiệm - thử nghiệm trải nghiệm người dùng và sau đó xây dựng chức năng bằng các thử nghiệm đơn vị. Tôi sử dụng yêu cầu thông số kỹ thuật để thử nghiệm phản ứng - ví dụ như trong một sessions_spec tôi có thể có một mô tả "GET /login"khối với kỳ vọng trong itkhối như expect(response.status).to eq(200)expect(response).to render_template(:new), hoặc trong một describe "POST /sessions", một context "with valid credentials"khối, với expect(response).to redirect_to(user)follow_redirect!; expect(response.body).to include("Signed in")
Richard Jordan

5
Và bạn có sử dụng thông số kỹ thuật của bộ điều khiển không? Có vẻ như có một chút trùng lặp giữa những gì bạn kiểm tra trong thông số kỹ thuật yêu cầu và những gì thường được kiểm tra trong thông số kỹ thuật bộ điều khiển.
Ernesto

5
Nói như vậy, bài đăng được liên kết ở trên mô tả rõ ràng sự khác biệt. Sử dụng thông số kỹ thuật yêu cầu để kiểm tra qua API, sử dụng thông số kỹ thuật tính năng để kiểm tra thông qua giao diện người dùng.
Damien Roche

2
@RichardJordan: Một câu hỏi: Trong thông số kỹ thuật của tính năng, bạn có nên sử dụng đường dẫn Rails (tức là visit users_path) hoặc chuỗi mã cứng ( visit '/users') không ?. Cá nhân tôi không muốn sử dụng bất kỳ nội bộ ứng dụng nào trong những loại thông số kỹ thuật đó.
tokland
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.