2008-10-17 6 views
8

इसलिए, मैंने कुछ रूबी यूनिट परीक्षण बनाना शुरू कर दिया है जो सीधे मेरे ब्राउज़र में अपने वेब ऐप का परीक्षण करने के लिए Selenium RC का उपयोग करते हैं। मैं ruby ​​के लिए Selenum-Client का उपयोग कर रहा हूँ। मैंने अपने सभी अन्य सेलेनियम परीक्षणों के लिए बेस क्लास बनाया है।सेलेनियम आरसी: स्वचालित रूप से कई ब्राउज़रों में परीक्षण चलाएं

यह कई सेलेनियम ड्रायवर उदाहरण बनाता है और गायब होने वाली सभी विधियों को प्रत्येक उदाहरण पर बुलाया जाता है। यह अनिवार्य रूप से समानांतर में परीक्षण चलाता है।

अन्य लोगों ने इसे कैसे स्वचालित किया है?

यह मेरा दिया गया है:

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 

यह काम करता है, लेकिन अगर एक ब्राउज़र में विफल रहता है, पूरे परीक्षण विफल रहता है और कोई रास्ता नहीं पता करने के लिए जो ब्राउज़र उस पर विफल रही है।

+1

हाय डैनियल, मेरे पास एक समान प्रश्न है। मैं सोच रहा था कि क्या आप मदद कर सकते हैं। [सेलेनियम आरसी: एकाधिक ब्राउज़रों के साथ इंटरैक्टिव परीक्षण कैसे लॉन्च करें] (http://stackoverflow.com/questions/2836313/selenium-rchow-to-launch-interactive-testing-with-multiple-browsers) – onesith

उत्तर

4

क्या आपने Selenium Grid को आजमाया था? मुझे लगता है कि यह बहुत अच्छी सारांश रिपोर्ट बनाता है जो आपको आवश्यक विवरण दिखाता है। मैं गलत हो सकता हूं, क्योंकि मैंने इसे थोड़ी देर तक इस्तेमाल नहीं किया था।

0

अस्वीकरण: सेलेनियम विशेषज्ञ नहीं।

क्या आप सिर्फ यह जानना चाहते हैं कि कौन सा ब्राउज़र विफल हुआ है, या आप सभी ब्राउज़रों में परीक्षण चलाने के लिए चाहते हैं और फिर पूर्ण विफलताओं की रिपोर्ट करते समय रिपोर्ट करें?

यदि आप अपने सेटअप में हैश द्वारा ड्राइवरों को स्टोर करते हैं तो पूर्व बहुत आसान है। (मैं वहाँ एक फैंसी-पैंट रास्ता Hash.inject के साथ ऐसा करने के लिए सुनिश्चित हूँ, लेकिन मैं आलसी हूँ।)

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

तो चालक के नाम शामिल करने के लिए अपवाद को संशोधित करने के लिए अपने मुख्य कार्य को बदलने इस्तेमाल किया जा रहा , कुछ ऐसा:

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

आपको बंद करना चाहिए।

+0

अच्छा विचार, हालांकि विफल परीक्षणों को जरूरी अपवादों को फेंकना जरूरी नहीं है। –

+0

असल में, उन्हें हमेशा किसी प्रकार का AssertionFailedException फेंक देना चाहिए; लेकिन नीचे दी गई ग्रिड चीज मेगा-स्लिक दिखती है। –

1

मैं सेलेनियम आर सी से लौटे, तो प्रतिक्रिया के साथ "ठीक" शुरू नहीं किया सेलेनियम के protocol.rb संशोधित दोनों @browser_string और संदेश के साथ एक AssertionFailedError बढ़ाने के लिए समाप्त हो गया। मैंने सेलेनियम आरसी को get_X आदेश जारी करने के लिए रिटर्न मानों की एक सरणी वापस करने के लिए पूरे प्रतिक्रिया निकाय और method_missing को वापस करने के लिए http_post विधि को भी संशोधित किया।

इस कोड को पर कोड में जोड़ें और आपको यह देखने में सक्षम होना चाहिए कि कौन से दावे ब्राउज़र पर असफल होते हैं।

# 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

आपको प्रत्येक परीक्षा को स्वतंत्र रूप से इलाज करने की आवश्यकता है। तो यदि एक परीक्षण विफल रहता है तो यह अन्य परीक्षणों का परीक्षण करेगा। phpunit and selenium rc