unittest 框架

Python自带的一个作为单元测试的测试框,PyUnit,相当于Java中的JUnit,
随着自动化技术的成熟,UnitTest成为了测试框架第一选择,可以完整的结合Selenium、Requests来实现l和接口的自动化,
由UnitTest再衍生出PyTest,PyTest可以完美结合UnitTest来实现自动化。
鄙视链:Py Test—Unit Test-RobotFrameWork基本应用:
1.环境搭建,
Python中已经直接加载了UnitTest框架,无须额外安装
2.四大组件:
a.test fixture:
setUp(前置条件)、tearDown(后置条件),用于初始化测试用例及清理和释放资源
b.test case:
测试用例,通过集成unitest.TestCase,来实现用例的继承,在UnitTest中,测试用例都是通过test来识别的。
c.test suite:
测试套件,也称之为测试用例集
d.test runner:
运行器,一般通过runner来调用suite去执行测试
3.UnitTest运行机制:
通过在main函数中,调用unittest.main()运行所有内容
UnitTest自动化实现实战:
1.自动化测试减少冗余,便于维护。
【案例1】
import unittestclass fortext(unittest.TestCase):    # 类的初始化    @classmethod    def setUpClass(cls) -> None:        print('class start')    @classmethod    def tearDownClass(cls) -> None: # 类的释放        print('class end')    #初始化    def setUp(self) -> None:        print('setup')    def tearDown(self) -> None:        print('teardown')    def plus(self,a,b):        c = a+b        print(c)        return c    def test_a(self):        print('aaa')    def test_b(self):        print('bbb')    def test_c(self):        self.plus(1,2)        print('c')if __name__ == '__main__':    unittest.main()
【案例2】
import unittestfrom selenium import webdriverimport timeclass forTestTest(unittest.TestCase):    def setUp(self) -> None:        self.driver = webdriver.Chrome()        self.driver.get('http://www.baidu.com')    def tearDown(self) -> None:        time.sleep(5)        self.driver.quit()    def test_1(self):        self.driver.find_element_by_id('kw').send_keys('虚竹')        self.driver.find_element_by_id('su').click()    def test_2(self):        self.driver.find_element_by_id('kw').send_keys('小龙女')        self.driver.find_element_by_id('su').click()if __name__ == '__main__':    unittest.main()
2.ddt 数据驱动
data-driver-tests 数据驱动测试,
在实际测试中,单个测试是需要用多种不同条件(多种数据)进行测试的。
ddt中最基本的使用:
在class前定义@ddt
在基于实际的应用中,选择对应的装饰器使用即可。@data 是其中一个
data 用于设定参数
unpack 用于解析参数
【案例3】
import unittestfrom selenium import webdriverimport timefrom ddt import ddt,data@ddtclass forTestTest(unittest.TestCase):    def setUp(self) -> None:        self.driver = webdriver.Chrome()        self.driver.get('http://www.baidu.com')    def tearDown(self) -> None:        time.sleep(5)        self.driver.quit()    @data('虚竹','小龙女')    def test_1(self,txt):        self.driver.find_element_by_id('kw').send_keys(txt)        self.driver.find_element_by_id('su').click()if __name__ == '__main__':    unittest.main()
web自动化测试
【案例:百度搜索】
import unittestimport timefrom selenium import webdriverclass testBaidu(unittest.TestCase):    def setUp(self) -> None:        self.driver = webdriver.Chrome()        self.base_url ='https://www.baidu.com'    def test_serarch_key_selenium(self):        self.driver.get(self.base_url)        self.driver.find_element_by_id('kw').send_keys('selenium')        self.driver.find_element_by_id('su').click()        time.sleep(10)        title = self.driver.title        self.assertEqual(title,"selenium_百度搜索")    def test_serarch_key_unittest(self):        self.driver.get(self.base_url)        self.driver.find_element_by_id('kw').send_keys('unittest')        self.driver.find_element_by_id('su').click()        time.sleep(10)        title = self.driver.title        self.assertEqual(title,"unittest_百度搜索")    def tearDown(self) -> None:        self.driver.quit()if __name__ == '__main__':    unittest.main()
【案例:百度搜索+关键字】
import unittestimport timefrom selenium import webdriverclass testBaidu(unittest.TestCase):    def setUp(self) -> None:        self.driver = webdriver.Chrome()        self.base_url ='https://www.baidu.com'    def baidu_search(self,search_key):        self.driver.get(self.base_url)        self.driver.find_element_by_id('kw').send_keys(search_key)        self.driver.find_element_by_id('su').click()        time.sleep(10)    def test_search_key_selenium(self):        search_key = 'selenium'        self.baidu_search(search_key)        self.assertEqual(self.driver.title,search_key+"_百度搜索")    def test_search_key_unittest(self):        search_key = 'unittest'        self.baidu_search(search_key)        self.assertEqual(self.driver.title, search_key + "_百度搜索")    def tearDown(self) -> None:        self.driver.quit()if __name__ == '__main__':    unittest.main()
【案例:百度搜索+关键字+classmethod】
import unittestimport timefrom selenium import webdriverclass testBaidu(unittest.TestCase):    @classmethod    def setUpClass(cls) -> None:        cls.driver = webdriver.Chrome()        cls.base_url = 'https://www.baidu.com'    def setUp(self) -> None:        print('我没用了吗,开始')    def baidu_search(self,search_key):        self.driver.get(self.base_url)        self.driver.find_element_by_id('kw').send_keys(search_key)        self.driver.find_element_by_id('su').click()        time.sleep(10)    def test_search_key_selenium(self):        search_key = 'selenium'        self.baidu_search(search_key)        self.assertEqual(self.driver.title,search_key+"_百度搜索")    def test_search_key_unittest(self):        search_key = 'unittest'        self.baidu_search(search_key)        self.assertEqual(self.driver.title, search_key + "_百度搜索")    def tearDown(self) -> None:        print('我没用了吗,那我走了')    @classmethod    def tearDownClass(cls) -> None:        cls.driver.quit()if __name__ == '__main__':    unittest.main()"""1.用setUp与setUpClass区别    setup():每个测试case运行前运行    teardown():每个测试case运行完后执行    setUpClass():必须使用@classmethod 装饰器,所有case运行前只运行一次    tearDownClass():必须使用@classmethod装饰器,所有case运行完后只运行一次2.@是修饰符,classmethod是python里的类方法"""
小结
1.用setUp与setUpClass区别
setup():每个测试case运行前运行
teardown():每个测试case运行完后执行
setUpClass():必须使用@classmethod 装饰器,所有case运行前只运行一次
tearDownClass():必须使用@classmethod装饰器,所有case运行完后只运行一次
2.@是修饰符,classmethod是python
生成HTML测试报告
下载安装
下载HTMLTestRunner.py文件,放入python\lib 即可。
下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html
生成测试报告
import unittestfrom HTMLTestRunner import HTMLTestRunner#定义测试用例的目录为当前目录下的test_case目录test_dir = './test_case'suit = unittest.defaultTestLoader.discover(test_dir,pattern='test*.py')if __name__ == '__main__':    #生成HTML格式的报告    fp = open('./test_report/result20200523.html','wb')    rnnner = HTMLTestRunner(stream =fp,                            title='百度搜索测试报告',                            description='运行环境:Windows10,Chrome浏览器'                            )    rnnner.run(suit)    fp.close()
加注释的测试报告
"""使用 setUpModule/ tearDownModule 减少浏览器的启动"""import unittestfrom time import sleepfrom selenium import webdriverclass Browser:    driver = None    base_url = Nonedef setUpModule():    Browser.driver = webdriver.Chrome()    Browser.base_url = "https://www.baidu.com"def tearDownModule():    Browser.driver.quit()def baidu_search(search_key):    Browser.driver.get(Browser.base_url)    Browser.driver.find_element_by_id("kw").send_keys(search_key)    Browser.driver.find_element_by_id("su").click()    sleep(2)class TestBaidu(unittest.TestCase):    """百度搜索测试"""    def test_search_key_selenium(self):        '''搜索关键字:selenium '''        search_key = "selenium"        baidu_search(search_key)        self.assertEqual(Browser.driver.title, search_key + "_百度搜索")    def test_search_key_unttest(self):        '''搜索关键字:unittest '''        search_key = "unittest"        baidu_search(search_key)        self.assertEqual(Browser.driver.title, search_key + "_百度搜索")class TestBaidu2(unittest.TestCase):    """百度搜索测试2"""    def test_search_key_python(self):        """搜索关键字:python"""        search_key = "python"        baidu_search(search_key)        self.assertEqual(Browser.driver.title, search_key + "_百度搜索")if __name__ == '__main__':    unittest.main()
按当前时间生成测试报告名
import unittestfrom HTMLTestRunner import HTMLTestRunnerimport time#定义测试用例的目录为当前目录下的test_case目录test_dir = './web_case'suit = unittest.defaultTestLoader.discover(test_dir,pattern='test*.py')if __name__ == '__main__':    #生成HTML格式的报告    now_time = time.strftime("%Y-%m-%d %H_%M_%S")  # 取当前日期时间    fp = open(now_time+'result.html','wb')    rnnner = HTMLTestRunner(stream =fp,                            title='百度搜索测试报告',                            description='运行环境:Windows10,Chrome浏览器'                            )    rnnner.run(suit)    fp.close()
数据驱动-csv文件
import csvimport codecsimport unittestfrom time import sleepfrom itertools import islicefrom selenium import webdriverclass TestBaidu(unittest.TestCase):    @classmethod    def setUpClass(cls) -> None:        cls.driver = webdriver.Chrome()        cls.base_url = 'https://www.baidu.com'    @classmethod    def tearDownClass(cls) -> None:        cls.driver.quit()    def baidu_search(self,search_keys):        self.driver.get(self.base_url)        self.driver.find_element_by_id('kw').send_keys(search_keys)        self.driver.find_element_by_id('su').click()        sleep(3)    def test_search(self):        with codecs.open('baidu_data.csv','r','utf_8_sig') as f:            data = csv.reader(f)            for line in islice(data,1,None):                search_key = line[1]                self.baidu_search(search_key)if __name__ == '__main__':    unittest.main(verbosity=2)

