在測試過程中需要前置、后置條件。比如 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/ *******