2011-01-27 20 views
13

Tôi đã viết một API REST cơ bản bằng cách sử dụng sinatra.Viết các bài kiểm thử đơn vị trong Ruby cho một API REST

Có ai biết cách tốt nhất để viết kiểm tra cho nó không? Tôi muốn làm như vậy bằng cách sử dụng Ruby.

Tôi đã thực hiện thử nghiệm ban đầu bằng curl. Nhưng tôi muốn làm điều gì đó mạnh mẽ hơn. Đây là API đầu tiên của tôi - có bất kỳ điều gì cụ thể mà tôi nên thử nghiệm không?

+0

có vấn đề gì với curl? Bạn có thể viết các bài kiểm tra đơn vị chạy curl và kiểm tra bạn lấy lại những gì bạn mong đợi - tiêu đề và nội dung. Khác bạn có thể xem xét một cái gì đó như http://watir.com/? – iain

+2

@lain: sử dụng Watir hoặc curl không phải là bài kiểm tra đơn vị. Nói chung, đó là một thử nghiệm chức năng hoặc tích hợp. – Chamnap

+1

Kiểm thử đơn vị đang thử nghiệm các đơn vị chức năng từ * trong * mã, chứ không phải từ bên ngoài. Sử dụng curl hoặc bất cứ thứ gì giống như nó nằm ngoài mã đang tìm kiếm. Chúng tôi cần biết thêm về những gì các dịch vụ web của bạn đang thực hiện để giúp bạn kiểm tra đơn vị. –

Trả lời

4

Bạn có thể có một cái nhìn tại phương pháp này http://anthonyeden.com/2013/07/10/testing-rest-apis-with-cucumber-and-rack.html

mặc dù nhiều người có thể nói rằng việc sử dụng dưa chuột thực sự nhiều ứng dụng hoặc thử nghiệm chấp nhận và không kiểm tra đơn vị, nó chứa một cách tiếp cận để tạo các tiêu đề HTTP và tạo thành http yêu cầu, mà tôi đoán có thể là nơi bạn đang mắc kẹt?

Cá nhân tôi không có vấn đề gì với điều đó vì nếu bạn thực sự kiểm tra API, bạn có thể phải thử bất kỳ đơn vị mã nào mà api có thể đang nói chuyện (ví dụ: bạn vẫn kiên trì dữ liệu)

Thấy tôi là một người QA không phải là nhà phát triển, tôi hoàn toàn hài lòng với việc sử dụng dưa chuột và thử nghiệm ở cấp độ đó, nhưng tôi cũng đánh giá cao điều đó khi kiểm tra đơn vị phát triển, vì vậy trong khi bạn có thể sử dụng rSpec thay vì Cuke, có lẽ mẹo về 'kiểm tra giá' sẽ hữu ích cho những gì bạn đang cố gắng hoàn thành.

+0

Liên kết đó hiện đã chết, nó trả về 404 –

+0

Có vẻ như trang web wordpress của anh ta đã bị tấn công và anh ta đang thiết lập một ngôi nhà mới http: // anthonyeden.com vào thời điểm này bạn có thể phải thử và liên hệ với anh ta hoặc thử sử dụng một trong các máy thời gian internet để xem trang web đó trông như thế nào vào khoảng thời gian tôi đăng câu trả lời ở trên. –

+1

đã sửa liên kết. một số người khác cũng có ý nghĩa cố gắng để thực hiện chỉnh sửa, nhưng người đánh giá idiot dường như nghĩ rằng nó là quá nhỏ của một sự thay đổi. cá nhân sửa một liên kết không hoạt động thành một liên kết làm việc có vẻ không nhỏ với tôi .. –

0

Tôi sẽ sử dụng fakeweb đá quý để làm thử nghiệm đơn vị với các dịch vụ web.

+0

Đây không phải là thử nghiệm đơn vị. Giống như Chamnap đã nói ở trên, đó là thử nghiệm tích hợp. –

+1

Không, tôi nghĩ rằng đó là một thử nghiệm đơn vị, vì nó chặn với mọi yêu cầu http và gửi lại dữ liệu giả mà chúng tôi đã chỉ định. – Chamnap

6

Cách tốt nhất là vấn đề quan điểm :) Cá nhân, tôi thích đơn giản và sạch sẽ. Với các công cụ như minitest, Watirrest-client, bạn có thể kết hợp một thử nghiệm rất đơn giản về cả giao diện REST cũng như kiểm tra dịch vụ web của bạn thông qua trình duyệt thực (tất cả các trình duyệt chính đều được hỗ trợ).

#!/usr/bin/ruby 
# 
# Requires that you have installed the following gem packages: 
# json, minitest, watir, watir-webdrive, rest-client 
# To use Chrome, you need to install chromedriver on your path 

require 'rubygems' 
require 'rest-client' 
require 'json' 
require 'pp' 
require 'minitest/autorun' 
require 'watir' 
require 'watir-webdriver' 

class TestReportSystem < MiniTest::Unit::TestCase 
    def setup 
     @browser = Watir::Browser.new :chrome # Defaults to firefox. Can do Safari and IE too. 
     # Log in here..... 
    end 

    def teardown 
     @browser.close 
    end 

    def test_report_lists # For minitest, the method names need to start with test 
     response = RestClient.get 'http://localhost:8080/reporter/reports/getReportList' 
     assert_equal response.code,200 
     parsed = JSON.parse response.to_str 
     assert_equal parsed.length, 3 # There are 3 reports available on the test server 
    end 

    def test_on_browser 
     @browser.goto 'http://localhost:8080/reporter/exampleReport/simple/genReport?month=Aug&year=2012' 
     assert(@browser.text.include?('Report for Aug 2012')) 
    end 
end 

Chạy các trường hợp kiểm tra bằng cách thực thi tập lệnh. Có rất nhiều hệ thống thử nghiệm khác và các máy khách REST cho Ruby có thể được đưa vào hoạt động theo cách tương tự.

3

Bạn có thể thử sử dụng airborne mà là một khuôn khổ văn bản chỉ cho mục đích này:

https://github.com/brooklynDev/airborne

Bạn có thể kiểm tra chống lại hoặc là một API trực tiếp, hoặc chống lại một ứng dụng Sinatra, nho, Rails.

Các vấn đề liên quan