2013-03-30 15 views
8

Tôi thích cách Cucumber kết nối thông số kỹ thuật của người dùng với thử nghiệm tích hợp. Phần Cucumber ít nhiều rõ ràng đối với tôi.
Tôi đấu tranh khi nói đến những gì cần được thử nghiệm với rspec (thử nghiệm không tích hợp) và những gì không nên.
Có quyền kiểm tra đơn vị với rspec điều gì đó đã được thử nghiệm với Cucumber (ví dụ: kiểm tra đơn vị sẽ thất bại 100% nếu thử nghiệm Cucumber không thành công và kiểm tra đơn vị sẽ thành công 100% nếu thử nghiệm thành công)?Đặt giới hạn giữa rspec và dưa chuột trong Rails

Để cụ thể, tôi có ba ví dụ tôi muốn giải quyết.

  1. Đây là trường hợp từ sách RSpec. Họ có sau Cucumber scenario:

    Given I am not yet playing 
    When I start a new game 
    Then I should see "Welcome to Codebreaker!" 
    And I should see "Enter guess:" 
    

    Họ xây dựng hai rspec-tests ngay sau:

    describe "#start" do 
        it "sends a welcome message" do 
    
        end 
        it "prompts for the first guess" do 
    
        end 
    end 
    
  2. Một ví dụ khác là kiểm tra định tuyến hoặc chuyển hướng hành động, trong khi có các tình huống sau:

    Given I am at the login page 
    When I fill in the right username and password 
    Then I should be at the index page 
    
  3. Đôi khi chúng tôi kiểm tra những người trợ giúp đã được thử nghiệm với Cucumber:

    Given Mike has spent 283 minutes online 
    When I go to the Mike's profile page 
    Then I should see "4:43" for "Time online:" 
    

    tôi có lẽ nên kiểm tra helper mà phá vỡ thành "04:43" phút 283, nhưng nó chỉ ra rằng nó đã được thử nghiệm với Cucumber.

Đây có thể không phải là ví dụ tốt nhất, nhưng nó minh họa những gì tôi đang nói đến.
Đối với tôi, các thử nghiệm đó là trùng lặp.

Bạn có thể nhận xét về các ví dụ ở trên không?

Có nguyên tắc hoặc nguyên tắc nào về những gì cần được kiểm tra với rspec, khi có Cucumber tests chưa?

Trả lời

10

Tất cả điều này chỉ là ý kiến ​​cá nhân của tôi về chủ đề mở rộng này. Một số người có thể không đồng ý và đủ hài hước họ có thể.

Như các chủ trương chung, bạn nên sử dụng Dưa chuột để kiểm tra toàn bộ ngăn xếp ứng dụng, một cái gì đó được gọi là kinh nghiệm dùng. Ngăn xếp ứng dụng này có thể bao gồm nhiều đối tượng độc lập nhỏ hơn nhưng giống như người dùng sử dụng ứng dụng của bạn sẽ không quan tâm đến các chi tiết đó, thử nghiệm dưa chuột của bạn không nên quan tâm đến chúng và thay vào đó tập trung vào lớp ngoài của ứng dụng của bạn .

RSpec (trong thiết lập của bạn!) nên mặt khác đặt trọng tâm chính vào những đối tượng nhỏ, các khối xây dựng của ứng dụng của bạn.

Có một vấn đề lớn với ví dụ ứng dụng nhỏ từ những cuốn sách: Họ phải nhỏ!

Boarder giữa lớp ngoài của ứng dụng và nội thất của nó bị mờ. Toàn bộ ứng dụng được xây dựng với hai đối tượng! Thật khó để phân biệt những gì nên kiểm tra những gì. Khi ứng dụng của bạn phát triển về kích thước, việc hiển thị thử nghiệm trải nghiệm người dùng (dưa chuột) là đối tượng - kiểm tra trạng thái thử nghiệm/thông báo mong đợi (RSpec).

Sử dụng ví dụ thứ hai của bạn:

Với câu chuyện này Dưa chuột:

Given I am at the login page 
When I fill in the right username and password 
Then I should be at the index page 

RSpec:

Bạn có thể sẽ có một số loại mô hình tài:

  • kiểm tra tên người dùng cú pháp (phải bắt đầu bằng vốn chẳng hạn)
  • mật khẩu kiểm tra phải có 7 nhân vật có số vv ...

Bạn có thể có một số loại đối tượng xác thực:

  • thử nghiệm cho lần đăng nhập hợp lệ và không hợp lệ vv
  • thử nghiệm cho trường hợp ngoại lệ được ném. ...

Điều gì xảy ra nếu cơ sở dữ liệu Xác thực của bạn nằm trên máy chủ khác?

  • mock cơ sở dữ liệu kết nối và xác thực và kiểm tra xem cơ sở dữ liệu có nhận được yêu cầu từ đối tượng xác thực không.

Và yada yada yada ... Mãi mãi kiểm tra dưa chuột của bạn sẽ bảo vệ mục đích chung của bạn ứng dụng đăng nhập người dùng. Ngay cả khi bạn thêm hoặc thay đổi hành vi, dưới mui xe, miễn là vượt qua bài kiểm tra này, bạn có thể tự tin rằng người dùng có thể đăng nhập.

  • bạn nên thử nghiệm những thứ một lần (ở một nơi)
  • đối tượng chịu trách nhiệm của mình để thử nghiệm massage đến nó (đối tượng public interface) cho nhà nước (giá trị trả về)
  • khi đối tượng của bạn phụ thuộc vào đối tượng khác (gửi của nó một tin nhắn) không kiểm tra nó cho nhà nước (giá trị trả lại) mà đối tượng chịu trách nhiệm cho nó.
  • khi đối tượng của bạn phụ thuộc vào đối tượng khác (gửi thông báo của nó) giả định đối tượng thứ hai đó và kiểm tra xem nó có nhận được thông báo của bạn hay không.

Nói chung câu hỏi của bạn quá rộng và bạn sẽ không tìm thấy câu trả lời duy nhất, những người khác nhau sẽ có ý tưởng khác nhau. Những gì bạn nên tập trung vào là để kiểm tra, tốt nhất có thể và với thời gian bạn chắc chắn sẽ tìm thấy đúng cách cho bạn.Không phải là một bộ đồ thử nghiệm tuyệt vời thì tốt hơn là không.

Bởi vì thiết kế tốt giúp để viết thử nghiệm tốt Tôi muốn giới thiệu Practical Object-Oriented Design in Ruby: An Agile Primer bởi Sandi Metz (đó là một trong những cuốn sách tốt nhất mà tôi đã đọc)

+2

Big lên đến Sandi Metz, cuốn sách tuyệt vời. Đọc khác thực sự tốt trên đầu trang là cuốn sách RSpec của David Chelimsky, bao gồm RSpec và dưa chuột trong một số tiền hợp lý của chiều sâu – muttonlamb

+0

Cảm ơn bạn @ Kocur4d! –

+0

Theo nguyên tắc chung, bạn nên sử dụng Cucumber ** nếu và chỉ khi ** chủ sở hữu sản phẩm/khách hàng của bạn cần có khả năng đọc các bài kiểm tra :) –