
- 單元測試框架教程
- 單元測試框架 - 首頁
- 單元測試框架 - 概述
- 單元測試框架 - 框架
- 單元測試框架 - API
- 單元測試框架 - 斷言
- 單元測試框架 - 測試發現
- 單元測試框架 - 跳過測試
- 單元測試框架 - 異常測試
- 單元測試框架 - 時間測試
- 單元測試框架 - Unittest2
- 單元測試框架 - 訊號處理
- 單元測試框架 - Doctest
- 單元測試框架 - Doctest API
- 單元測試框架 - Py.test 模組
- Nose 測試 - 框架
- Nose 測試 - 工具
- 單元測試框架資源
- 單元測試框架 - 快速指南
- 單元測試框架 - 資源
- 單元測試框架 - 討論
單元測試框架 - 斷言
Python 測試框架使用 Python 內建的 assert() 函式來測試特定條件。如果斷言失敗,將引發 AssertionError 異常。測試框架隨後將識別該測試為失敗。其他異常將被視為錯誤。
unittest 模組中定義了以下三組斷言函式:
- 基本布林斷言
- 比較斷言
- 集合斷言
基本斷言函式評估操作的結果是 True 還是 False。所有斷言方法都接受一個 msg 引數,如果指定,則在失敗時用作錯誤訊息。
序號 | 方法及描述 |
---|---|
1 | assertEqual(arg1, arg2, msg = None) 測試arg1 和 arg2 是否相等。如果值不相等,測試將失敗。 |
2 | assertNotEqual(arg1, arg2, msg = None) 測試arg1 和 arg2 是否不相等。如果值相等,測試將失敗。 |
3 | assertTrue(expr, msg = None) 測試expr 是否為真。如果為假,測試失敗 |
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。如果是 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)
透過計算差值,四捨五入到給定的十進位制places位數(預設為 7),測試first 和 second 是否近似(或不近似)相等。
assertNotAlmostEqual (first, second, places, msg, delta)
透過計算差值,四捨五入到給定的十進位制位數(預設為 7),並與零進行比較,測試 first 和 second 是否不近似相等。
在以上兩個函式中,如果提供 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 搜尋不匹配text。失敗時會顯示一個錯誤訊息,其中包含模式和匹配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 報告為失敗。在 test1 中,22/7 的結果在小數點後 7 位精度下不等於 3.14。同樣,由於第二個引數與第一個引數中的文字匹配,因此 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 中的集合資料型別一起使用,例如列表、元組、字典和集合。
序號 | 方法及描述 |
---|---|
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。錯誤訊息顯示列表和字典物件中的差異。
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)