pytest之fixture使用詳解


簡介:

  fixture區別於unnitest的傳統單元測試(setup/teardown)有顯著改進:

  1.有獨立的命名,並通過聲明它們從測試函數、模塊、類或整個項目中的使用來激活。

  2.按模塊化的方式實現,每個fixture都可以互相調用。

  3.fixture的范圍從簡單的單元測試到復雜的功能測試,可以對fixture配置參數,或者跨函數function,類class,模塊module或整個測試session范圍。

 

 fixture可以當做參數傳入

定義fixture跟定義普通函數差不多,唯一區別就是在函數上加個裝飾器@pytest.fixture(),fixture命名不要以test開頭,跟用例區分開。fixture是有返回值得,沒有返回值默認為None。用例調用fixture的返回值,直接就是把fixture的函數名稱當做變量名稱。

# 作者         :admin   
import pytest
@pytest.fixture()
def test_01():
    a = 5
    return a

def test_02(test_01):
    assert test_01 == 5
    print("斷言成功")



============================= test session starts =============================
platform win32 -- Python 3.7.2, pytest-4.0.2, py-1.8.0, pluggy-0.12.0
rootdir: E:\daima\Project_test\test_demo, inifile:
plugins: allure-adaptor-1.7.10, html-1.22.0, metadata-1.8.0, rerunfailures-7.0
collected 1 item

test_demo_pytest_fixture.py 斷言成功
.

========================== 1 passed in 0.17 seconds ===========================

 

使用多個fixture

如果用例需要用到多個fixture的返回數據,fixture也可以返回一個元祖,list或字典,然后從里面取出對應數據。

# 作者         :admin   
import pytest
@pytest.fixture()
def test_01():
    a = 5
    b = 6
    return (a, b)

def test_02(test_01):
    a = test_01[0]
    b = test_01[1]
    assert a < b
    print("斷言成功")





Launching py.test with arguments E:/daima/Project_test/test_demo/test_demo_pytest_fixture.py in E:\daima\Project_test\test_demo

============================= test session starts =============================
platform win32 -- Python 3.7.2, pytest-4.0.2, py-1.8.0, pluggy-0.12.0
rootdir: E:\daima\Project_test\test_demo, inifile:
plugins: allure-adaptor-1.7.10, html-1.22.0, metadata-1.8.0, rerunfailures-7.0collected 1 item

test_demo_pytest_fixture.py .斷言成功
                                            [100%]

========================== 1 passed in 0.01 seconds ===========================
Process finished with exit code 0

  

fixture的作用范圍(scope)

ixture里面有個scope參數可以控制fixture的作用范圍:session>module>class>function

-function:每一個函數或方法都會調用

-class:每一個類調用一次,一個類中可以有多個方法

-module:每一個.py文件調用一次,該文件內又有多個function和class

-session:是多個文件調用一次,可以跨.py文件調用,每個.py文件就是module

 

代碼示例:

# 作者         :admin   
import pytest
@pytest.fixture(scope="class")
def test_01():
    a = 5
    b = 6
    return (a, b)


class TestNum:
    def test_02(self,test_01):
        a = test_01[0]
        b = test_01[1]
        assert a < b
        print("斷言成功")


Launching py.test with arguments E:/daima/Project_test/test_demo/test_demo_pytest_fixture.py in E:\daima\Project_test\test_demo

============================= test session starts =============================
platform win32 -- Python 3.7.2, pytest-4.0.2, py-1.8.0, pluggy-0.12.0
rootdir: E:\daima\Project_test\test_demo, inifile:
plugins: allure-adaptor-1.7.10, html-1.22.0, metadata-1.8.0, rerunfailures-7.0collected 1 item

test_demo_pytest_fixture.py .斷言成功
                                            [100%]

========================== 1 passed in 0.02 seconds ===========================
Process finished with exit code 0

  

調用fixture的三種方法

1.函數或類里面方法直接傳fixture的函數參數名稱

注釋:代碼詳見上圖

2.使用裝飾器@pytest.mark.usefixtures()修飾需要運行的用例

# 作者         :admin   
import pytest
@pytest.fixture(scope="class")
def test_01():
    a = 5
    b = 6
    return (a, b)

@pytest.mark.usefixtures("test_01")
class TestNum:
    def test_02(self,test_01):
        a = test_01[0]
        b = test_01[1]
        assert a < b
        print("斷言成功")


Launching py.test with arguments E:/daima/Project_test/test_demo/test_demo_pytest_fixture.py in E:\daima\Project_test\test_demo

============================= test session starts =============================
platform win32 -- Python 3.7.2, pytest-4.0.2, py-1.8.0, pluggy-0.12.0
rootdir: E:\daima\Project_test\test_demo, inifile:
plugins: allure-adaptor-1.7.10, html-1.22.0, metadata-1.8.0, rerunfailures-7.0collected 1 item

test_demo_pytest_fixture.py .斷言成功
                                            [100%]

========================== 1 passed in 0.02 seconds ===========================
Process finished with exit code 0

 

3.疊加usefixtures

如果一個方法或者一個class用例想要同時調用多個fixture,可以使用@pytest.mark.usefixture()進行疊加。注意疊加順序,先執行的放底層,后執行的放上層。

# 作者         :admin   
import pytest
@pytest.fixture(scope="class")
def test_01():
    a = 5
    b = 6
    return (a, b)

@pytest.fixture(scope="class")
def test_02():
    print("你是第二個執行")


@pytest.mark.usefixtures("test_02")
@pytest.mark.usefixtures("test_01")
class TestNum:
    def test_03(self,test_01):
        a = test_01[0]
        b = test_01[1]
        assert a < b
        print("斷言成功")


Launching py.test with arguments E:/daima/Project_test/test_demo/test_demo_pytest_fixture.py in E:\daima\Project_test\test_demo

============================= test session starts =============================
platform win32 -- Python 3.7.2, pytest-4.0.2, py-1.8.0, pluggy-0.12.0
rootdir: E:\daima\Project_test\test_demo, inifile:
plugins: allure-adaptor-1.7.10, html-1.22.0, metadata-1.8.0, rerunfailures-7.0collected 1 item

test_demo_pytest_fixture.py 你是第二個執行
.斷言成功
                                            [100%]

========================== 1 passed in 0.02 seconds ===========================
Process finished with exit code 0

  

 


免責聲明!

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



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