一、discover方法
discover方法可以根据标准加载用例,并将结果返回给测试套件(suite),start_dir:待测试的目录,pattern:测试用例文件名的匹配规。
如:
start_dir = ‘./test_case‘suites = unittest.defaultTestLoader.discover(start_dir ,pattern=‘test.*py‘)
当执行多个目录的测试用例时,如何查找test_case下的其他目录吃里的测试用例文件呢?就是在test_case下每个目录里加__init__.py文件,这样会把这个目录当做标记成一个标准的Python模块。
二、测试用例的执行顺序是根据ASCLL码的顺序执行的。如:test_aaa.py优先于test_bbb.py。
三、装饰器 。这些装饰器不仅用在方法上,同样适用于类。四#跳过测试和预期失败
class MyTest(unittest.TestCase): @unittest.skip(‘直接跳过测试‘) def test_skip(self): print(‘test aaa‘) @unittest.skipIf(3>2,‘条件为真时跳过装饰的测试‘) def test_skip_if(self): print(‘test bbb‘) @unittest.skipUnless(3>2,‘条件为真时执行装饰的测试‘) def test_skip_unless(self): print(‘test ccc‘) @unittest.expectedFailure def test_expected_failure(self): self.assertEqual(3,3) if __name__ == ‘__main__‘: unittest.main() 四、Fixture 执行一个或者多个测试所需要的环境。如创建临时或者代理 数据库、目录、或者启动服务器进程。
import unittest def setUpModule(): print(‘test module start >>>>>>>>>>>>>>>>‘)def tearDownModule(): print(‘test module end >>>>>>>>>>>>>>>>>>‘) class MyTest2(unittest.TestCase): @classmethod def setUpClass(cls): print(‘test class start >>>>>>>>>>>>>>‘) @classmethod def tearDownClass(cls): print(‘test class end >>>>>>>>>>>>>>>>‘) def setUp(self): print(‘test case start>>>>>>>>>>>>>>‘) def tearDown(self): print(‘test case end>>>>>>>>>>>>>>>‘) def test_case1(self): print(‘test case1‘) def test_case2(self): print("test case2") if __name__ == ‘__main__‘: unittest.main()
五、断言方法。
class TestAssert(unittest.TestCase): def test_equal(self): self.assertEqual(2+2,4) self.assertEqual(‘python‘,‘python‘) self.assertNotEqual(‘python‘,‘pythno‘) def test_in(self): self.assertIn(‘hello‘,‘hello world‘) self.assertNotIn(‘hi‘,‘hello‘) def test_true(self): self.assertTrue(1) # or Ture self.assertFalse(0) # or False
六、数据驱动应用。常用的csv读取数据执行用例,会导致所有数据被当做一条用例来执行,只要有一条用例失败,那么整个用例就执行失败了。一种解决方法是将数据读取到列表中,在用例中按照下标来调用。但是这样有两个问题,一是每次都要读取文件,耗费空间,二是数据在列表中,如果插入一条数据,或者删除一条数据,那么用例在调用数据时就会非常容易出错,不利于维护。
下面介绍2个模块来解决数据驱动问题。Parameterized是Python的一个库。支持unittest、pytest、Nose框架。
import unittestfrom time import sleepfrom selenium import webdriverfrom parameterized import parameterized class TestBaidu(unittest.TestCase): ‘‘‘百度搜索测试‘‘‘ @classmethod def setUpClass(cls): 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(2) @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 + ‘_百度搜索‘) @classmethod def tearDownClass(cls): cls.driver.quit() if __name__ == ‘__main__‘: unittest.main() 在@parameterized.expand()中每个元组都是一条测试用例。name对应的是元组中第一列数据,search_key对应的是第二列数据。参数化会自动加上0,1,2来区分每条用例。元组中的数据作为用例名的后缀出现在测试报告中。DDT是uittest的一个扩展库。测试类需要通过@ddt装饰器进行装饰。DDT提供不同形式的参数化,比如列表,元组,字典等。需要注意字典的KEY与测试方法的参数要保持一致。DDT也支持数据文件(json)的参数化。
import unittestfrom time import sleepfrom selenium import webdriverfrom ddt import ddt,data,file_data,unpack @ddtclass TestBaidu(unittest.TestCase): ‘‘‘百度搜索测试‘‘‘ @classmethod def setUpClass(cls): 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(2) @data([‘case1‘,‘selenium‘],[‘case2‘,‘unittest‘],[‘case3‘, ‘parameterized‘]) @unpack def test_search1(self,name,search_key): print(‘第一组测试用例:‘, name) self.baidu_search(search_key) self.assertEqual(self.driver.title,search_key + ‘_百度搜索‘) @data((‘case1‘,‘selenium‘), (‘case2‘, ‘unittest‘), (‘case3‘, ‘parameterized‘),) @unpack def test_search2(self, name, search_key): print(‘第二组测试用例:‘,name) self.baidu_search(search_key) self.assertEqual(self.driver.title, search_key + ‘_百度搜索‘) @data({"search_key":"python"},{"search_key":"ddt"},{"search_key":"Selenium"}) @unpack def test_search2(self, search_key): print(‘第三组测试用例:‘,search_key) self.baidu_search(search_key) self.assertEqual(self.driver.title, search_key + ‘_百度搜索‘) # @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 + ‘_百度搜索‘) @classmethod def tearDownClass(cls): cls.driver.quit() if __name__ == ‘__main__‘: unittest.main()
ddt_data_file.json
{ "case1":{"search_key":"python"}, "case2":{"search_key":"ddt"}, "case3":{"search_key":"Selenium"} } 七、HTML测试报告。HTMLTestRunner支持Python3的下载地址:https://github.com/defnngj/HTMLTestRunner
#获取当前的时间now_time = time.strftime(‘%Y-%m-%d %H_%M_%S‘)HTML_report = ‘./test_report/‘+now_time+‘result.html‘fp = open(HTML_report,‘wb‘)runner = HTMLTestRunner(stream=fp,title=‘Fixture‘, description=‘运行环境:Windows 10,Chrome浏览器‘)runner.run(suites)#关闭fp.close()
原文地址:https://www.cnblogs.com/wzjbg/p/11617377.html
时间: 2024-07-30 19:19:13