Pytest之fixture

10
2020-08
今天距2021年143天
這是ITester軟件測(cè)試小棧第148次推文

點(diǎn)擊上方藍(lán)字“ITester軟件測(cè)試小棧“關(guān)注我,每周一、三、五早上?07:30準(zhǔn)時(shí)推送。
微信公眾號(hào)后臺(tái)回復(fù)“資源”、“測(cè)試工具包”領(lǐng)取測(cè)試資源,回復(fù)“微信群”一起進(jìn)群打怪。
本文4143字,閱讀約需11分鐘
fixture基本介紹
fixture是 pytest 用于將測(cè)試前后進(jìn)行預(yù)備、清理工作的代碼處理機(jī)制。fixture相對(duì)于unittest中的setup和teardown來(lái)說(shuō)有以下幾點(diǎn)優(yōu)勢(shì):
fixure命名更加靈活,局限性比較小;
conftest.py 配置里面可以實(shí)現(xiàn)數(shù)據(jù)共享,不需要import就能自動(dòng)找到一些配置;
scope="session"可以實(shí)現(xiàn)多個(gè).py跨文件使用一個(gè)session來(lái)完成多個(gè)用例。
語(yǔ)法如下:
fixture(callable_or_scope=None,?*args,?scope="function",?params=None,?autouse=False,?ids=None,?name=None)
scope:fixture的作用域,默認(rèn)為function;
autouse:默認(rèn):False,需要用例手動(dòng)調(diào)用該fixture;如果是True,所有作用域內(nèi)的測(cè)試用例都會(huì)自動(dòng)調(diào)用該fixture;
name:裝飾器的名稱,同一模塊的fixture相互調(diào)用建議寫不同的name。
@pytest.fixture即可。@pytest.fixture()
def?fixture_demo():
????print("這是fixture")
yield區(qū)分前后置,即yield前面代碼為前置,后面代碼為后置。from?selenium?import?webdriver
@pytest.fixture()
def?open_browser_init():
????#?前置
????driver?=?webdriver.Chrome()
????driver.get("https://www.baidu.com")
????yield?driver
????#?后置
????driver.quit()
fixture調(diào)用
調(diào)用fixture的三種方式。
import?pytest
from?selenium?import?webdriver
@pytest.fixture()
def?open_browser_init():
????driver?=?webdriver.Chrome()
????driver.get("https://www.baidu.com")
????yield?driver
????driver.quit()
def?test_input(open_browser_init):
????open_browser_init.find_element_by_id("kw").send_keys("ITester")
@pytest.mark.usefixtures("fixture名稱")。import?pytest
from?selenium?import?webdriver
@pytest.fixture()
def?open_browser_init():
????driver?=?webdriver.Chrome()
????driver.get("https://www.baidu.com")
????yield?driver?#返回driver
????driver.quit()
@pytest.mark.usefixtures("open_browser_init")
def?test_input(open_browser_init):??#?fixture名稱作為參數(shù)傳入
????open_browser_init.find_element_by_id("kw").send_keys("ITester")
fixture有個(gè)參數(shù)autouse,默認(rèn)為False。
autouse為True時(shí),同一個(gè)作用域的所有測(cè)試用例都會(huì)調(diào)用這個(gè)fixture。
autouse為False時(shí),需要手動(dòng)調(diào)用fixture。
import?pytest
@pytest.fixture(autouse=True)
def?fixture_auto():
????print("這是fixture_auto")
def?test_demo01():
????print("運(yùn)行test_demo01")
def?test_demo02():
????print("運(yùn)行test_demo02")

fixture作用域
fixture里面有個(gè)scope參數(shù)可以控制fixture的作用范圍,scope參數(shù)可以是session, module,class,function, 默認(rèn)為function。
session 會(huì)話級(jí)別:是多個(gè)文件調(diào)用一次,可以跨.py文件調(diào)用,每個(gè).py文件就是module;
module 模塊級(jí)別:模塊里所有的用例執(zhí)行前執(zhí)行一次module級(jí)別的fixture;
class 類級(jí)別 :每個(gè)類執(zhí)行前都會(huì)執(zhí)行一次class級(jí)別的fixture;
function ?函數(shù)級(jí)別:每個(gè)測(cè)試用例執(zhí)行前都會(huì)執(zhí)行一次function級(jí)別的fixture。
每個(gè)測(cè)試用例之前運(yùn)行一次:
@pytest.fixture()
def?test_fixture():
????a?=?"hello"
????print("每個(gè)測(cè)試用例之前運(yùn)行一次")
????yield?a
def?test_01(test_fixture):
????print("這是test_01")
????assert?"e"?in?test_fixture
def?test_02(test_fixture):
????print("這是test_02")
????assert?"h"?in?test_fixture
運(yùn)行結(jié)果為:

如果一個(gè)class里面有多個(gè)用例,都調(diào)用了此fixture,那么fixture只在此class里所有用例開始前執(zhí)行一次。
import?pytest
@pytest.fixture(scope="class")
def?test_fixture():
????a?=?"hello"
????yield?a
@pytest.mark.usefixtures("test_fixture")
class?TestDemo:
????def?test_demo01(self,test_fixture):
????????assert?"h"?in?test_fixture
????def?test_demo02(self,test_fixture):
????????assert?"o"?in?test_fixture
運(yùn)行結(jié)果為:

在當(dāng)前.py腳本里面所有用例開始前只執(zhí)行一次。
import?pytest
@pytest.fixture(scope="module")
def?test_fixture():
????a?=?"hello"
????print("在當(dāng)前文件下執(zhí)行一次")
????yield?a
def?test_01(test_fixture):
????print("這是test_01")
????assert?"e"?in?test_fixture
@pytest.mark.usefixtures("test_fixture")
class?TestDemo:
????def?test_demo01(self,test_fixture):
????????print("這是test_demo01")
????????assert?"h"?in?test_fixture
????def?test_demo02(self,test_fixture):
????????print("這是test_demo02")
????????assert?"o"?in?test_fixture
運(yùn)行結(jié)果為:

session級(jí)別是可以跨模塊調(diào)用的,多個(gè)模塊下的用例只需調(diào)用一次fixture,那就可以設(shè)置為scope="session",并且寫到conftest.py文件里。
conftest.py作用域:放到項(xiàng)目的根目錄下就可以全局調(diào)用了,如果放到某個(gè)package下,那就在改package內(nèi)有效。
conftest.py的fixture調(diào)用方式,無(wú)需導(dǎo)入,直接使用。
conftest.py
import?pytest
@pytest.fixture()
def?test_fixture():
????a?=?"hello"
????print("這是conftest")
????yield?a
test_demo01.py
def?test_01(test_fixture):
????print("這是test_01")
????assert?"e"?in?test_fixture
test_demo02.py
def?test_02(test_fixture):
????print("這是test_02")
????assert?"h"?in?test_fixture
命令行輸入:pytest -v
輸出結(jié)果如下:



測(cè)試交流Q群:727998947

