py.test framework

  • Offical site

  • 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
    

results matching ""

    No results matching ""