pytest 之 fixture引數化
前面通過unittest
框架介紹了ui自動化po模式
,basepage封裝後,unittest
框架搭建的ui自動化框架,基本就成型了。
前面的幾篇pytest
文章,也簡要介紹了pytest
和unittest
框架的相同與不同之處。將unittest
框架替換為pytest
框架,主要在fixture:前置後置
、斷言的表達
這兩方面改動比較大。
在po分層中,元素定位、元素操作和測試資料這三層,是不需要進行改動的,需要進行改動的,是測試用例層
修改前置後置
在testcases目錄下新建乙個conftest.py 檔案
,用於存放前置與後置的內容
import pytest
from selenium import webdriver
from po.pageobjects.login_page import loginpage
from po.pageobjects.home_page import homepage
import ddt
from po.testdatas import global_datas as gd
from po.testdatas import login_datas as lds
import logging
@pytest.fixture
definit_driver()
:'''
用例前置:開啟谷歌瀏覽器訪問163郵箱登入頁面並最大化視窗
用例後置:退出瀏覽器
:return:
'''logging.info(
"*********初始化driver的前置**************"
) driver = webdriver.chrome(
) driver.get(gd.base_url)
driver.maximize_window(
)yield driver
logging.info(
"*********初始化driver的後置**************"
) driver.quit(
)
修改測試用例檔案
先拿登入成功的測試用例來說:
import pytest
from selenium import webdriver
from po.pageobjects.login_page import loginpage
from po.pageobjects.home_page import homepage
import ddt
from po.testdatas import global_datas as gd
from po.testdatas import login_datas as lds
import logging
from po.common import logger
# @ddt.ddt()
@pytest.mark.usefixtures(
"init_driver"
)class
testlogin
:def
test_login_success
(self,init_driver)
: logging.info(
"*********登入操作正常場景-登入成功**************"
)# 步驟:
# 1、登入頁面-登入操作
loginpage(init_driver)
.login(
*lds.success_case)
# 輸入賬號密碼
# 斷言:
# 1、首頁-獲取元素是否存在 (進行斷言操作,元素可見返回true)
在終端輸入命令pytest -s -v
,執行一下登入成功的用例,執行通過,說明 pytest替換unittest 第一步已經成功了
在unittest框架
中,資料驅動使用ddt模組
,然而,ddt 模組
不能和pytest
中的fixture
共用,所以要換用pytest 的引數化
來實現ddt
引數化的使用
在測試用例的前面加上:
@pytest.mark.parametrize(「引數名」,列表資料)
引數名:用來接收每一項資料,並作為測試用例的引數。
列表資料:一組測試資料。
@pytest.mark.parametrize(
"引數1,引數1",[
(資料1,資料2),
(資料1,資料2)]
)
示例:
@pytest.mark.parametrize(
"a,b,c",[
(1,2
,3),
(10,10
,20),
(100
,100
,200),
(101
,102
,203)]
)def
test_add
(a,b,c)
res = a + b
assert res == c
修改測試用例檔案
"*********登入操作異常場景-登入失敗**************"
)# 步驟:
# 1、登入頁面-登入操作
lp = loginpage(init_driver)
lp.login(case[
"user"
], case[
"psd"])
# 輸入 cases 資料中的 賬號和密碼
# print(case["user"], case["psd"], case["check"])
# 斷言:
# 1、登入頁面-獲取錯誤提示資訊 進行對比
# print(lp.get_error_msg())
re_error_msg = lp.get_error_msg(
)assert re_error_msg == case[
"check"
] logging.info(
"返回的錯誤提示資訊為{}"
.format
(re_error_msg)
)
其中lds.fail_cases
對應的是列表資料,也就是登入失敗要用到的測試資料,pytest
中就不用像ddt
一樣再用星號解包了,pytest的引數化內部機制自己做了解包處理;
case
對應的是引數名,這個引數名需要和測試用例函式中的引數名一致,不然無法識別。
本質就是pytest
將lds.fail_cases
中的列表資料進行解包,然後通過case
傳參到測試用例函式中
pytest之fixture的詳細使用
前言 1 首先要理解unittest中setup teardown的作用,可以實現在執行用例前或結束後加入一些操作,但這種都是針對整個測試類全域性生效的 2 如果有以下場景 用例 1 需要先登入,用例 2 不需要登入,當每個測試用例的執行環境和條件都不一樣時,顯然無法用 setup 和 teardo...
pytest框架之fixture前置和後置
fixture函式根據關鍵字yield作為前置和後置的分割線,並且yield也可以接收返回值,作用相當於return import pytest pytest.fixture definit demo print 這是測試用例的前置 a 1 yield a 分割線 yield 返回值 print 這...
pytest 之 fixture 的前置後置功能
一 fixture 之 conftest.py 檔案 二 建立 conftest.py 檔案,定義前置 後置 fixture 函式根據關鍵字 yield 作為前置和後置的分割線,並且 yield 也可以接收返回值,返回元祖,作用相當於return yield 譯 優特 分割線,返回前置結果 impo...