執行多個用例

在eclipse中  run as  python unit-test時  可執行兩個類。



# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re
from time import sleep

class test_link(unittest.TestCase):
    
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(30)
        self.base_url = "https://www.hao123.com"
        self.verificationErrors = []
        self.accept_next_alert = True
        print "setup"
        
        
    #打開鳳凰網鏈接
    def test_yfeng(self):
        driver = self.driver
        driver.get(self.base_url + "/")
        driver.find_element_by_link_text(u"鳳 凰 網").click()
        print "鳳 凰 網"
        time.sleep(5)
    def test_tao(self):
        driver = self.driver
        driver.get(self.base_url + "/")
        driver.find_element_by_link_text(u"淘寶網").click()
        print "淘寶網"
        time.sleep(5)
     
    
    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException, e: return False
        return True
    
    def is_alert_present(self):
        try: self.driver.switch_to_alert()
        except NoAlertPresentException, e: return False
        return True
    
    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to_alert()
            alert_text = alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert_text
        finally: self.accept_next_alert = True
    
    def tearDown(self):
        print "teardown"
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)
if __name__ == "__main__":  
    #構造測試集              
    suite = unittest.TestSuite() 
    suite.addTest(test_link("test_yfeng"))  
    #因爲是隨機執行suit裏的用例,所以我把測試鳳凰網的方法改成test_yfeng  排在淘寶的後面,可以看出跟添加的順序有關。 
    suite.addTest(test_link("test_tao"))  
    
    #執行測試  
    runner=unittest.TextTestRunner()  
    runner.run(suite)  
參考:http://www.th7.cn/Program/Python/201311/158901.shtml

構建測試集:

def suite():    
suite = unittest.TestSuite()    
suite.addTest(WidgetTestCase("testSize"))    
suite.addTest(WidgetTestCase("testResize"))    
return suite
方法二:
也可以直接定義一個TestSuite的子類,並在其初始化方法(__init__)中完成所有測試用例的添加:
class WidgetTestSuite(unittest.TestSuite):    
def __init__(self):        
unittest.TestSuite.__init__(self, map(WidgetTestCase,("testSize",<span style="font-family: Arial, Helvetica, sans-serif;">"testResize")))</span>
<span style="font-family: Arial, Helvetica, sans-serif;"></span><p style="border: medium none; margin: 15px auto 0px; padding-top: 0px; padding-bottom: 0px; line-height: 25px; color: rgb(1, 1, 1); font-family: 宋體, tahoma, Srial, helvetica, sans-serif; font-size: 14px; background-color: rgb(245, 248, 253);">這樣只需要在suite()方法中返回該類的一個實例就可以了:</p><pre style="border: medium none; margin-top: 0px; margin-bottom: 0px; padding: 0px; color: rgb(1, 1, 1); font-size: 14px; line-height: 24px; background-color: rgb(245, 248, 253);"><span style="color: rgb(0, 0, 255);">def</span><span style="color: rgb(0, 0, 0);"> suite():    </span>

return WidgetTestSuite()

方法三:

如果用於測試的類中所有的測試方法都以test開,Python程序員甚至可以用PyUnit模塊提供的makeSuite()方法來構造一個TestSuite:

def suite():    
return unittest.makeSuite(WidgetTestCase, "test")


在PyUnit測試框架中,TestSuite類可以看成是TestCase類的一個容器,用來對多個測試用例進行組織,這樣多個測試用例可以自動在一次測試中全部完成。事實上,TestSuite除了可以包含TestCase外,也可以包含TestSuite,從而可以構成一個更加龐大的測試用例集:

suite1 = mysuite1.TheTestSuite()
suite2 = mysuite2.TheTestSuite()
alltests = unittest.TestSuite((suite1, suite2))
執行測試:

Python開發人員在進行單元測試時一般不直接使用TestRunner類,而是使用其子類TextTestRunner來完成測試,並將測試結果以文本方式顯示出來:

