2008-10-17 30 views
8

Vì vậy, tôi đã bắt đầu tạo một số xét nghiệm đơn vị Ruby sử dụng Selenium RC để kiểm tra ứng dụng web của tôi trực tiếp trong trình duyệt. Tôi đang sử dụng số Selenum-Client cho ruby. Tôi đã tạo một lớp cơ sở cho tất cả các bài kiểm tra selen khác của tôi để kế thừa từ đó.Selenium RC: Chạy thử nghiệm trong nhiều trình duyệt tự động

Điều này tạo ra nhiều trường hợp SeleniumDriver và tất cả các phương thức bị thiếu được gọi trên mỗi trường hợp. Điều này về cơ bản chạy các bài kiểm tra song song.

Làm cách nào để những người khác tự động hóa điều này?

Đây là triển khai thực hiện của tôi:

class SeleniumTest < Test::Unit::TestCase 
    def setup 
    @seleniums = %w(*firefox *iexplore).map do |browser| 
     puts 'creating browser ' + browser 
     Selenium::SeleniumDriver.new("localhost", 4444, browser, "http://localhost:3003", 10000) 
    end 

    start 
    open start_address 
    end 

    def teardown 
     stop 
    end 

    #sub-classes should override this if they want to change it 
    def start_address 
    "http://localhost:3003/" 
    end 

    # Overrides standard "open" method 
    def open(addr) 
    method_missing 'open', addr 
    end 

    # Overrides standard "type" method 
    def type(inputLocator, value) 
    method_missing 'type', inputLocator, value 
    end 

    # Overrides standard "select" method 
    def select(inputLocator, optionLocator) 
    method_missing 'select', inputLocator, optionLocator 
    end 

    def method_missing(method_name, *args) 
    @seleniums.each do |selenium_driver| 
     if args.empty? 
     selenium_driver.send method_name 
     else 
     selenium_driver.send method_name, *args 
     end 

    end 
    end 
end 

này hoạt động, nhưng nếu một trình duyệt không thành công, toàn bộ thử nghiệm thất bại và không có cách nào để biết được trình duyệt nó không thành công trên.

+1

Xin chào Daniel, tôi có một câu hỏi tương tự. Tôi đã tự hỏi nếu bạn có thể giúp đỡ. [Selenium RC: Cách khởi chạy Thử nghiệm tương tác với nhiều trình duyệt] (http://stackoverflow.com/questions/2836313/selenium-rchow-to-launch-interactive-testing-with-multiple-browsers) – onesith

Trả lời

4

Bạn đã thử Selenium Grid? Tôi nghĩ rằng nó tạo ra báo cáo tóm tắt khá tốt trong đó cho thấy chi tiết bạn cần. Tôi có thể sai, vì tôi đã không sử dụng nó trong một thời gian dài.

0

Tuyên bố từ chối trách nhiệm: Không phải chuyên gia về selen.

Bạn chỉ muốn biết trình duyệt nào không thành công hoặc bạn muốn chạy thử nghiệm trên tất cả các trình duyệt và sau đó báo cáo tổng số lỗi khi hoàn thành?

Trước đây là khá đơn giản nếu bạn lưu trữ các trình điều khiển bằng cách băm trong thiết lập của bạn. (Tôi chắc rằng có một cách lạ mắt, quần để làm điều này với Hash.inject, nhưng tôi lười biếng.)

@seleniums = {} 
%w(*firefox *iexplore).each do |browser| 
    puts 'creating browser ' + browser 
    @seleniums[browser] = Selenium::SeleniumDriver.new("localhost", 4444, browser, "http://localhost:3003", 10000) 
end 

Sau đó thay đổi chức năng cốt lõi của bạn để thay đổi ngoại lệ đối với bao gồm tên của người lái xe đang được sử dụng , ví dụ như:

@seleniums.each do |name, driver| 
    begin 
    driver.send method_name, *args 
    rescue Exception => ex 
    raise ex.exception(ex.message + " (in #{name})") 
    end 
end 

Bạn nên đóng cửa.

+0

Ý tưởng hay, mặc dù không thành công kiểm tra không nhất thiết phải ném ngoại lệ tôi nghĩ. –

+0

Trên thực tế, họ phải luôn luôn ném một số loại AssertionFailedException; nhưng điều Grid đó dưới đây trông rất lớn. –

1

tôi đã kết thúc điều chỉnh protocol.rb Selenium để nâng cao một AssertionFailedError với cả và thông điệp @browser_string trở từ Selenium RC nếu câu trả lời đã không bắt đầu với "OK". Tôi cũng đã sửa đổi phương thức http_post để trả về toàn bộ nội dung phản hồi và method_missing để trả về một mảng các giá trị trả về khi phát lệnh get_X cho Selenium RC.

Thêm mã này vào mã trong câu hỏi và bạn sẽ có thể xem xác nhận nào không thành công trên trình duyệt nào.

# Overrides a few Driver methods to make assertions return the 
# browser string if they fail 
module Selenium 
    module Client 
    class Driver 
     def remote_control_command(verb, args=[]) 
     timeout(default_timeout_in_seconds) do 
      status, response = http_post(http_request_for(verb, args)) 
      raise Test::Unit::AssertionFailedError.new("Browser:#{@browser_string} result:#{response}") if status != 'OK' 
      return response[3..-1] 
     end 
     end 

     def http_post(data) 
     http = Net::HTTP.new(@server_host, @server_port) 
     response = http.post('/selenium-server/driver/', data, HTTP_HEADERS) 
     #return the first 2 characters and the entire response body 
     [ response.body[0..1], response.body ] 
     end 
    end 
    end 
end 

#Modify your method_missing to use seleniums.map to return the 
#results of all the function calls as an array 
class SeleniumTest < Test::Unit::TestCase 
    def method_missing(method_name, *args) 
    self.class.seleniums.map do |selenium_driver| 
     selenium_driver.send(method_name, *args) 
    end 
    end 
end 
0

bạn cần phải xử lý mọi thử nghiệm một cách độc lập. Vì vậy, nếu một thử nghiệm thất bại, nó sẽ tiến hành thử nghiệm các thử nghiệm khác. Hãy xem phpunit and selenium rc

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