Python內部自帶了一個單元測試的模塊——pyUnit,也就是我們說的:unittest
先介紹一下unittest的基本使用方法:
1. import unittest模塊
2. 定義一個繼承 unittest.TestCase 的測試用例類
3. 定義 setUp 和 tearDown兩個方法,tearDown的過程很重要,是為以后的TestCase留一個干凈的測試環境。
4. 定義測試用例,均要以test開頭
5. 一個測試用例只需要測試一個方面,測試的目的和測試內容要很明確。一般使用assertEqual、assertIn等斷言方法去判斷程序執行的結果和預期結果是否相符
6. 調用 unittest.main() 開始跑測試用例
7. 測試全部通過,不輸出任何東西;若測試未通過,則會輸出相應的錯誤提示。
下面是unittest中常用的assert語句:
assertEqual(a,b,[msg='測試失敗時打印的信息']):若 a=b,則測試用例通過 assertNotEqual(a,b,[msg='測試失敗時打印的信息']):若a != b,則測試用例通過 assertTrue(x,[msg='測試失敗時打印的信息']):若x是True,則測試用例通過 assertFalse(x,[msg='測試失敗時打印的信息']):若x是False,則測試用例通過 assertIs(a,b,[msg='測試失敗時打印的信息']):若a是b,則測試用例通過 assertNotIs(a,b,[msg='測試失敗時打印的信息']):若a不是b,則測試用例通過 assertIsNone(x,[msg='測試失敗時打印的信息']):若x是None,則測試用例通過 assertIsNotNone(x,[msg='測試失敗時打印的信息']):若x不是None,則測試用例通過 assertIn(a,b,[msg='測試失敗時打印的信息']):若a在b中,則測試用例通過 assertNotIn(a,b,[msg='測試失敗時打印的信息']):若a不在b中,則測試用例通過 assertIsInstance(a,b,[msg='測試失敗時打印的信息']):若a是b的一個實例,則測試用例通過 assertNotIsInstance(a,b,[msg='測試失敗時打印的信息']):若a不是b的實例,則測試用例通過 assertAlmostEqual(a, b):round(a-b, 7) == 0 assertNotAlmostEqual(a, b):round(a-b, 7) != 0 assertGreater(a, b):a > b assertGreaterEqual(a, b):a >= b assertLess(a, b):a < b assertLessEqual(a, b):a <= b assertRegexpMatches(s, re):regex.search(s) assertNotRegexpMatches(s, re):not regex.search(s) assertItemsEqual(a, b):sorted(a) == sorted(b) and works with unhashable objs assertDictContainsSubset(a, b):all the key/value pairs in a exist in b assertMultiLineEqual(a, b):strings assertSequenceEqual(a, b):sequences assertListEqual(a, b):lists assertTupleEqual(a, b):tuples assertSetEqual(a, b):sets or frozensets assertDictEqual(a, b):dicts
(一)assertEqual 和 assertNotEqual
- assertEqual:如兩個值相等,則pass
- assertNotEqual:如兩個值不相等,則pass
使用方法:
assertEqual(first,second,msg)
其中first
與second
進行比較,如果相等則通過;msg
為失敗時打印的信息,選填;斷言assertNotEqual反着用就可以了。
(二)assertTrue和assertFalse
- assertTrue:判斷bool值為True,則pass
- assertFalse:判斷bool值為False,則Pass
使用方法:
assertTrue(expr,msg)
其中express
輸入相應表達式,如果表達式為真,則pass;msg
選填;斷言assertFalse
如果表達式為假,則pass
(三)assertIsNone和assertIsNotNone
- assertIsNone:不存在,則pass
- assertIsNotNone:存在,則pass
使用方法:
assertIsNone(obj,msg)
檢查某個元素是否存在
總結:
-
常用
assertEqual(a, b) assertNotEqual(a, b) assertTrue(x) assertFalse(x) assertIs(a, b) assertIsNot(a, b) assertIsNone(x) assertIsNotNone(x) assertIn(a, b) assertNotIn(a, b) assertIsInstance(a, b) assertNotIsInstance(a, b)
- 其它
assertAlmostEqual(a, b) assertNotAlmostEqual(a, b) assertGreater(a, b) assertGreaterEqual(a, b) assertLess(a, b) assertLessEqual(a, b) assertRegexpMatches(s, re) assertNotRegexpMatches(s, re) assertItemsEqual(a, b) assertDictContainsSubset(a, b) assertMultiLineEqual(a, b) assertSequenceEqual(a, b) assertListEqual(a, b) assertTupleEqual(a, b) assertSetEqual(a, b) assertDictEqual(a, b) assertMultiLineEqual(a, b) assertSequenceEqual(a, b) assertListEqual(a, b) assertTupleEqual(a, b) assertSetEqual(a, b)
使用時機:
那么我們什么時候應該使用斷言呢?如果沒有特別的目的,斷言應該用於如下情況:
- 防御性的編程
- 運行時對程序邏輯的檢測
- 合約性檢查(比如前置條件,后置條件)
- 程序中的常量
- 檢查文檔
- 例:防御性編程中添加斷言
在代碼開始添加注釋是個好的開端,但是人們都不太喜歡讀和更新這些注釋,這些注釋會很快變得過時。但對於斷言,我們可以同時對這塊代碼編寫文檔,如果這些斷言被違反了,會直接引起一個簡單而又直接的失敗。
assert target in(x, y, z) if target ==x: run_x_code() elif target ==y: run_y_code() else: assert target == z run_z_code()
作者:古佛青燈度流年
鏈接:https://www.jianshu.com/p/eea0b0e432da
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。
assertAlmostEqual(a, b):round(a-b, 7) == 0