8、Fixture帶返回值 在fixture中我們可以使用yield或者return來返回我們需要的東西,如測試數據,資料庫連接對象,文件對象等。 沒有後置處理 直接採用return的方式返回數據(yield也可以) import pytest @pytest.fixture() def data_ ...
目錄
8、Fixture帶返回值
在fixture
中我們可以使用yield
或者return
來返回我們需要的東西,如測試數據,資料庫連接對象,文件對象等。
- 沒有後置處理
直接採用return
的方式返回數據(yield
也可以)
import pytest
@pytest.fixture()
def data_fixture():
return ["a", "b", "c"]
def test_case(data_fixture):
print(f"測試數據為:{data_fixture}")
"""
執行結果
fixture/yield_data.py::test_case 測試數據為:['a', 'b', 'c']
PASSED
"""
- 有後置處理
- 使用
yield
返回數據,在yield
下麵添加後置處理
import pytest
@pytest.fixture()
def data_fixture():
print("【前置】")
yield ["a", "b", "c"]
print("【後置】")
def test_case(data_fixture):
print(f"測試數據為:{data_fixture}")
"""
執行結果
fixture/yield_data.py::test_case 【前置】
測試數據為:['a', 'b', 'c']
PASSED【後置】
"""
- 使用
return
返回數據,通過addfinalizer
註冊後置處理
import pytest
@pytest.fixture()
def data_fixture(request):
print("【前置】")
def addfinalizer_demo():
print("【後置】")
request.addfinalizer(addfinalizer_demo)
return ["a", "b", "c"]
def test_case(data_fixture):
print(f"測試數據為:{data_fixture}")
"""
執行結果
fixture/return_data.py::test_case 【前置】
測試數據為:['a', 'b', 'c']
PASSED【後置】
"""
9、Fixture實現參數化
可以通過fixture
的params
參數來實現參數化。(有更好的參數化方式,故此方法不常用)
示例1:
import pytest
data = [("張三","男"), ("李四","女")]
@pytest.fixture(params=data)
def fixture_data(request):
print("【前置】")
def addfinalizer_demo():
print("【後置】")
request.addfinalizer(addfinalizer_demo)
return request.param
def test_case(fixture_data):
print(fixture_data[0], fixture_data[1])
"""
執行結果
fixture/fixture_params.py::test_case[fixture_data0] 【前置】
張三 男
PASSED【後置】
fixture/fixture_params.py::test_case[fixture_data1] 【前置】
李四 女
PASSED【後置】
"""
示例2:通過ids
參數為每個用例取別名
import pytest
data = [("張三","男"), ("李四","女")]
@pytest.fixture(params=data,ids=["Developer", "Tester"])
def fixture_data(request):
print("【前置】")
def addfinalizer_demo():
print("【後置】")
request.addfinalizer(addfinalizer_demo)
return request.param
def test_case(fixture_data):
print(fixture_data[0], fixture_data[1])
"""
執行結果
fixture/fixture_params_ids.py::test_case[Developer] 【前置】
張三 男
PASSED【後置】
fixture/fixture_params_ids.py::test_case[Tester] 【前置】
李四 女
PASSED【後置】
"""
總結:
- 通過
params
參數實現參數化需要用到request
關鍵字,通過return request.param
將測試數據返回。 params
中有多少數據,ids
就必須對應多少參數,脫離使用params
實現參數化,ids
將毫無意義。params
支持的參數格式:- 列表
[]
- 元祖
()
- 元祖列表
[(),(),()]
- 字典列表
[{},{},{}]
- 字典元祖
({},{},{})
- 列表
10、可靠的Fixture寫法
假如,我們有一個登錄頁面,需要進行登錄測試。為了方便測試,我們還有一個管理員的api,可以直接調用來生成測試用戶。那麼,這個測試場景通常會這樣去構建:
- 通過管理API創建一個用戶
- 使用Selenium啟動瀏覽器
- 進入我們網站的登錄頁面
- 使用創建好的用戶進行登錄
- 斷言登錄後的用戶名出現在登錄頁的頁眉中
(一)一個不可靠Fixture的例子
說明:該例子不可執行,僅做示例
import pytest
from selenium import webdriver
import AdminApiClent
import LoginPage
import IndexPage
from urllib.parse import urljoin
base_url = "https:xxx.com"
username = "xxx"
@pytest.fixture()
def setup_fixture():
# 【前置處理】
# 1、通過AdminApiClent創建一個用戶
client = AdminApiClent()
client.create_user(username)
# 2、獲取驅動對象
driver = webdriver.Chrome()
# 3、打開登錄頁
driver.(urljoin(base_url,"/login"))
# 4、執行登錄操作
login_page = LoginPage(driver)
login_page.login(username)
yield username
# 【後置處理】
# 1、關閉瀏覽器
driver.quit()
# 2、刪除用戶
client.del_user(username)
# 3、退出AdminApiClent
client.quit()
def test_login_success(setup_fixture):
# 斷言登錄後用戶名是否出現在首頁
assert setup_fixture == IndexPage.username
上面例子存在的問題:
- 在
setup_fixture
這一個fixture
函數中做的事情太多,很多步驟不容易重用。 - 假設
setup_fixture
中yield
之前出現異常,後置處理不會執行。(雖然可以使用addfinalizer
,但是不易維護和重用)
(二)修改成可靠Fixture的例子
說明:該例子不可執行,僅做展示
import pytest
from selenium import webdriver
import AdminApiClent
import LoginPage
import IndexPage
from urllib.parse import urljoin
base_url = "https:xxx.com"
username = "xxx"
# 處理AdminApiClient
@pytest.fixture(name="client")
def AdminApiClient_fixture():
client = AdminApiClent()
yield client
client.quit()
# 處理用戶
@pytest.fixture()
def user_fixture(client):
client.create_user(username)
yield username
client.del_user(username)
# 處理驅動
@pytest.fixture()
def driver_fixture():
driver = selenium.Chrome()
yield driver
driver.quit()
# 處理登錄
@pytest.fixture()
def login_fixture(driver_fixture, user_fixture):
driver_fixture.get(urljoin(base_url, "/login"))
login_page = LoginPage(driver_fixture)
login_page.login(user_fixture)
# 處理首頁
@pytest.fixture()
def index_fixture(driver_fixture):
return IndexPage(driver_fixture)
# 斷言
def test_login_success(login_fixture,index_fixture,user_fixture):
assert user_fixture == index_fixture.username
這麼改造的優點:
- 每一步都單獨進行了封裝,提高了復用性
- 假設運行中
user_fixture
報錯了,那麼不影響driver_fixture
關閉瀏覽器 - 假設運行中
driver_fixture
報錯了,那麼根本就不會執行user_fixture
參考
https://www.cnblogs.com/liuyuelinfighting/p/15999810.html
https://zhuanlan.zhihu.com/p/359125816