py.test framework
pytest是python的一種單元測試框架,與python自帶的unittest測試框架類似,但是比unittest框架使用起來更簡潔,效率更高。它具有如下特點:
- 非常容易上手,入門簡單,文檔豐富,文檔中有很多實例可以參考
- 能夠支援簡單的單元測試和複雜的功能測試
- 支持參數化
- 執行測試過程中可以將某些測試跳過,或者對某些預期失敗的case標記成失敗
- 支持重複執行失敗的case
- 支援運行由nose, unittest編寫的測試case
- 具有很多協力廠商外掛程式,並且可以自訂擴展
- 方便的和持續集成工具集成
其主要缺點是它的 setup/teardown 語法與 unittest 的相容性不如 nose 高,實現方式也不如 nose 直觀
我們可以通過下面的實例,看看使用py.test進行測試是多麼簡單。
- 這裡我們定義了一個被測試函數func,該函數將傳遞進來的參數加1後返回。我們還定義了一個測試函數test_func用來對func進行測試。test_func中我們使用基本的斷言語句assert來對結果進行驗證。
- 執行測試的時候,我們只需要在測試檔test_sample所在的目錄下,運行py.test即可。pytest會在當前的目錄下,尋找以test開頭的檔(即測試檔),找到測試檔之後,進入到測試檔中尋找test開頭的測試函數並執行。
- 通過上面的測試輸出,我們可以看到該測試過程中,一個收集到了一個測試函數,測試結果是失敗的(標記為F),並且在FAILURES部分輸出了詳細的錯誤資訊,説明我們分析測試原因,我們可以看到"assert func(3) == 5"這條語句出錯了,錯誤的原因是func(3)=4,然後我們斷言func(3) 等於 5。
def func(x):
return x+1
def test_func():
assert func(3) == 5
$ py.test
=========================== test session starts ============================
platform linux -- Python 3.4.1 -- py-1.4.27 -- pytest-2.7.1
rootdir: /tmp/doc-exec-101, inifile:
collected 1 items
test_sample.py F
================================= FAILURES =================================
_______________________________ test_answer ________________________________
def test_answer():
> assert func(3) == 5
E assert 4 == 5
E + where 4 = func(3)
test_sample.py:5: AssertionError
========================= 1 failed in 0.01 seconds =========================
編寫pytest測試樣例非常簡單,只需要按照下面的規則:
- 測試檔以test_開頭(以_test結尾也可以)
- 測試類以Test開頭,並且不能帶有 _init_ 方法
- 測試函數以test_開頭
- 斷言使用基本的assert即可
py.test有好多種方法執行測試:
py.test # run all tests below current dir py.test test_mod.py # run tests in module py.test somepath # run all tests below somepath py.test -k stringexpr # only run tests with names that match the # the "string expression", e.g. "MyClass and not method" # will select TestMyClass.test_something # but not TestMyClass.test_method_simple py.test test_mod.py::test_func # only run tests that match the "node ID", # e.g "test_mod.py::test_func" will select # only test_func in test_mod.py