一、unittest 框架中的 TestSuite
1.1 基本概念
unittest
框架中的 TestSuite
起着至关重要的作用,它主要用于组织和分组测试用例。当你需要运行多个测试用例时,将它们组织成一个或多个 TestSuite
可以让你更容易地管理这些测试用例。
1.2 作用场景
-
测试用例编写:
TestSuite
允许你将多个测试用例(TestCase
实例)组织在一起。这有助于你将相关的测试用例分组,例如,你可以将所有与数据库交互的测试用例放在一个TestSuite
中,将所有与用户界面相关的测试用例放在另一个TestSuite
中 -
批量运行测试: 使用
TestSuite
可以让你一次性运行多个测试用例。这对于节省时间和资源非常有用,因为它减少了测试过程中需要的手动干预。 -
测试分层: 在某些情况下,你可能想要根据测试用例的优先级或复杂性来组织它们。通过使用
TestSuite
,你可以创建多个层级的测试集,并在需要时运行特定的层级。 -
模块化测试: 将测试用例组织成
TestSuite
可以促进测试的模块化。每个TestSuite
可以看作是一个独立的测试模块,你可以在不同的测试场景或测试阶段中重用它们。 -
集成式测试:
TestSuite
可以与unittest
框架的其他部分(如TestLoader
、TestRunner
和TestResult
)无缝集成,以提供完整的测试环境。这意呀着你可以使用TestLoader
来加载测试用例到TestSuite
,然后使用TestRunner
来运行这些测试用例,并收集TestResult
来查看测试结果。 -
条件性测试: 在某些情况下,你可能只想在满足特定条件时运行某些测试用例。通过创建多个
TestSuite
并根据条件选择性地运行它们,你可以实现这种灵活性。
二、常用的API接口
2.1 addTest(test)
-
作用: 将单个测试用例(
TestCase
实例)添加到测试套件(TestSuite
)中。 -
参数: 需要添加的测试用例,必须为
TestCase
的实例。 -
示例如下:
import unittest
class MyTestCase(unittest.TestCase):
def test_case_1(self):
self.assertEqual(1 + 1, 2, "1 + 1 应该等于 2")
def test_case_2(self):
self.assertTrue(2 > 1, "2 应该大于 1")
def test_case_3(self):
self.assertIn('a', 'abc', "'a' 应该在 'abc' 中")
# 创建 TestSuite 实例
suite = unittest.TestSuite()
# 向 TestSuite 中添加测试用例
# 方式一:逐个添加
suite.addTest(MyTestCase('test_case_1'))
suite.addTest(MyTestCase('test_case_2'))
其中assertEqual
是 Python 的 unittest
测试框架中用于断言两个值是否相等的方法。如果在测试中,你期望某个表达式的结果与某个特定的值相等,你可以使用 assertEqual
方法来验证这一点。如果两个值相等,测试将继续执行;如果不相等,assertEqual
会抛出一个 AssertionError
异常,指出测试失败,并显示预期值和实际值,以便开发者能够快速定位和修复问题。其他两个根据后面结尾则可判断出其含义。
2.2 addTests(tests)
-
作用: 将多个测试用例或测试套件(可迭代对象,包含
TestCase
或TestSuite
实例)一次性添加到测试套件中。 -
参数: 可迭代对象,包含要添加的测试用例或测试套件。
-
示例如下:
#采用刚才创建的测试用例
suite = unittest.TestSuite()
tests_to_add = [MyTestCase('test_case_1'),MyTestCase('test_case_2'),MyTestCase('test_case_3')]
suite.addTests(tests_to_add)
2.3 run(result)
-
作用: 运行测试套件中的所有测试用例,并将结果收集到
TestResult
实例中。 -
参数: result–
TestResult
实例,用于收集测试结果。 -
注意:与
TestCase.run()
不同,TestSuite.run()
需要传递一个TestResult
实例。
2.4 debug()
-
作用:运行测试套件中的所有测试用例,但不收集结果。这允许测试引发的异常传播到调用方,并可用于在调试器下运行测试。
-
示例:
#采用刚才创建的测试用例
suite = unittest.TestSuite()
tests_to_add = [MyTestCase('test_case_1'),MyTestCase('test_case_2'),MyTestCase('test_case_3')]
suite.addTests(tests_to_add)
suite.debug()
2.5 TestRunner
-
基本概念: TestRunner是一种测试执行过程管理平台或工具,它主要用于执行测试套件(TestSuite)中的测试用例(TestCase),并管理和跟踪测试过程。TestRunner在自动化测试领域扮演着重要角色,特别是在处理大量回归测试时,能够显著提高测试效率和准确性。
-
生成测试报告: 测试执行完成后,TestRunner会生成测试报告,包括测试用例的执行情况、测试结果等信息。
#采用刚才创建的测试用例
suite = unittest.TestSuite()
tests_to_add = [MyTestCase('test_case_1'),MyTestCase('test_case_2'),MyTestCase('test_case_3')]
suite.addTests(tests_to_add)
# 实例化TestRunner
runner = unittest.TextTestRunner()
# 执行测试
runner.run(suite)
也可创建report文件夹,输出测试报告html,示例如下所示:
import unittest
from unittestreport import TestRunner
import os
class MyTestCase(unittest.TestCase):
def test_case_1(self):
self.assertEqual(1 + 2, 2, "1 + 1 应该等于 2")
def test_case_2(self):
self.assertTrue(2 > 1, "2 应该大于 1")
def test_case_3(self):
self.assertIn('a', 'abc', "'a' 应该在 'abc' 中")
# 创建 TestSuite 实例
suite = unittest.TestSuite()
# 向 TestSuite 中添加测试用例
# 方式一:逐个添加
suite.addTest(MyTestCase('test_case_1'))
suite.addTest(MyTestCase('test_case_2'))
BasePath = os.path.dirname(__file__)#获取当前文件所在路径
if __name__ == "__main__":
if not os.path.isdir("report"):
os.mkdir("report")
fp = BasePath + "\\report" #特别需要注意的是 report文件是已存在的,否则会报错
#filename为文件名称,report_dir报告输出位置,title测试标题,tester测试测试人员,desc描述
runner = TestRunner(suite,filename="TEST测试报告.html",report_dir=fp,title="TEST测试报告",tester="USER1",desc="20240731执行测试")
runner.run()
运行结果如下:
则可在report文件夹下找到对应的测试报告
可用浏览器打开,如下图所示:
可点击详情,进行查看测试用例成功/失败原因。