python pytest測試框架介紹三


之前介紹了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功能,后續再介紹

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM