当前位置:网站首页>pytest 之 fixture参数化
pytest 之 fixture参数化
2022-08-09 13:06:00 【沉觞流年】
pytest 之 fixture参数化
前面通过unittest
框架介绍了UI自动化PO模式
,basepage封装后,unittest
框架搭建的UI自动化框架,基本就成型了。
前面的几篇pytest
文章,也简要介绍了pytest
和unittest
框架的相同与不同之处。将unittest
框架替换为pytest
框架,主要在 fixture:前置后置
、断言的表达
这两方面改动比较大。
pytest替换unittest
在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
def init_driver():
''' 用例前置:打开谷歌浏览器访问163邮箱登录页面并最大化窗口 用例后置:退出浏览器 :return: '''
logging.info("*********初始化driver的前置**************")
driver = webdriver.Chrome()
driver.get(GD.base_url)
driver.maximize_window()
yield driver
logging.info("*********初始化driver的后置**************")
driver.quit()
修改测试用例文件
先拿登录成功的测试用例来说:
- 1、将
unittest
替换为pytest
。unittest 通过定义一个类,继承unittest.TestCase;而pytest是通过其搜索机制发现测试用例 - 2、前置和后置的替换。调用了
conftest.py 文件
中的init_driver
fixture函数 - 3、断言的替换
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)
assert HomePage(init_driver).get_element_exists()
在终端输入命令 pytest -s -v
,执行一下登录成功的用例,执行通过,说明 pytest替换unittest 第一步已经成功了
pytest 之 fixture参数化
在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
修改测试用例文件
@pytest.mark.parametrize("case",lds.fail_cases)
def test_login_failed(self,case,init_driver):
logging.info("*********登录操作异常场景-登录失败**************")
# 步骤:
# 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
传参到测试用例函数中
边栏推荐
- NC84 完全二叉树结点数
- GIN a preliminary study, the environment is installed
- RTP打包发送H.264
- Professor Chen Qiang's "Machine Learning and R Application" course Chapter 15 Homework
- 缓存和数据库一致性问题
- NC161 二叉树的中序遍历
- CPU-MIPS32 instruction architecture (unlocked pipeline microprocessor)
- Professor Chen Qiang's "Machine Learning and R Application" course Chapter 16 Assignment
- FFmpeg多媒体文件处理(FFMPEG日志系统)
- 快来扔鸡蛋。
猜你喜欢
随机推荐
Professor Chen Qiang's "Machine Learning and R Application" course Chapter 13 Assignment
快来扔鸡蛋。
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面(循环不变量)
jenkins api create custom pipeline
glibc memory management model freeing C library memory cache
Process/Thread Related in Sandbox - 2
kustomize entry example and basic syntax instructions
render解析
剑指 Offer 57 - II. 和为s的连续正数序列(滑动窗口)
【奖励公示】第23期 2022年7月奖励名单公示:社区明星评选 | 新人奖 | 博客同步 | 推荐奖
陈强教授《机器学习及R应用》课程 第十四章作业
Rmarkdown教程
GIN初探,环境安装
Map mixed density function and quantile added line
FPGA - Summary of bugs in ISE (in update)
Unicom network management protocol block diagram
LeetCode 37. Solve Sudoku
FFmpeg multimedia file processing (FFMPEG logging system)
offset、client、scroll、window.pageYOffset比较
An Offer 21. Adjust the array in order to make odd in even the front (loop invariant)