测试包(TestSuite)可以组织多个测试用例,测试包还可以嵌套测试包。在使用测试包组织多个测试用例和测试包之后,程序可以使用测试运行器(TestRunner)来运行该测试包所包含的所有测试用例。
为了示范测试包的功能,下面再开发一个程序(hello.py):
# 该方法简单地返回字符串
def say_hello():
return "Hello World."
# 计算两个整数的和
def add(nA, nB):
return nA + nB
接下来为上面程序提供如下测试类(test_hello.py):
import unittest
from hello import *
class TestHello(unittest.TestCase):
# 测试say_hello函数
def test_say_hello(self):
self.assertEqual(say_hello() , "Hello World.")
# 测试add函数
def test_add(self):
self.assertEqual(add(3, 4) , 7)
self.assertEqual(add(0, 4) , 4)
self.assertEqual(add(-3, 0) , -3)
将 test_fk_math.py 和 test_hello.py 文件放在同一目录,此时程序就可以通过 TestSuite 将它们组织在一起,然后使用 TestRunner 来运行该测试包。
import unittest
from test_fk_math import TestFkMath
from test_hello import TestHello
test_cases = (TestHello, TestFkMath)
def whole_suite():
# 创建测试加载器
loader = unittest.TestLoader()
# 创建测试包
suite = unittest.TestSuite()
# 遍历所有测试类
for test_class in test_cases:
# 从测试类中加载测试用例
tests = loader.loadTestsFromTestCase(test_class)
# 将测试用例添加到测试包中
suite.addTests(tests)
return suite
if __name__ == '__main__':
# 创建测试运行器(TestRunner)
runner = unittest.TextTestRunner(verbosity=2) //①
runner.run(whole_suite())
上面程序调用 TestSuite 的 addTests() 方法来添加测试用例,这样就实现了使用 TestSuite 来组织多个测试用例。
上面程序还使用 TestLoader 来加载测试用例,该对象提供了一个 loadTestsFromTestCase() 方法,从指定类加载测试用例。
上面程序中的 ① 号代码创建了 TextTestRunner,它是一个测试运行器,专门用于运行测试用例和测试包。其实前面使用的 unittest.main() 函数,同样也是通过 TextTestRunner 来运行测试用例的。
程序中的 ① 号代码在创建 TextTestRunner 时还指定了 verbosity=2,这样可以生成更详细的测试信息。
在调用 unittest.main() 函数时同样可指定 verbosity=2,用来生成更详细的测试信息。
运行上面程序,可以看到生成如下测试报告:
test_add (test_hello.TestHello) ... ok
test_say_hello (test_hello.TestHello) ... ok
test_one_equation (test_fk_math.TestFkMath) ... FAIL
test_two_equation (test_fk_math.TestFkMath) ... ok
======================================================================
FAIL: test_one_equation (test_fk_math.TestFkMath)
----------------------------------------------------------------------
Traceback (most recent call last):
File "E:\BaiduNetdiskDownload\《疯狂Python讲义》光盘文件\codes\16\16.5\test_fk_math.py", line 24, in test_one_equation
self.assertEqual(one_equation(5 , 9) , -1.8)
AssertionError: 1.8 != -1.8
----------------------------------------------------------------------
Ran 4 tests in 0.017s
FAILED (failures=1)
从上面的运行结果可以看到,测试报告通过更详细的信息来提示每个测试用例的运行结果,此时同样可以看到 test_one_equation() 测试失败。
如果不希望仅能在控制台中看到测试报告,而是希望直接生成文件格式的测试报告,则可以在 ① 号代码创建 TextTestRunner 对象时指定 stream 属性,该属性是一个打开的类文件对象,这样程序就会把测试报告输出到该类文件对象中。
例如,将上面的 __main__ 部分改为如下形式:
if __name__ == '__main__':
with open('fk_test_report.txt', 'a') as f:
# 创建测试运行器(TestRunner),将测试报告输出到文件中
runner = unittest.TextTestRunner(verbosity=2, stream=f)
runner.run(whole_suite())
再次运行该程序,此时在控制台中将看不到任何信息,测试报告将会被输出到 fk_test_report.txt 文件中。