runner = unittest.TextTestRunner()
runner.run(suite)




# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re
from time import sleep

class test_link(unittest.TestCase):
    
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(30)
        self.base_url = "https://www.hao123.com"
        self.verificationErrors = []
        self.accept_next_alert = True
        print "setup"
        
        
    #打開鳳凰網鏈接
    def test_yfeng(self):
        driver = self.driver
        driver.get(self.base_url + "/")
        driver.find_element_by_link_text(u"鳳 凰 網").click()
        print "鳳 凰 網"
        time.sleep(5)
    def test_tao(self):
        driver = self.driver
        driver.get(self.base_url + "/")
        driver.find_element_by_link_text(u"淘寶網").click()
        print "淘寶網"
        time.sleep(5)
     
    
    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException, e: return False
        return True
    
    def is_alert_present(self):
        try: self.driver.switch_to_alert()
        except NoAlertPresentException, e: return False
        return True
    
    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to_alert()
            alert_text = alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert_text
        finally: self.accept_next_alert = True
    
    def tearDown(self):
        print "teardown"
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)
        
        
 #只是打開JD鏈接       
class test_jd(unittest.TestCase):
    
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(30)
        self.base_url = "https://www.hao123.com"
        self.verificationErrors = []
        self.accept_next_alert = True
        print "setup"
        
        
    #打開鏈接
    def test_jd(self):
        driver = self.driver
        driver.get(self.base_url + "/")
        driver.find_element_by_link_text(u"京東商城").click()
        print "京東商城"
        time.sleep(5)
    
     
    
    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException, e: return False
        return True
    
    def is_alert_present(self):
        try: self.driver.switch_to_alert()
        except NoAlertPresentException, e: return False
        return True
    
    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to_alert()
            alert_text = alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert_text
        finally: self.accept_next_alert = True
    
    def tearDown(self):
        print "teardown"
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)
        
if __name__ == "__main__":  
    #構造測試集        
          
    suite1 = unittest.TestSuite() 
    suite1.addTest(test_link("test_yfeng"))  
    #因爲是隨機執行suit裏的用例,所以我把測試鳳凰網的方法改成test_yfeng  排在淘寶的後面,可以看出跟添加的順序有關。 
    suite1.addTest(test_link("test_tao"))  
    
    suite2=unittest.TestSuite()
    suite2.addTest(test_jd("test_jd"))
    
    #suite1 = mysuite1.TheTestSuite()
    #suite2 = mysuite2.TheTestSuite()
    alltests = unittest.TestSuite((suite2, suite1))
    #執行測試  
    runner=unittest.TextTestRunner()  
    runner.run(alltests)  


  • 像java一樣寫一個類繼承於TestCase,然後裏面的所有以test開頭的方法都會被當做case執行,我們要以unittest.main()的方式來調用。

suite=unittest.TestLoader().loadTestsFromTestCase(TestFun)

unittest.TextTestRunner(verbosity=2).run(suite)

把TestFun這個case類中的所有test方法都load進來,然後用unittest自帶的runner來運行,verbosity=2就是顯示詳細信息


  • 一個TestCase的實例就是一個測試用例。什麼是測試用例呢?就是一個完整的測試流程,包括測試前準備環境的搭建(setUp),執行測試代碼(run),以及測試後環境的還原(tearDown)。元測試(unit test)的本質也就在這裏,一個測試用例是一個完整的測試單元,通過運行這個測試單元,可以對某一個問題進行驗證。
  • 而多個測試用例集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。
  • TestLoader是用來加載TestCase到TestSuite中的,其中有幾個loadTestsFrom__()方法,就是從各個地方尋找TestCase,創建它們的實例,然後add到TestSuite中,再返回一個TestSuite實例。
  • TextTestRunner是來執行測試用例的,其中的run(test)會執行TestSuite/TestCase中的run(result)方法。
  • 測試的結果會保存到TextTestResult實例中,包括運行了多少測試用例,成功了多少,失敗了多少等信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章