unittest
基本概念
- test fixture:代表了用例执行前的准备工作和用例执行后的清理工作;
- test case:测试用例,测试的最小单位,一般检查一组输入的响应是否符合预期;
- test suite:测试套件,测试用例的组合;
- test runner:执行测试用例并输出测试结果的组件。
基本用法
import unittest
class TestStringMethods(unittest.TestCase):
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)
if __name__ == '__main__':
unittest.main()
- 通过集成unittest.TestCase可自定义测试用例,一个测试用例可有多个测试方法;
- 测试用例方法名以test开头的方法才是测试方法;
- 断言是测试用例的核心。assertEqual()来判断预期结果、assertTrue()和assertFalse()做是非判断、assertRaises()判断预期异常是否被抛出;
- 除使用unittest.main,也可把最后两行替换为
suite = unittest.TestLoader().loadTestsFromTestCase(TestStringMethods)
unittest.TextTestRunner(verbosity=2).run(suite)
Text fixture
通过自定义下面两个方法,实现测试数据以及测试环境的准备及清理:
- TestCase.setUp 每个测试方法运行前都会运行一次,适用于为每个测试用例初始化数据
- TestCase.tearDown 每个测试方法运行后都会运行一次,适用于为每个测试用例清理数据
为避免反复多次读取测试数据文件,可在所有测试方法执行前读取一次数据: - setUpClass() 每个测试用例类执行前会执行一次,接受该class作为唯一参数,并且必须使用装饰器classmethod()
- tearDownClass() 所有测试方法执行完之后才会被调用一次
断言
方法 | 检查点 |
---|---|
assertEqual(a, b) | a == b |
assertNotEqual(a, b) | a != b |
assertTrue(x) | bool(x) is True |
assertFalse(x) | bool(x) is False |
assertIs(a, b) | a is b |
assertIsNot(a, b) | a is not b |
assertIsNone(x) | x is None |
assertIsNotNone(x) | x is not None |
assertIn(a, b) | a in b |
assertNotIn(a, b) | a not in b |
assertIsInstance(a, b) | isinstance(a, b) |
assertNotIsInstance(a, b) | not isinstance(a, b) |
assertRaises(exc, fun, *args, **kwds) | fun(*args, **kwds) raises exc |
assertRaisesRegexp(exc, r, fun, *args, **kwds) | fun(*args, **kwds) raises exc and the message matches regex r |
assertAlmostEqual(a, b) | round(a-b, 7) == 0 |
assertNotAlmostEqual(a, b) | round(a-b, 7) != 0 |
assertGreater(a, b) | a > b 2.7 |
assertGreaterEqual(a, b) | a >= b |
assertLess(a, b) | a < b |
assertLessEqual(a, b) | a <= b |
assertRegexpMatches(s, r) | r.search(s) |
assertNotRegexpMatches(s, r) | not r.search(s) |
assertItemsEqual(a, b) | sorted(a) == sorted(b) 也支持unhashable对象 |
assertDictContainsSubset(a, b) | a里面所有的键值对都在b中存在 |