1. unittest 工作原理
unittest 是 Python 自带的单元测试框架,最核心的部分有:TestCase ,TestSuite ,TestRunner 。
TestCase :用户自定义的测试 case 的基类。调用 run() 方法,会依次调用 setUp() 方法、执行用例的方法、tearDown() 方法。TestSuite :测试用例集合。可以通过 addTest() 方法手动增加 TestCase ,也可以通过 TestLoader 自动添加 Test Case ,TestLoader 在添加用例时没有顺序。TestRunner :运行测试用例的驱动类。可以执行 TestCase ,也可以执行 TestSuite ,执行后 TestCase 和 TestSuite 会自动管理 TestResult 。
测试流程:
首先写好 TestCase ,然后由 TestLoader 加载 TestCase 到 TestSuite ,然后由 TextTestRunner 来运行 TestSuite ,运行的结果保存在 TextTestReusult 中,整个过程集成在 unittest.main 模块中。
下面通过实例说明 unittest 各部分的使用情况。
2. 使用 unittest
一般我们有两种使用 unittest 的方式:一种是使用 unittest.main() 进行简单测试,一种是自定义用例执行(使用 TestCase 、TestSuite 、TestRunner 等)。
使用 unittest.main()
unittest.main() 是启动测试的函数,我们调用该方法来开始测试。执行 unittest.main() 则会运行以 test 开头的方法,示例如下。
首先创建一个函数集 math_function.py :
def add(a, b):
return a + b
def minus(a, b):
return a - b
def multi(a, b):
return a * b
def divide(a, b):
return a / b
为这个函数集写一个测试模块 test_math_function.py :
import unittest
from my_note.test_unit.math_function import *
class TestMathFunc(unittest.TestCase):
def setUp(self):
print("测试开始!")
@unittest.skip('不执行该测试方法')
def test_add(self):
s = add(1, 1)
print(s)
self.assertEqual(3, s)
def test_minus(self):
m = minus(2, 1)
print(m)
self.assertEqual(1, m)
def test_multi(self):
mul = multi(2, 3)
print(mul)
self.assertEqual(6, mul)
def test_divide(self):
d = divide(8, 2)
print(d)
self.assertEqual(4, d)
def tearDown(self):
print("测试结束!")
if __name__ == '__main__':
unittest.main()
测试结果:
测试开始!
4.0
测试结束!
测试开始!
1
测试结束!
测试开始!
6
测试结束!
s...
----------------------------------------------------------------------
Ran 4 tests in 0.000s
OK (skipped=1)
注:
setUp() 方法会在测试用例执行之前执行,用于准备测试环境或者进行初始化工作;tearDown() 方法则会在测试用例执行之后执行,用于测试完成之后的清理工作;- 在测试方法前加上
@unittest.skip('不执行该测试方法') ,就不会再执行该测试方法。
自定义用例执行
使用 unittest.main() 会按顺序执行所有的测试方法,我们也可以控制用例执行的顺序。
新建一个 test_suite.py ,自定义用例的执行顺序。
import unittest
from my_note.test_unit.test_math_function import TestMathFunc
if __name__ == '__main__':
suite = unittest.TestSuite()
tests = [TestMathFunc("test_multi"), TestMathFunc("test_minus")]
suite.addTests(tests)
"""
通过TextTestRunner类提供的run()方法来执行测试用例;
TextTestRunner类将用例执行的结果以text形式输出;
verbosity是指测试结果输出的详细程度,有0-6级,2表示输出完整信息。
"""
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)
测试结果:
测试开始!
6
测试结束!
测试开始!
1
测试结束!
test_multi (my_note.test_unit.test_math_function.TestMathFunc) ... ok
test_minus (my_note.test_unit.test_math_function.TestMathFunc) ... ok
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
注:
TestSuite 是测试用例的集合,可以通过 addTest() 方法手动添加测试用例,添加的顺序就是执行的顺序;- 通过
TextTestRunner 类提供的 run() 方法来执行测试用例,TextTestRunner 类将用例执行的结果以 text 形式输出; verbosity 是指测试结果输出的详细程度,有 0-6 级。verbosity 默认为 1,表示不输出完整结果,用例成功输出 . ,失败则输出 F ;verbosity = 2 表示输出完整信息。
|