天天看點

UnitTest筆記

其他相關:使用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 &gt; b</code>

<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertGreaterEqual"><code>assertGreaterEqual(a, b)</code></a>

<code>a &gt;= b</code>

<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertLess"><code>assertLess(a, b)</code></a>

<code>a &lt; b</code>

<a href="https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertLessEqual"><code>assertLessEqual(a, b)</code></a>

<code>a &lt;= 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>

廖雪峰