$ py.test
。本文中咱們使用 pytest 指代這個測試框架,py.test 特指運行命令。 <br /> ##較於 nose這裏沒有使用像前三篇同樣(簡介-舉例-discovery-環境)式的分段展開,是由於 pytest 與 nose 的基本用法極其類似。所以只作一個比較就行了。他倆的區別僅在於python
$ py.test
下面使用一個例子說明 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 ===========================
首先,單是從不須要使用特定類模板的角度上,nose 和 pytest 就較於 unittest 好出太多了。doctest 比較奇葩咱們在這裏不比。所以對於 「選一個本身喜歡的測試框架來用」 的問題,就變成了 nose 和 pytest 二選一的問題。單元測試
pythontesting.net 的做者很是喜歡 pytest,並表示測試
<span style="text-decoration:line-through;">pytest 賽高,不服 solo</span>spa
好吧,其實他說的是 「若是你挑不出 pytest 的毛病,就用這個吧」。.net
因而下面咱們就來挑挑 pytest 的毛病:
畢竟 unittest 仍是 Python 自帶的單元測試框架,確定有不少怕麻煩的人在用,因此與其語法保持必定兼容性能避免不少麻煩。即便 pytest 在命令行中有彩色輸出讓我很喜歡,但這仍是不如第一條重要。
實際上,PyPI 中 nose 的下載量也是 pytest 的 8 倍多。
因此假如再繼續寫某一個框架的詳解的話,大概我會選 nose 吧。