测试框架——unittest
unittest框架:
1、核心组成部分:
1)test case,测试用例,一个方法,必须以test开头,eg:test_login(),test_add(),test_minus()
2) test suite,测试集/测试套件,加载测试用例,用于执行测试,通常是以测试集方式方可执行,unittest.main()
3) test runner,执行测试
4) test fixture,测试装置:setUp(self),tearDown(self);setUpClass(cls),tearDownClass(cls)
a)初始化(前置动作),回收资源(收尾),setUp(self),tearDown(self),方法级实例,每次执行均需要执行;每个测试用例执行前均执行一次初始化,执行一次资源回收
b)初始化(前置动作),回收资源(收尾),setUpClass(cls),tearDownClass(cls),类级实例,每次执行只执行一次,单例设计模式;所有用例执行前只初始化一次,执行后只资源回收一次
5)Unittests for :光标在哪,运行至哪;Unittests in:执行所有用例
6)测试集:TestSuite,实例化测试测试集,然后添加测试用例至测试集
suite=unittest.TestSuite()#实例化测试测试集
suite.addTests(unittest.TestLoader().loadTestsFromTestCase(类名)) #加载整个类至测试集中
suite.addTests(unittest.TestLoader().loadTestsFromModule(模块名))#添加模块至测试集,支持本模块和其他模块。注意:需要导入本模块,方可使用
# 指定名称进行添加用例-指定一个类名,格式须以字符串方式,模块名.类名
# suite.addTests(unittest.TestLoader().loadTestsFromName("test_cal.cal_test02"))
# 指定名称进行添加用例 - 指定一个类下的用例名称,格式须以字符串方式,模块名.类名.方法名
# suite.addTests(unittest.TestLoader().loadTestsFromName("test_cal.cal_test02.test_minus_06"))
# 指定多个名称进行添加用例,允许单个指定,列表格式
#suite.addTests(unittest.TestLoader().loadTestsFromNames(["test_cal.cal_test02.test_minus_06"]))
# 指定多个名称进行添加用例,多个指定,列表格式
#suite.addTests(unittest.TestLoader().loadTestsFromNames(["test_cal.cal_test02.test_minus_06","test_cal.cal_test01"]))
# 添加指定的测试用例-单个添加,addTests()
# suite.addTests([cal_test01('test_add002')])
# 添加指定的测试用例-多个添加,addTests()
# suite.addTests([cal_test01('test_add001'),cal_test02('test_minus_06')])
# 添加指定的单个测试用例,addTest()
# suite.addTest(cal_test01('test_minus004'))
7)执行测试:TextTestRunner中的run(),实例化测试执行的runner对象,然后执行测试
runner=unittest.TextTestRunner()实例化一个runner
runner.run(suite)#执行测试集
亦可以:unittest.TextTestRunner().run(suite)
8)输出结果:
a)第三方报告库HTMLTestRunner,执行方式必须是模块方式/python脚本方式,脚本默认运行方式为unittests,需要将运行模式配置成python脚本方式;edit configuration,选择python,映射正确的脚本路径,即可。
verbosity:测试结果详细度,有0,1,2;2最详细
#import HTMLTestRunner,导入主包
# with open("test.html","w",encoding="utf8") as file:
# runner=HTMLTestRunner.HTMLTestRunner(stream=file,verbosity=1,title="测试报告",description="unitetest 简单测试报告")
# runner.run(suite)
# from HTMLTestRunner import HTMLTestRunner,导入子包
# with open("test.html","w",encoding="utf8") as file:
# runner=HTMLTestRunner(stream=file,verbosity=2,title="测试报告",description="unitetest 简单测试报告")
# runner.run(suite)
b)将系统执行的测试结果以文本方式输出报告
with open("test-report.txt",'w',encoding="utf-8") as f:
runner = unittest.TextTestRunner(stream=f,verbosity=2,descriptions="test report")
runner.run(suite)
9)# 使用TestResult保存测试结果
# result=unittest.TestResult(suite)
# print(result)
# print(result.errors)
# print(result.testsRun)
# print(result.failures)
unittest常用装饰器:
1) @unittest.skip("无条件跳过")
2) @unittest.skipUnless(2>1,reason="条件为假(False)时,跳过")
3)@unittest.skipIf(2>1,reason="条件为真(True)时,跳过")
unittest断言方法:#响应断言,接口测试常用的断言方式
1)判断是否相等;self.assertEqual(a,b) ------assert a==b
2) 判断是否不相等;self.assertNotEqual(a,b)
3)判断是否包含;self.assertIn(a,b)
4)判断noticeid是否大于0;self.assertGreater(noticeid,0)
5)判断0是否小于noticeid;self.assertLess(0,noticeid)
6)判断预期结果的字符串是否存在;self.assertRegex(text="word",expected_regex="o")
7)判断是否是个对象/实例;self.assertIsInstance(a,b)
8)判断是否为空:self.assertIsNone(a)