执行多个用例

在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实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息。

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