当测试用例数量增加,一个一个执行效率低下,需要将工程下的,case收集并按顺序执行将对应的代码放入run_tests.py
run_tests.py:运行程序目的
- 收集所有的测试用例
- 执行
- 生成测试报告
运用测试用例的收集器或测试用例的加载器
7 TestSuite & TestLoader的使用
使用TestSuite类来组织多个测试用例
使用TestLoader类来动态加载测试用例
常用的方法如下:
- 方法一:
unittest.TestSuite()
addTest()添加一个测试用例 - 方法二:
unittest.TestLoader()
unittest.TestLoader.loadTestsFromModule(模块名)不需要加引号(注意要导入模块) - 方法三:unittest.TestLoader.loadTestsFromTestCase(测试类名)不需要加引号
7.1 使用unittest.TestSuite()测试组件--addTest()
当测试用例的数量增加时,需要将这些测试用例分组并按顺序执行,可以通过unittest.TestSuite来创建测试套件,并将多个测试用例添加到测试套件中
例子如下:
import unittest
def add(a, b):
return a + b
class TestStringMethods(unittest.TestCase):
def test_upper(self):
self.assertEqual('hello'.upper(), 'HELLO')
def test_isupper(self):
self.assertTrue('HELLO'.isupper())
self.assertFalse('Hello'.isupper())
def test_split(self):
s = 'hello world'
self.assertEqual(s.split(), ['hello', 'world'])
with self.assertRaises(TypeError):
s.split(2)
class TestAdd(unittest.TestCase):
def test_add(self):
self.assertEqual(add(1, 2), 3)
self.assertEqual(add(0, 0), 0)
def test_add_negative(self):
self.assertEqual(add(-1, -2), -3)
self.assertEqual(add(-1, 1), 0)
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestStringMethods))
suite.addTest(TestAdd('test_add'))
unittest.TextTestRunner(verbosity=2).run(suite)
在 例子中,定义了测试程序TestStringMethods和TestAdd。在main函数中,创建了一个测试套件suite,并使用addTest将TestStringMethods和TestAdd这两个测试程序添加到测试套件中,使用unittest.TextTestRunner类别来执行测试套件,并设置verbosity=2参数以显示更详细的报告
使用测试套件可以将多个测试用例按顺序执行,从而更好的管理和执行测试
7.2 使用unittest.TestLoader()测试组件--loadTestsFromModule()
loader = unittest.TestLoader()
#只加载注册和登录的用例
suite_login = loader.loadTestsFromModule(test_login)#从某个模块中加载
suite_register = loader.loadTestsFromModule(test_register)
#有2个suite,需要再次合并初始化一个suite
suite_total = unittest.TestSuite()
suite_total.addTests([suite_login,suite_register]) #放入总的测试集
8 执行用例
8.1 TextTestRunner的用法
测试用例集合完毕,如何来执行测试用例?
需要用到TextTestrRunner执行测试集,用run 方法
#创建runner对象
runner = unittest.TextTestrRunner()
#这是传入测试集合执行
runner.run(suite)
import unittest
import os
#初始哈一个加载器,test_loader
loader = unittest.TestLoader()
#获取测试用例目录的路径
dir_path = os.path.dirname(os.path.abspath(__file__))
case_path = os.path.join(dir_path, 'tests')
#收集使用loader 收集所有的测试用例
#test_suit: unittest.TestSuite = loader.discover(case_path)
#discover自动识别收集测试用例,
test_suit = loader.discover(case_path)
print(test_suit)
#执行测试用例
#TextTestRunner:生成文本格式的测试报告
runner = unittest.TextTestRunner()
runner.run(test_suit)
loader.discover(case_path),动态加载路径下符合条件的test模块,按顺序进行执行
"""动态加载的case"""
<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<test_addcase.TestAdd testMethod=test_add>]>]>, <unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<test_example01case.TestStringMethods testMethod=test_isupper>, <test_example01case.TestStringMethods testMethod=test_split>, <test_example01case.TestStringMethods testMethod=test_upper>]>]>, <unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<test_fixture.TestAdd testMethod=test_add>, <test_fixture.TestAdd testMethod=test_add_negative>]>, <unittest.suite.TestSuite tests=[<test_fixture.TestAdd2 testMethod=test_add2>, <test_fixture.TestAdd2 testMethod=test_add2_negative>]>]>, <unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<test_login.TesrLogin testMethod=test_login_01_success>, <test_login.TesrLogin testMethod=test_login_02_error>]>]>, <unittest.suite.TestSuite tests=[]>, <unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<test_suitecase.TestAdd testMethod=test_add>, <test_suitecase.TestAdd testMethod=test_add_negative>]>, <unittest.suite.TestSuite tests=[<test_suitecase.TestStringMethods testMethod=test_isupper>, <test_suitecase.TestStringMethods testMethod=test_split>, <test_suitecase.TestStringMethods testMethod=test_upper>]>]>, <unittest.suite.TestSuite tests=[]>]>
9 生成测试报告
9.1 text类型的测试报告:
一般不使用这种报告,比较不规范
创建一个文件,以写的方式打开
#生成测试报告
with open("test_reports.txt", 'w', encoding= 'utf-8') as f:
runner =unittest.TextTestRunner(f)
runner.run(test_suit)
补充点:
.F:测试用例断言失败问题,可能是测试用例预期结果不对,可能测试用例执行出现bug
出现2种问题:
- 发现bug
- 代码预期结果不对
如图记录错误
.E:代码问题 ,需要改代码自己问题
9.2 html类型的测试报告:
1)方法一:BeautifulReport模块生成
环境安装:pip install BeautifulReport
使用方式:
from BeautifulReport import BeautifulReport
br = BeautifulReport(suit)
br.report("测试报告", "test.html")
2) 方法二:HTMLTestRunnerNew模块生成
import unittest
import os
#初始化加载器
from HTMLTestRunnerNew import HTMLTestRunner
from class20240714_unittest.tests import test_login,test_register
#初始哈一个加载器,test_loader
loader = unittest.TestLoader()
#获取测试用例目录的路径
dir_path = os.path.dirname(os.path.abspath(__file__))
case_path = os.path.join(dir_path, 'tests')
#收集使用loader 收集所有的测试用例
#test_suit: unittest.TestSuite = loader.discover(case_path)
#discover自动识别收集测试用例,
test_suit = loader.discover(case_path)
print(test_suit)
#HTML测试报告,不是内置的,是需要自己准备的
with open("test_reports.html", 'wb') as f:
#自定义HTML内容
runner = HTMLTestRunner(f, title = '测试报告',description= '测试报告的描述', tester= 'xiaoyi')
runner.run(test_suit)
运行结果:
报告:
unittest 图解: