Unittest Framework 简明教程
UnitTest Framework - Assertion
Python 测试框架使用 Python 的内置 assert() 函数,该函数测试特定条件。如果断言失败,则会引发 AssertionError。然后,测试框架会将测试识别为失败。其他异常被视为错误。
在 unittest 模块中定义了以下三组断言函数:
-
Basic Boolean Asserts
-
Comparative Asserts
-
Asserts for Collections
基本断言函数评估运算结果是 True 还是 False。所有 assert 方法都接受一个 msg 参数,如果指定,则该参数在失败时用作错误消息。
Sr.No. |
Method & Description |
1 |
assertEqual(arg1, arg2, msg = None) 测试 arg1 和 arg2 相等。如果这两个值不相等,则测试将失败。 |
2 |
assertNotEqual(arg1, arg2, msg = None) 测试 arg1 和 arg2 不相等。如果这两个值相等,则测试将失败。 |
3 |
assertTrue(expr, msg = None) 测试 expr 为 true。如果为 false,则测试失败 |
4 |
assertFalse(expr, msg = None) 测试 expr 为 false。如果为 true,测试失败 |
5 |
assertIs(arg1, arg2, msg = None) 测试 arg1 和 arg2 评估为同一个对象。 |
6 |
assertIsNot(arg1, arg2, msg = None) 测试 arg1 和 arg2 未评估为同一个对象。 |
7 |
assertIsNone(expr, msg = None) 测试 expr 为 None。如果不为 None,测试失败 |
8 |
assertIsNotNone(expr, msg = None) 测试 expr 不为 None。如果为 None,测试失败 |
9 |
assertIn(arg1, arg2, msg = None) 测试 arg1 在 arg2 中。 |
10 |
assertNotIn(arg1, arg2, msg = None) 测试 arg1 不在 arg2 中。 |
11 |
assertIsInstance(obj, cls, msg = None) 测试 obj 是 cls 的实例 |
12 |
assertNotIsInstance(obj, cls, msg = None) 测试 obj 不是 cls 的实例 |
上面的部分断言函数在下面的代码中实现 −
import unittest
class SimpleTest(unittest.TestCase):
def test1(self):
self.assertEqual(4 + 5,9)
def test2(self):
self.assertNotEqual(5 * 2,10)
def test3(self):
self.assertTrue(4 + 5 == 9,"The result is False")
def test4(self):
self.assertTrue(4 + 5 == 10,"assertion fails")
def test5(self):
self.assertIn(3,[1,2,3])
def test6(self):
self.assertNotIn(3, range(5))
if __name__ == '__main__':
unittest.main()
当运行上面的脚本时,test2、test4 和 test6 将显示失败,其他将会成功运行。
FAIL: test2 (__main__.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Python27\SimpleTest.py", line 9, in test2
self.assertNotEqual(5*2,10)
AssertionError: 10 == 10
FAIL: test4 (__main__.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Python27\SimpleTest.py", line 13, in test4
self.assertTrue(4+5==10,"assertion fails")
AssertionError: assertion fails
FAIL: test6 (__main__.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Python27\SimpleTest.py", line 17, in test6
self.assertNotIn(3, range(5))
AssertionError: 3 unexpectedly found in [0, 1, 2, 3, 4]
----------------------------------------------------------------------
Ran 6 tests in 0.001s
FAILED (failures = 3)
第二组断言函数如下: comparative asserts −
-
assertAlmostEqual (first, second, places = 7, msg = None, delta = None)通过计算差异测试 first 和 second 是否约等于(或不约等于),并四舍五入到指定的小数位数(默认为 7),
-
assertNotAlmostEqual (first, second, places, msg, delta)通过计算差异测试 first 和 second 是否不约等于,并四舍五入到指定的小数位数(默认为 7),并与 0 比较。在上述两个函数中,如果提供了 delta 而不是 places,则 first 和 second 之间的差异必须小于或等于(或大于)delta。同时提供 delta 和 places 将引发 TypeError。
-
assertGreater (first, second, msg = None)根据方法名称测试 first 是否大于 second。如果不是,则测试失败。
-
assertGreaterEqual (first, second, msg = None)根据方法名称测试 first 是否大于或等于 second。如果不是,则测试失败
-
assertLess (first, second, msg = None)根据方法名称测试 first 是否小于 second。如果不是,则测试失败
-
assertLessEqual (first, second, msg = None)根据方法名称测试 first 是否小于或等于 second。如果不是,则测试失败。
-
assertRegexpMatches (text, regexp, msg = None)测试正则表达式搜索是否匹配文本。在失败的情况下,错误消息将包括模式和文本。regexp 可能是一个正则表达式对象或一个包含适合 re.search() 使用的正则表达式的字符串。
-
assertNotRegexpMatches (text, regexp, msg = None) 验证正则表达式搜索与文本不匹配。失败时,返回包括模式和匹配文本部分的错误消息。regexp 可以是正则表达式对象,也可以是包含正则表达式的字符串,以便 re.search() 使用。
断言函数在以下示例中实现 −
import unittest
import math
import re
class SimpleTest(unittest.TestCase):
def test1(self):
self.assertAlmostEqual(22.0/7,3.14)
def test2(self):
self.assertNotAlmostEqual(10.0/3,3)
def test3(self):
self.assertGreater(math.pi,3)
def test4(self):
self.assertNotRegexpMatches("Tutorials Point (I) Private Limited","Point")
if __name__ == '__main__':
unittest.main()
上述脚本将 test1 和 test4 报告为失败。在 test1 中,22/7 的除法不在 3.14 的 7 个小数位之内。类似地,由于第二个参数与第一个参数中的文本匹配,test4 导致 AssertionError。
=====================================================FAIL: test1 (__main__.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "asserttest.py", line 7, in test1
self.assertAlmostEqual(22.0/7,3.14)
AssertionError: 3.142857142857143 != 3.14 within 7 places
================================================================
FAIL: test4 (__main__.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "asserttest.py", line 13, in test4
self.assertNotRegexpMatches("Tutorials Point (I) Private Limited","Point")
AssertionError: Regexp matched: 'Point' matches 'Point' in 'Tutorials Point (I)
Private Limited'
----------------------------------------------------------------------
Ran 4 tests in 0.001s
FAILED (failures = 2)
Assert for Collections
这组断言函数旨在与 Python 中的集合数据类型一起使用,例如 List、Tuple、Dictionary 和 Set。
Sr.No. |
Method & Description |
1 |
assertListEqual (list1, list2, msg = None) 测试两个列表是否相等。如果不相等,则构造一条仅显示两者之间差异的错误消息。 |
2 |
assertTupleEqual (tuple1, tuple2, msg = None) 测试两个元组是否相等。如果不相等,则构造一条仅显示两者之间差异的错误消息。 |
3 |
assertSetEqual (set1, set2, msg = None) 测试两个集合是否相等。如果不相等,则构造一条列出集合之间差异的错误消息。 |
4 |
assertDictEqual (expected, actual, msg = None) 测试两个字典是否相等。如果不相等,则构造一条显示字典之间差异的错误消息。 |
以下示例实现了上述方法 −
import unittest
class SimpleTest(unittest.TestCase):
def test1(self):
self.assertListEqual([2,3,4], [1,2,3,4,5])
def test2(self):
self.assertTupleEqual((1*2,2*2,3*2), (2,4,6))
def test3(self):
self.assertDictEqual({1:11,2:22},{3:33,2:22,1:11})
if __name__ == '__main__':
unittest.main()
在上例中,test1 和 test3 会显示 AssertionError。错误消息显示了 List 和 Dictionary 对象中的差异。
FAIL: test1 (__main__.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "asserttest.py", line 5, in test1
self.assertListEqual([2,3,4], [1,2,3,4,5])
AssertionError: Lists differ: [2, 3, 4] != [1, 2, 3, 4, 5]
First differing element 0:
2
1
Second list contains 2 additional elements.
First extra element 3:
4
- [2, 3, 4]
+ [1, 2, 3, 4, 5]
? +++ +++
FAIL: test3 (__main__.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "asserttest.py", line 9, in test3
self.assertDictEqual({1:11,2:22},{3:33,2:22,1:11})
AssertionError: {1: 11, 2: 22} != {1: 11, 2: 22, 3: 33}
- {1: 11, 2: 22}
+ {1: 11, 2: 22, 3: 33}
? +++++++
----------------------------------------------------------------------
Ran 3 tests in 0.001s
FAILED (failures = 2)