Python unittest模块简介

目录

作者:杨冬 欢迎转载,也请保留这段声明。谢谢!
出处:https://andyyoung01.github.io/http://andyyoung01.16mb.com/

unittest测试框架是Python的内置模块。它与其它语言的单元测试框架如JUnit类似。本文简单看一下此模块的使用。

unittest模块一般的使用流程如下:

  1. import unittest
  2. 定义一个继承自unittest.TestCase的测试用例类
  3. 定义setUp和tearDown,在每个测试用例前后做一些辅助工作。
  4. 定义测试用例,名字以test开头。
  5. 一个测试用例应该只测试一个方面,测试目的和测试内容应很明确。主要是调用assertEqual、assertRaises等断言方法判断程序执行结果和预期值是否相符。
  6. 调用unittest.main()启动测试
  7. 如果测试未通过,会输出相应的错误提示。如果测试全部通过则不显示任何东西,这时可以添加-v参数显示详细信息。

下面看一个基本的实例:

test.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import unittest
class TestStringMethods(unittest.TestCase):
def setUp(self):
pass
def test_upper(self):
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
def test_split(self):
s = 'hello world'
self.assertEqual(s.split(), ['hello', 'world'])
# check that s.split fails when the separator is not a string
with self.assertRaises(TypeError):
s.split(2)
def tearDown(self):
pass
if __name__ == '__main__':
unittest.main()

使用python test.py运行该文件后,结果如下:

1
2
3
4
5
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK

如果在测试脚本后面加入-v参数,如python test.py -v,则会显示更详细的测试信息:

1
2
3
4
5
6
7
8
test_isupper (__main__.TestStringMethods) ... ok
test_split (__main__.TestStringMethods) ... ok
test_upper (__main__.TestStringMethods) ... ok
----------------------------------------------------------------------
Ran 3 tests in 0.001s
OK

如果在一个文件夹中有多个测试源文件,要运行所有的这些源文件,对于每个文件都运行一个命令是非常烦人的。这时候使用test discovery就非常方便了。假设所有的测试源代码文件都保存在tests文件夹中,则只要运行python -m unittest discover tests就可以将该文件夹中所有的测试文件都运行一遍。

与unittest相关的更详细的其它信息可以在Python的官方文档(或中文翻译)中找到。