Python幾種常用測試框架
測試的常用規則
- 一個測試單元必須關注一個很小的功能函式,證明它是正確的;
- 每個測試單元必須是完全獨立的,必須能單獨執行。這樣意味著每一個測試方法必須重新載入資料,執行完畢後做一些清理工作。通常通過setUp()和setDown()方法處理;
- 編寫執行快速的測試程式碼。在某些情況下,測試需要載入複雜的資料結構,而且每次執行的時候都要重新載入,這個時候測試執行會很慢。因此,在這種情況下,可以將這種測試放置一個後臺的任務中。
- 採用測試工具並且學著怎麼使用它。
- 在編寫程式碼前執行完整的測試,而且在編寫程式碼後再重新執行一次。這樣能保證你後來編寫的程式碼不會破壞任何事情;
- 在提交程式碼前執行完整的測試;
- 如果在開發期間被打斷了工作,寫一個打斷的單元測試,關於你下一步將要開發的。當你回來工作時,你能知道上一步開發到的指標;
- 單元測試函式使用長的而且具有描述性的名字。在正式執行程式碼中,可能使用square()或sqr()取名,但是在測試函式中,你必須取像test_square_of_number_2()、test_square_negativer_number()這些名字,這些名字描述更加清楚;
- 測試程式碼必須具有可讀性;
- 單元測試對新進的開發人員來說是工作指南。
二、常見的測試框架
2.1 Unittest
unittest是Python內建的標準類庫。它的API跟Java的JUnit、.net的NUnit,C++的CppUnit很相似。
通過繼承unittest.TestCase來建立一個測試用例。
具體請參考 文件
舉個例:
- import unittest
- deffun(x):
- return x + 1
- classMyTest(unittest.TestCase):
- deftest(self):
- self.assertEqual(fun(3), 4)
執行後成功。
但是,如果將期望的結果改成5,則執行的結果如下圖所示:
2.2 Doctest
doctest 模組會搜尋那些看起來像互動式會話的 Python 程式碼片段,然後嘗試執行並驗證結果.即使從沒接觸過 doctest,我們也可以從這個名字中窺到一絲端倪。“它看起來就像程式碼裡的文件字串(docstring)一樣” 如果你這麼想的話,就已經對了一半了。
舉個例子:
- defsquare(x):
- """Squares x.
- >>> square(2)
- 4
- >>> square(-2)
- 4
- >>> square(5)
- 25
- """
- return x * x
- if __name__ == '__main__':
- import doctest
- doctest.testmod()
當執行該程式碼後,會執行文件內>>> 後面的測試程式碼,並與下一行的結果進行比對。執行的結果如下:
但是,如果我們把結果改一下,square(2)的結果改成5,測試程式碼如下:
- defsquare(x):
- """Squares x.
- >>> square(2)
- 5
- >>> square(-2)
- 4
- >>> square(5)
- 25
- """
- return x * x
- if __name__ == '__main__':
- import doctest
- doctest.testmod()
執行的測試結果如下所示:
2.3 py.test
py.test是unittest的替代工具。
儘管它是一個功能豐富、靈活的測試框架,但是它的語法很簡單。建立一個單元測試就像編寫一個模組一樣。相比unittest,實現相同的測試功能,py.test做的事情更少。
py.test詳細 文件 。
首先,安裝py.test
pip install pytest
第二步,編寫測試程式碼
- deffunc(x):
- return x + 1
- deftest_answer():
- assert func(3) == 5
第三步,執行測試程式碼。
- 找到pytest安裝路徑。
- 用其所在的解析器(python.exe)執行test.py ,執行命令比如:
執行的結果如下圖所示:
2.4 Nose
Nose是對unittest的擴充套件,使得python的測試更加簡單。nose自動發現測試程式碼並執行,nose提供了大量的外掛,比如測試輸出的xUnitcompatible,覆蓋報表等等。
注意:nose本身是支援python3的,但是很多它的外掛不支援。
2.5 tox
最大的特色,是自動最測試環境的管理以及使用多個解析器配置進行測試。
2.6 Unittest2
是unitest的升級版。對API進行了改善以及更好的診斷語法。
首先,安裝
pip install unittest2
為了以後能在unittest與unittest2之間進行切換,最好的程式碼編寫方式如下:
import unittest2 as unittest
class MyTest(unittest.TestCase):
...
2.7 mock unittest.mock是用來測試python的庫。在python3.3版本以後,這個是一個標準庫。 對老版本來說,使用pip install mock 進行安裝。
mock的精髓在於,你可以使用模擬的物件來替代你的系統的一部分,然後驗證後續的執行是否正確。
下一篇我們重點講講nose的使用方法。