Python 各類測試框架簡介(四):pytest

pytest 有時也被稱爲 py.test,是由於它使用的執行命令是 $ py.test。本文中咱們使用 pytest 指代這個測試框架,py.test 特指運行命令。 <br /> ##較於 nose

這裏沒有使用像前三篇同樣(簡介-舉例-discovery-環境)式的分段展開,是由於 pytest 與 nose 的基本用法極其類似。所以只作一個比較就行了。他倆的區別僅在於python

  1. 調用測試的命令不一樣,pytest 用的是 $ py.test
  2. 建立測試環境(setup/teardown)的 api 不一樣

下面使用一個例子說明 pytest 的 setup/teardown 使用方式。api

some_test.py:session

lang:python
import pytest
        
@pytest.fixture(scope='function')
def setup_function(request):
    def teardown_function():
        print("teardown_function called.")
    request.addfinalizer(teardown_function)
    print('setup_function called.')

@pytest.fixture(scope='module')
def setup_module(request):
    def teardown_module():
        print("teardown_module called.")
    request.addfinalizer(teardown_module)
    print('setup_module called.')

    
def test_1(setup_function):
    print('Test_1 called.')

def test_2(setup_module):
    print('Test_2 called.')

def test_3(setup_module):
    print('Test_3 called.')

pytest 建立測試環境(fixture)的方式如上例所示,經過顯式指定 scope='' 參數來選擇須要使用的 pytest.fixture 裝飾器。即一個 fixture 函數的類型從你定義它的時候就肯定了,這與使用 @nose.with_setup() 十分不一樣。對於 scope='function' 的 fixture 函數,它就是會在測試用例的先後分別調用 setup/teardown。測試用例的參數如 def test_1(setup_function) 只負責引用具體的對象,它並不關心對方的做用域是函數級的仍是模塊級的。框架

有效的 scope 參數限於:'function','module','class','session',默認爲 function函數

運行上例:$ py.test some_test.py -s-s 用於顯示 print() 函數性能

============================= test session starts =============================
platform win32 -- Python 3.3.2 -- py-1.4.20 -- pytest-2.5.2
collected 3 items

test.py setup_function called.
Test_1 called.
.teardown_function called.
setup_module called.
Test_2 called.
.Test_3 called.
.teardown_module called.


========================== 3 passed in 0.02 seconds ===========================

這裏須要注意的地方是:setup_module 被調用的位置。 <br /> ##pytest 與 nose 二選一

首先,單是從不須要使用特定類模板的角度上,nose 和 pytest 就較於 unittest 好出太多了。doctest 比較奇葩咱們在這裏不比。所以對於 「選一個本身喜歡的測試框架來用」 的問題,就變成了 nose 和 pytest 二選一的問題。單元測試

pythontesting.net 的做者很是喜歡 pytest,並表示測試

<span style="text-decoration:line-through;">pytest 賽高,不服 solo</span>spa

好吧,其實他說的是 「若是你挑不出 pytest 的毛病,就用這個吧」。.net

因而下面咱們就來挑挑 pytest 的毛病:

  1. 它的 setup/teardown 語法與 unittest 的兼容性不如 nose 高,實現方式也不如 nose 直觀
  2. 第一條足矣

畢竟 unittest 仍是 Python 自帶的單元測試框架,確定有不少怕麻煩的人在用,因此與其語法保持必定兼容性能避免不少麻煩。即便 pytest 在命令行中有彩色輸出讓我很喜歡,但這仍是不如第一條重要。

實際上,PyPI 中 nose 的下載量也是 pytest 的 8 倍多。

因此假如再繼續寫某一個框架的詳解的話,大概我會選 nose 吧。

相關文章
相關標籤/搜索