pytest 之 fixture引數化

2021-10-21 18:05:39 字數 4158 閱讀 5381

pytest 之 fixture引數化

前面通過unittest框架介紹了ui自動化po模式,basepage封裝後,unittest框架搭建的ui自動化框架,基本就成型了。

前面的幾篇pytest文章,也簡要介紹了pytestunittest框架的相同與不同之處。將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對應的是引數名,這個引數名需要和測試用例函式中的引數名一致,不然無法識別。

本質就是pytestlds.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...