pytest 之 fixture 的前置后置功能


  在測試過程中需要前置、后置條件。比如 unittest 中使用 setup(前置)、teardown(后置)來表示整個測試用例類的前置和后置,那么pytest 框架是呢,pytest 是在 固定文件內一個函數內來表示 前置 + 后置,使用 yield 分開前置后置;fixture 就是,一個函數:前置 + 后置

步驟:

 

 

 

一、fixture (譯:菲克斯這兒)之 conftest.py (譯:康菲泰斯特)文件

  • 在定義 fixture 時,需要引入 import pytest
  • 定義公共的 fixture:前置+后置,多個測試類中都可以調用
  • pytest 提供了 conftest.py 文件,可以將 fixture :前置+后置,定義在此文件中
  • 運行測試用例時,不需要導入這個文件,會自動去查找 conftest.py (譯:康菲泰斯特)這個文件,然后去找到對應的
  • 共享文件:conftest.py 文件名不可更改;因為,不需要引入就可以使用其中的fixture

 

二、創建 conftest.py 文件,定義前置 + 后置

  fixture 函數根據關鍵字 yield 作為前置和后置的分割線,並且 yield 也可以接收返回值,返回元祖,作用相當於return

  yield(譯:優特):分割線,返回前置結果

import pytest

# @pytest.fixture(scope="function")  # 默認
@pytest.fixture()
def init_demo():
    print("這是測試用例的前置")
    a = 1
    yield a  # 分割線(yield + 返回值)
    print("這是測試用例的后置")

 

三、調用fixture

1.在測試用例中直接調用

  將fixtures的函數名稱作為測試用例的入參

  如果fixture有返回值,那么測試用例中的fixture函數名稱就接收返回值,並且可以將fixture函數名稱作為返回值使用

def test_add_01(init_demo):
    b = init_demo + 2
    assert 3 == b

  運行結果:

 

2.用 fixture 裝飾器調用fixture

  在測試用例/測試類前面加上@pytest.mark.usefixtures('fixture函數名稱')

  ps:定義conftest.py文件,在此文件中可以定義多個fixture,pytest會自動搜索此文件

import pytest


@pytest.mark.usefixtures('init_demo')
def test_add_02():
    b = 1 + 2
    assert 3 == b

  運行結果:

 

3.用 autouse 調用 fixture

  • 在定義 fixture 時,有一個參數 autouse,默認設置的為 False
  • 默認為 False,就可以選擇用上面兩種方式來使用 fixture
  • 當設置為 Ture 時,在一個session內的所有的 test 都會自動調用這個fixture,建議該開關謹慎使用

  conftest代碼如下:

import pytest

@pytest.fixture(autouse=Ture)
def init_demo():
    print("這是測試用例的前置")
    yield
    print("這是測試用例的后置")

  測試代碼如下:

import pytest


def test_add_02():
    b = 1 + 2
    assert 3 == b

  運行結果:

 

四、fixture的繼承(前置的前置,后置的后置)

  • 作用域(scope關鍵字):function/函數級(測試用例)、class/類級(測試類)、module/模塊級(測試模塊—py文件)、session/會話級(整個測試執行會話)
  • 形象比喻:夾心餅干
  • 繼承條件:作用域由里向外繼承作用域,也可以繼承同級的作用域
  • 執行順序:前置由外層到內層執行,后置由內層到外層執行,先執行最里層的作用域,在執行它的上一層作用域,直到再向外找不到作用域為止
  • 繼承方法:直接將繼承的 fixture 的函數名稱作為入參傳入即可
  • 返回值:繼承父類的同時,也繼承了父類的返回值

  conftest.py代碼如下:

import pytest


@pytest.fixture(scope='session')
def init_session():
    print("這是測試會話的前置")
    yield
    print("這是測試會話的后置")


@pytest.fixture(scope='module')
def init_module(init_session):
    print("這是測試模塊的前置")
    yield
    print("這是測試模塊的后置")


@pytest.fixture(scope='class')
def init_class(init_module):
    print("這是測試類的前置")
    yield
    print("這是測試類的后置")


@pytest.fixture  # 相當於@pytest.fixture(scope='function')
def init_function(init_class):
    print("這是測試用例的前置")
    yield
    print("這是測試用例的后置")

  測試代碼如下:

import pytest


@pytest.mark.usefixtures('init_function')
def test_demo():
    print('測試用例')
    assert 3 == 3

  運行結果:

 

五、層級作用域

使用 fixture 的順序-- 子目錄當中,也可以擁有自己的 conftest

  • 先用自己的,再去找同級目錄下的 conftest.py 再去找上一級目錄 下的 conftest.py

 

*******尊重作者,本文內容借鑒於:https://www.cnblogs.com/xiaogongjin/    ******* 


免責聲明!

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



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