优化
import csvimport codecsimport unittestfrom time import sleepfrom itertools import islicefrom selenium import webdriverclass TestBaidu(unittest.TestCase):    @classmethod    def setUpClass(cls) -> None:        cls.driver = webdriver.Chrome()        cls.base_url = 'https://www.baidu.com'        cls.test_data = []        with codecs.open('baidu_data.csv', 'r', 'utf_8_sig') as f:            data = csv.reader(f)            for line in islice(data, 1, None):                cls.test_data.append(line)    @classmethod    def tearDownClass(cls) -> None:        cls.driver.quit()    def baidu_search(self,search_keys):        self.driver.get(self.base_url)        self.driver.find_element_by_id('kw').send_keys(search_keys)        self.driver.find_element_by_id('su').click()        sleep(3)    def test_search_selenium(self):        self.baidu_search(self.test_data[0][1])    def test_search_unittest(self):        self.baidu_search(self.test_data[1][1])    def test_search_parameterized(self):        self.baidu_search(self.test_data[2][1])if __name__ == '__main__':    unittest.main(verbosity=2)
Parameterized参数化库
import unittestfrom time import sleepfrom selenium import webdriverfrom parameterized import parameterized# import parameterizedclass TestBaidu(unittest.TestCase):    @classmethod    def setUpClass(cls) -> None:        cls.driver = webdriver.Chrome()        cls.base_url = 'https://www.baidu.com'    @classmethod    def tearDownClass(cls) -> None:        cls.driver.quit()    def baidu_search(self,search_key):        self.driver.get(self.base_url)        self.driver.find_element_by_id('kw').send_keys(search_key)        self.driver.find_element_by_id('su').click()        sleep(3)    #通过parameterized 参数化    @parameterized.expand([        ("case1","selenium"),        ("case2","unittest"),        ("case3","parameterized")    ])    def test_search(self,name,search_key):        self.baidu_search(search_key)        self.assertEqual(self.driver.title,search_key+"_百度搜索")if __name__ == '__main__':    unittest.main(verbosity=2)
ddt参数库
参数一 列表
import unittestfrom time import sleepfrom selenium import webdriverfrom ddt import  ddt,data,file_data,unpack@ddtclass TestBaidu(unittest.TestCase):    @classmethod    def setUpClass(cls) -> None:        cls.driver = webdriver.Chrome()        cls.base_url = 'https://www.baidu.com'    def baidu_search(self,search_key):        self.driver.get(self.base_url)        self.driver.find_element_by_id('kw').send_keys(search_key)        self.driver.find_element_by_id('su').click()        sleep(3)    #参数化使用方式一 列表    @data(['case1','selenium'],['case2','ddt'],['case3','python'])    @unpack    def test_search1(self,case,search_key):        print('第一组测试用例 列表',case)        self.baidu_search(search_key)        self.assertEqual(self.driver.title,search_key+'_百度搜索')    @classmethod    def tearDownClass(cls) -> None:        cls.driver.quit()if __name__ == '__main__':    unittest.main(verbosity=2)
参数二 元祖
    #参数化使用方式二 元祖    @data(('case1','selenium'),('case2','ddt'),('case3','python'))    @unpack    def test_search2(self,case,search_key):        print('第二组测试用例 列表',case)        self.baidu_search(search_key)        self.assertEqual(self.driver.title,search_key+'_百度搜索')
参数三 字典
    #参数化使用方式二 元祖    @data(('case1','selenium'),('case2','ddt'),('case3','python'))    @unpack    def test_search2(self,case,search_key):        print('第二组测试用例 列表',case)        self.baidu_search(search_key)        self.assertEqual(self.driver.title,search_key+'_百度搜索')
参数四 JSON
ddt_data_file.json
{  "case1": {"search_key": "python"},  "case2": {"search_key": "ddt"},  "case3": {"search_key": "Selenium"}}
  #参数化读取JSON文件    @file_data('ddt_data_file.json')    def test_search4(self,search_key):        print('第四组测试用例:',search_key)        self.baidu_search(search_key)        self.assertEqual(self.driver.title,search_key+'_百度搜索')
未完待续 20200523
版权声明: 本文为 InfoQ 作者【蜗牛前进】的原创文章。
原文链接:【http://xie.infoq.cn/article/e4041f53e46629dfa4ea6815e】。文章转载请联系作者。
 
 
蜗牛前进
日拱一卒! 2020.02.21 加入
还未添加个人简介
 
  
  
  
  
  
  
  
  
    
评论 (3 条评论)