Python测试框架使用Python的内置assert()函数来测试特定条件.如果断言失败,将引发AssertionError.然后,测试框架将测试标识为失败.其他异常被视为错误.
以下三组断言函数在unittest模块中定义 :
基本布尔断言
比较断言
集合的断言
基本断言函数评估操作的结果是True还是False.所有断言方法都接受 msg 参数,如果指定,则将其用作失败时的错误消息.
Sr.No. | 方法&描述 |
---|---|
1 | assertEqual(arg1,arg2,msg = None) 测试 arg1 和 arg2 是平等的.如果值不相等,则测试将失败. |
2 | assertNotEqual(arg1,arg2,msg = None) 测试 arg1 和 arg2 不相等.如果值比较相等,则测试将失败. |
3 | assertTrue(expr,msg = None) 测试那个 expr 是真的.如果为false,则测试失败 |
4 | assertFalse(expr,msg = None) 测试 expr |
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,则测试失败 |
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)
第二组断言函数是比较断言:
assertAlmostEqual (first, second, places = 7, msg = None, delta = None)
通过计算差值来测试第一个和第二个大致(或不是大约)相等,四舍五入到给定的数量decimal places (默认7),
assertNotAlmostEqual (first, second, places, msg, delta)
通过计算差值,舍入到给定的小数位数(默认值为7)并比较为零来测试第一个和第二个不大致相等.
在上述两个函数中,如果提供delta而不是places,那么first和second之间的差值必须小于或等于(或gre a)比delta.
同时提供delta和places会引发TypeError.
assertGreater (first, second, msg = None)
根据方法名称测试第一个是否大于秒.如果没有,测试将失败.
assertGreaterEqual (first, second, msg = None)
根据方法名称测试 first 是否大于或等于 second .如果没有,测试将失败
assertLess (first, second, msg = None)
根据方法名称测试第一小于秒.如果没有,测试将失败
assertLessEqual (first, second, msg = None)
根据方法名称测试 first 小于或等于 second .如果没有,测试将失败.
assertRegexpMatches (text, regexp, msg = None)
测试正则表达式搜索是否与文本匹配.如果失败,错误消息将包括模式和文本. regexp可以是正则表达式对象,也可以是包含适合 re.search()使用的正则表达式的字符串.
assertNotRegexpMatches (text, regexp, msg = None)
验证 regexp 搜索与文本不匹配.失败并显示错误消息,包括模式和匹配的 text 部分. 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报告为Failure.在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)
这组断言函数用于Python中的集合数据类型,例如List ,元组,字典和集.
Sr.No. | 方法&描述 |
---|---|
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)