其他相關:使用coverage工具統計python單元測試覆寫率
待測類/方法 book.py
測試類test_book.py
運作
結果
給出的結果辨別,成功是 <code>.</code>,失敗是 <code>F</code>,出錯是 <code>E</code>,跳過是 <code>S</code>。
測試的執行跟方法的順序沒有關系。
繼承unittest.TestCase。
以“test”開頭的測試方法,每一類分别添加一個測試方法。
按需添加内置判斷條件如:assertEquals()、assertRaises(Error)。
pycharm還是比較智能的,可以直接運作測試,不過有個地方需要特别注意,pyCharm會自動識别并測試滑鼠所在目前代碼塊,是以有可能你ctrl+shift+f10後,可能運作結果就隻是測試一個方法(筆者可是讓這個弄的莫名其妙,一頓不得其解)。
在測試檔案結尾添加
然後指令行運作
在指令行通過參數<code>-m unittest</code>直接運作單元測試:
這是推薦的做法,因為這樣可以一次批量運作很多單元測試,并且,有很多工具可以自動來運作這些單元測試。
如果每個測試之前都需要準備環境如連接配接資料庫、打開檔案,或尾處理如關閉資料庫、關閉資料流,不可能每個測試方法都寫一遍。
在每個測試方法運作之前運作
在每個測試方法運作之後運作
在每個單元測試開始之前運作
在每個單元測試結束之後運作
示例:
運作結果:
測試跳過某個case?unittest提供了幾種方法。
unittest.skip(reason) skip無條件跳過
unittest.skipIf(condition, reason) skipIf當condition為True時跳過
unittest.skipUnless(condition, reason) skipUnless當condition為False時跳過。
結果:
運作了兩個測試,但test_get被跳過了
測試類的skipTest()方法可以跳過目前測試方法。
結果同上
建立檔案test_suite.py
輸出:
verbosity參數可以控制執行結果的輸出
<code>0</code> 是簡單報告
<code>1</code> 是一般報告
<code>2</code> 是詳細報告。
運作結束會在同目錄下生成了Unittest.txt
HTMLTestRunner是一個第三方的unittest HTML報告庫,首先我們下載下傳HTMLTestRunner.py,并放到目前目錄下,或者你的’C:Python27Lib’下,就可以導入運作了。
可以使用help指令檢視幫助:$ coverage help
關鍵指令如下:
A.run
執行代碼覆寫率統計,隻需要通過coverage的run參數執行被統計代碼即可。
$ coverage run test.py arg1 arg2
test.py是測試腳本,arg1 arg2是test.py執行需要的參數。跑完後,會自動生成一個覆寫率統計結果檔案(data file):.coverage。
B.report
有了覆寫率統計結果檔案,隻需要再運作report參數,就可以在指令裡看到統計的結果。
Stmts/Miss表示語句總數/未執行到的語句數
Cover=(Stmts-Miss)/Stmts
c. html
生成html的測試報告。
$ coverage html -d covhtml
生成的報告直接關聯代碼,高亮顯示覆寫和未覆寫的代碼,支援排序。-d指定html檔案夾。
除了使用指令行,還可以在python代碼中直接調用coverage子產品執行代碼覆寫率的統計。使用方法也非常簡單:
source指定要執行統計的檔案,source = ['totest']隻統計totest.py的覆寫率
directory指定生成html的路徑
Method
Checks that
<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertEqual"><code>assertEqual(a, b)</code></a>
<code>a == b</code>
<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertNotEqual"><code>assertNotEqual(a, b)</code></a>
<code>a != b</code>
<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertTrue"><code>assertTrue(x)</code></a>
<code>bool(x) is True</code>
<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertFalse"><code>assertFalse(x)</code></a>
<code>bool(x) is False</code>
<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertIs"><code>assertIs(a, b)</code></a>
<code>a is b</code>
<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertIsNot"><code>assertIsNot(a, b)</code></a>
<code>a is not b</code>
<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertIsNone"><code>assertIsNone(x)</code></a>
<code>x is None</code>
<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertIsNotNone"><code>assertIsNotNone(x)</code></a>
<code>x is not None</code>
<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertIn"><code>assertIn(a, b)</code></a>
<code>a in b</code>
<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertNotIn"><code>assertNotIn(a, b)</code></a>
<code>a not in b</code>
<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertIsInstance"><code>assertIsInstance(a, b)</code></a>
<code>isinstance(a, b)</code>
<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertNotIsInstance"><code>assertNotIsInstance(a, b)</code></a>
<code>not isinstance(a, b)</code>
<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertRaises"><code>assertRaises(exc, fun, *args, **kwds)</code></a>
<code>fun(*args, **kwds)</code> raises exc
<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertRaisesRegexp"><code>assertRaisesRegexp(exc, r, fun, *args, **kwds)</code></a>
<code>fun(*args, **kwds)</code> raises exc and the message matches regex r
<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertAlmostEqual"><code>assertAlmostEqual(a, b)</code></a>
<code>round(a-b, 7) == 0</code>
<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertNotAlmostEqual"><code>assertNotAlmostEqual(a, b)</code></a>
<code>round(a-b, 7) != 0</code>
<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertGreater"><code>assertGreater(a, b)</code></a>
<code>a > b</code>
<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertGreaterEqual"><code>assertGreaterEqual(a, b)</code></a>
<code>a >= b</code>
<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertLess"><code>assertLess(a, b)</code></a>
<code>a < b</code>
<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertLessEqual"><code>assertLessEqual(a, b)</code></a>
<code>a <= b</code>
<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertRegexpMatches"><code>assertRegexpMatches(s, r)</code></a>
<code>r.search(s)</code>
<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertNotRegexpMatches"><code>assertNotRegexpMatches(s, r)</code></a>
<code>not r.search(s)</code>
<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertItemsEqual"><code>assertItemsEqual(a, b)</code></a>
sorted(a) == sorted(b) and works with unhashable objs
<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertDictContainsSubset"><code>assertDictContainsSubset(a, b)</code></a>
all the key/value pairs in a exist in b
<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertMultiLineEqual"><code>assertMultiLineEqual(a, b)</code></a>
strings
<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertSequenceEqual"><code>assertSequenceEqual(a, b)</code></a>
sequences
<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertListEqual"><code>assertListEqual(a, b)</code></a>
lists
<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertTupleEqual"><code>assertTupleEqual(a, b)</code></a>
tuples
參考文章:
<a href="https://docs.python.org/2/library/unittest.html#">官方文檔</a>
<a href="https://blog.csdn.net/huilan_same/article/details/52944782">Python必會的單元測試架構 —— unittest</a>
廖雪峰