之前介紹了pytest以xUnit形式來寫用例,下面來介紹pytest特有的方式來寫用例
1、pytest fixture實例1
代碼如下
from __future__ import print_function import pytest @pytest.fixture(scope='module') def resource_a_setup(request): print('\nresources_a_setup()') def resource_a_teardown(): print('\nresources_a_teardown()') request.addfinalizer(resource_a_teardown) def test_1_that_needs_resource_a(resource_a_setup): print('test_1_that_needs_resource_a()') def test_2_that_does_not(): print('\ntest_2_that_does_not()') def test_3_that_does(resource_a_setup): print('\ntest_3_that_does()')
使用-s -v運行查看詳情如下

這里使用的了pytest的特有的模式來寫用例,使用的方式是scope方式,scope支持多種,后面會介紹
這里還使用了pytest的addfinalizer內置功能,具體可參見官網,用處是:在最后一個測試項目中調用teardown
2、pytest fixture實例2
代碼如下
from __future__ import print_function import pytest @pytest.fixture() def resource_a(): print('\nresources_a() "setup"') def test_1_that_needs_resource_a(resource_a): print('test_1_that_needs_resource_a()') def test_2_that_does_not(): print('\ntest_2_that_does_not()') def test_3_that_does(resource_a): print('test_3_that_does()')
這是最簡單的一個例子,結果如下

可以看出測試用例繼承了用pytest.fixture的函數后,都執行了setup的功能,默認的pytest.fixture是function
3、使用pytest.fixture的幾種方法
在寫用例時,有幾種方法使用pytest.fixture來形成框架,
方法一:
就是上面提到的這種方法,如下
pytest.fixture() def before(): print('\nbefore each test') def test_1(before): print('test_1()') def test_2(before): print('test_2()')
方法二:使用fixture修飾
@pytest.fixture() def before(): print('\nbefore each test') @pytest.mark.usefixtures("before") def test_1(): print('test_1()') @pytest.mark.usefixtures("before") def test_2(): print('test_2()')
標紅的就是修飾器
4、fixture scope的范圍參數
之前使用@pytest.fixture(scope='module')來定義框架,scope的參數有以下幾種
- function 每一個用例都執行
- class 每個類執行
- module 每個模塊執行(函數形式的用例)
- session 每個session只運行一次,在自動化測試時,登錄步驟可以使用該session
如下一個用module例子
@pytest.fixture(scope='module') def resource_a(): print('\nresources_a() "setup"') def test_1_that_needs_resource_a(resource_a): print('test_1_that_needs_resource_a()') def test_2_that_does_not(): print('\ntest_2_that_does_not()') def test_3_that_does(resource_a): print('test_3_that_does()')
即使我們在每個用例都繼承了resource_a,但在實際測試中,所有用例只執行了一次resource_a

這時,你可能會問,為什么只這setup功能,沒有teardown功能,要teardown怎么寫,方法如下:
def cheese_db(request): ..... def teardown(): print('\n[teardown] cheese_db finalizer, disconnect from db') request.addfinalizer(teardown)
這里使用的還是之前介紹的request.addfinalizer功能,函數名字可以任意取,不一定要teardown
5、帶參數的fixture
這里就不介紹了,看官方文檔吧
6、多種fixture scope結合使用
看代碼,如下
@pytest.fixture(scope="module") def foo(request): print('\nfoo setup - module fixture') def fin(): print('foo teardown - module fixture') request.addfinalizer(fin) @pytest.fixture() def bar(request): print('bar setup - function fixture') def fin(): print('bar teardown - function fixture') request.addfinalizer(fin) @pytest.fixture() def baz(request): print('baz setup - function fixture') def fin(): print('baz teardown - function fixture') request.addfinalizer(fin) def test_one(foo, bar, baz): print('in test_one()') def test_two(foo, bar, baz): print('in test_two()')
測試結果如下

pytest還有很有用的yield功能,后續再介紹
