文档:https://docs.python.org/3/library/unittest.html
基本概念
-
test fixture
一个test fixture
代表执行一个或者多个测试时需要准备环境,以及相关联的清理环境的工作。这包含很多内容,比如创建临时的数据库、目录等。 -
test case
一个test case
就是测试用例,测试当中的最小单元。unittest
提供一个基本的类TestCase
,用来创建一个test case
。 -
test suite
test suite
是一组test case
或者test suite
的集合,也可以两者都有。用来将需要一同执行的测试用例聚合到一起。 -
test runner
一个test runner
是用来执行测试用例的,对测试进行编排并把结果返回给用户。
简单例子
编写单元测试时,我们需要编写一个测试类,从 unittest.TestCase
继承。
以 test
开头的方法就是测试方法,不以 test
开头的方法不被认为是测试方法,测试的时候不会被执行。
import unittest
class TestStringMethods(unittest.TestCase):
def test_upper(self):
# 检查 'foo'.upper() 和 'FOO' 是否相等
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
# 检查 'FOO'.isupper() 是否为 True
self.assertTrue('FOO'.isupper())
# 检查 'Foo'.isupper() 是否为 Flase
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
# 捕捉 TypeError 错误
with self.assertRaises(TypeError):
s.split(2)
if __name__ == '__main__':
unittest.main()
我们把代码保存为 test.py
文件,现在这样运行它:
$ python test.py
运行结果:
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
另一种更常见的方法是在命令行通过参数 -m unittest
直接运行单元测试:
$ python -m unittest test
这是推荐的做法,因为这样可以一次批量运行很多单元测试,并且,有很多工具可以自动来运行这些单元测试。
加上参数 -v
可以看到更详细的输出:
$ python -m unittest test -v
test_isupper (test.TestStringMethods) ... ok
test_split (test.TestStringMethods) ... ok
test_upper (test.TestStringMethods) ... ok
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
setUp 与 tearDown
可以在单元测试中编写两个特殊的 setUp()
和 tearDown()
方法。这两个方法会分别在每调用一个测试方法的前后分别被执行。
setUp()
和 tearDown()
方法有什么用呢?设想你的测试需要启动一个数据库,这时,就可以在 setUp()
方法中连接数据库,在 tearDown()
方法中关闭数据库,这样,不必在每个测试方法中重复相同的代码。
class TestDict(unittest.TestCase):
def setUp(self):
print('setUp...')
def tearDown(self):
print('tearDown...')
网友评论