前面我们讲到测试用例的执行顺序,是按照用例名来执行的,但是我们有时候只要执行其中的几条测试用例,那怎么办?怎么才能在不改变用例名的情况下来选择我们想要执行的测试用例呢?办法就是我们下面要讲的 TestSuite 测试套件。
TestSuite和 TextTestRunner :
TestSuite(测试套件):实际上就是测试集,测试用例的集合,将我们需要执行的测试用例添加到测试集中,然后再一键执行。
TextTestRunner :用来执行测试用例集,其实TestCase和TestSuite本身也有自己执行用例的方法,不过TextTestRunner在实际应用中优于它们,另外还有一种更好的方法后面再说。
下面演示 TestSuite 和 TextTestRunner 的用法:被测对象 和 测试用例都沿用上上篇文章的
import unittest
from class_13.test_math import TestMath # 导入测试类
if __name__ == "__main__":
# TestSuite是个类,首先将它实例化,创建一个对象,然后用对象调用它的 addTest 方法
suite = unittest.TestSuite()
# addTest() 传参类型只能是对象,这个对象就是测试类的实例,对象的传参是测试类的用例名,每次只能添加一条测试用例
suite.addTest(TestMath('test_add')) # 添加测试用例,将测试用例塞到 suite 里
suite.addTest(TestMath('test_sub')) # 添加测试用例,将测试用例塞到 suite 里
suite.addTest(TestMath('test_multiply')) # 添加测试用例,将测试用例塞到 suite 里
suite.addTest(TestMath('test_divide')) # 添加测试用例,将测试用例塞到 suite 里
# 创建个TextTestRunner对象,用对象调用run()方法,注意对象传参 verbosity=2 可以控制测试报告的详细程度,verbosity 有 0 1 2 三个级别,verbosity=2 的输出最详细
run = unittest.TextTestRunner(verbosity=2)
run.run(suite) # 执行 suite 用例集
测试结果:
TestLoader:
上面讲了可以用 TestSuite 加载测试用例,但是一个一个加载显然很影响效率,不符合自动化的气质,所以我们还可以结合 TestLoader 来批量加载测试用例:
TestLoader 也是个类,它包含了多个批量加载测试用例的方法:
- 从测试类加载测试用例:loadTestsFromTestCase()
- 从模块加载测试用例:loadTestsFromModule()
- 还有其他的方式,自己拓展
下面来演示用法:
import unittest # 导入单元测试框架
from class_13 import test_math # 导入测试模块
from class_13.test_math import TestMath # 导入测试类
if __name__ == "__main__":
loader = unittest.TestLoader() # 用来批量加载
suite = unittest.TestSuite() # 用来将用例集合到测试套件
run = unittest.TextTestRunner(verbosity=2) # 用来执行测试用例
suite.addTest(loader.loadTestsFromTestCase(TestMath)) # 从测试类加载测试用例
suite.addTest(loader.loadTestsFromModule(test_math)) # 从测试模块加载测试用例
run.run(suite) # 执行被加载的测试用例
当测试用例非常多的时候,就可以用这样的方法来导入测试用例!
下面看执行结果: