Pytest-Bdd-Playwright 系列教程(2):支持在多浏览器、多环境中执行测试

Pytest-Bdd-Playwright 系列教程(2):支持在多浏览器、多环境中执行测试

  • 前言
  • 一、 修改 conftest.py 文件
  • 二、创建配置文件
  • 三、修改search_steps.py文件
  • 四、运行测试
  • 总结

前言

本文教程知识点:

  • 支持在多浏览器、多环境中执行测试

通过本文内容的学习,你将能够:

  • 使用命令行参数灵活配置测试环境浏览器选项
  • 实现多环境测试;
  • 掌握Pytest fixture的高级用法;
  • 学会使用配置文件管理测试参数;
  • 优化项目结构,提高代码复用性可维护性

一、 修改 conftest.py 文件

conftest.py是Pytest的一个特殊文件,用于存放共享的fixture和hook函数。

我们对 conftest.py 进行以下修改:

  • 添加命令行选项解析
  • 实现动态浏览器选择
  • 支持无头模式运行
  • 引入环境配置
# conftest.py
# Author: blues_Cimport pytest
import loggingfrom pathlib import Path
from utils.config import Config
from playwright.sync_api import sync_playwrightlog = logging.getLogger(__name__)
root_path = Path(__file__).resolve().parentdef pytest_addoption(parser):parser.addoption("--browser", action="store", default="chromium", help="要使用的浏览器: chromium, firefox, or webkit")parser.addoption("--headless", action="store_true", default=False, help="运行浏览器无头模式")parser.addoption("--env", action="store", default=Config.DEFAULT_ENV, help="要测试的环境: test, staging, or prod")@pytest.fixture(scope="function")
def playwright():with sync_playwright() as playwright:yield playwright@pytest.fixture(scope="function")
def browser_type(playwright, request):browser_name = request.config.getoption("--browser")if browser_name == "chromium":return playwright.chromiumelif browser_name == "firefox":return playwright.firefoxelif browser_name == "webkit":return playwright.webkitelse:raise ValueError(f"不支持的浏览器: {browser_name}")@pytest.fixture(scope="function")
def browser(browser_type, request):headless = request.config.getoption("--headless")browser = browser_type.launch(headless=headless)log.info(f"启动浏览器: {browser_type.name}, 无头模式: {headless}")yield browserbrowser.close()@pytest.fixture(scope="function")
def base_url(request):env = request.config.getoption("--env")if env not in Config.ENVIRONMENTS:raise ValueError(f"不支持的环境: {env}")return Config.ENVIRONMENTS[env]@pytest.fixture(scope="function")
def page(browser):page = browser.new_page()yield pagepage.close()

代码修改说明如下

  • pytest_addoption: 添加自定义命令行选项
  • browser_type: 根据命令行参数动态选择浏览器
  • browser: 支持无头模式运行
  • base_url: 根据环境参数选择测试URL

二、创建配置文件

为了更好地管理测试参数,我们创建一个专门的配置文件。
utils/中创建一个config.py文件:

项目结构如下:

│
├── features/                # BDD特性文件
│   └── search.feature       # 搜索功能的特性文件
│
├── pages/                   # 页面对象
│   └── search_page.py       # 搜索页面对象
│
├── steps/                   # 步骤定义
│   └── search_steps.py      # 搜索相关步骤定义
│
├── tests/                   # 测试脚本
│   └── test_search.py
│
├── reports/                 # 测试报告(自动生成)
│   ├── logs/                # 日志文件目录(自动生成)
│   │   └── test_log.log     # 测试日志文件(自动生成)
│   └── test_report.html     # HTML格式的测试报告(自动生成)
│
├── utils/          # 工具函数
│   └── config.py   # 配置管理
│
├── conftest.py              # Pytest fixtures和全局配置
├── pytest.ini               # Pytest配置文件
├── requirements.txt         # 项目依赖
└── README.md                # 项目说明文档
# config.pyclass Config:ENVIRONMENTS = {'test': 'https://www.baidu.com','stage': 'https://example.com','prod': 'https://blog.csdn.net/weixin_48321392'}DEFAULT_ENV = 'test'config = Config()

三、修改search_steps.py文件

我们需要修改步骤定义文件以适应新的配置:

在这里插入图片描述

@given('我在百度搜索页面')
def navigate_to_search_page(search_page, base_url):search_page.navigate(base_url)

代码说明如下

  • conftest.py 文件中定义了一个名为 base_url 的 fixture,它会根据命令行参数 --env 来选择不同的 URL;
  • navigate_to_search_page 函数中base_url 作为参数传入,来获取当前环境的URL,让测试可以在不同环境中运行。

四、运行测试

现在,我们可以使用不同的命令行参数来运行测试:

pytest # 默认使用chromium浏览器,非无头模式,测试环境
pytest --browser firefox --env stage # 使用Firefox浏览器,测试预发布环境
pytest --browser webkit --env prod --headless # 使用WebKit浏览器,无头模式,测试生产环境

总结

在本教程中,我们学习了如何实现多浏览器和多环境的自动化测试:

  • 命令行参数配置:通过命令行参数来控制测试环境和浏览器选项,为测试提供了灵活性;
  • 动态浏览器选择:通过修改conftest.py文件,实现了根据命令行参数动态选择浏览器的功能,可以在不同的浏览器上执行测试;
  • 无头模式支持:支持了无头模式运行,这在自动化测试和持续集成环境中非常有用;
  • 环境配置管理:通过创建配置文件config.py,管理不同测试环境的参数,简化了测试环境的切换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/459532.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ROS概述】C++运行hello world

Python和C通用步骤: 一、创建工作空间并初始化 1、新建工作空间(work space)——使用终端(ctrlaltT) mkdir -p 空间名称/src 2、进入工作空间 cd 空间名称 可以在文件里看到同步变化,并且demo01_ws文…

SpringBoot项目上高并发问题的解决方案

案例:多个用户同时购买数量为1的商品,所以只能有一个购买成功 不加锁 会重复购买 乐观锁,加字段处理,在并发少的时候可以使用 加版本号字段,第一次查询数量的时候读取到版本号,更新数量时用同样的版本号更新…

前端经典【面试题】持续更新HTML、CSS、JS、VUE、FLUTTER、性能优化等

HTML/CSS 面试题 什么是语义化 HTML&#xff1f; 说明&#xff1a;语义化 HTML 使用 HTML 标签来描述内容的含义&#xff0c;而不仅仅是其外观。使用语义化标签可以提高可读性和可访问性&#xff0c;并对 SEO 友好。示例&#xff1a; <header><h1>网站标题</h1&…

服务器数据恢复—异常断电导致服务器挂载分区无法访问的数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌服务器同品牌存储&#xff0c;Linux centos7EXT4文件系统。 服务器故障&#xff1a; 意外断电导致服务器操作系统不能正常启动。经过修复后系统可以正常启动&#xff0c;但是挂载的分区无法正常访问。使用fsck修复这个问题分区&#xff…

gin入门教程(7): 使用 Logrus + Lumberjack 创建日志中间件

结合 Logrus 和 Lumberjack&#xff0c;可以创建一个高效的日志中间件&#xff0c;用于记录请求和响应。以下是实现步骤&#xff1a; 1. 安装依赖 首先&#xff0c;确保安装了 Logrus 和 Lumberjack&#xff1a; go get github.com/sirupsen/logrus go get gopkg.in/natefin…

汉明距离汉明重量

目录 汉明距离汉明重量检错&纠错应用场景例题 汉明距离 在信息论中&#xff0c;两个等长字符串之间的汉明距离&#xff08;英语&#xff1a;Hamming distance&#xff09;是两个字符串对应位置的不同字符的个数。换句话说&#xff0c;它是将一个字符串变换成另外一个字符串…

v4.7版本使用线下付款方式不给管理员发送新订单通知问题修复

在app/api/controller/v1/order/StoreOrderController.php文件中&#xff0c;将红框内的代码注释&#xff0c;加上绿框的代码即可修复 if ($this->services->setOrderTypePayOffline($order[order_id])) {event(NoticeListener, [$order, admin_pay_success_code]);retur…

行为设计模式 -命令模式- JAVA

命令模式 一.简介二. 案例2.1 接收者&#xff08;Receiver&#xff09;2.2 命令接口实现对象&#xff08;ConcreteCommand&#xff09;2.3 调用者&#xff08; invoker&#xff09;2.4 获取Receiver对象2. 5 装配者客户端测试 三. 结论3.1 要点3.2 示例 前言 本设计模式专栏写了…

MySQL 数据库备份与恢复全攻略

MySQL 数据库备份与恢复全攻略 引言 在现代应用中&#xff0c;数据库是核心组件之一。无论是个人项目还是企业级应用&#xff0c;数据的安全性和完整性都至关重要。为了防止数据丢失、损坏或意外删除&#xff0c;定期备份数据库是必不可少的。本文将详细介绍 MySQL 数据库的备…

SQL Server 中,将单行数据转换为多行数据

在 SQL Server 中&#xff0c;将单行数据转换为多行数据通常涉及到将某个字段中的逗号分隔的值拆分成多行。这种操作通常称为“拆分”或“展开”&#xff08;Explode&#xff09;。以下是一些常用的方法来实现这一目标&#xff1a; 1. 使用内置函数 STRING_SPLIT 从 SQL Serv…

rabbitmq 使用注意事项

1&#xff0c;注意开启的端口号&#xff0c;一共四个端口号&#xff0c;1883是mqtt连接的端口号&#xff0c;如果没开&#xff0c;是连接不上的需要手动起mqtt插件。 //开始mqtt插件服务 rabbitmq-plugins enable rabbitmq_mqtt 2&#xff0c;15672端口是http网页登录的管理后…

智能汽车时代的“地平线”,下一个十年的“宁王”

文&#xff5c;刘俊宏 编&#xff5c;王一粟 在港交所上市的敲锣声中&#xff0c;余凯不会忘记9年前从百度大楼中走出&#xff0c;决定从一名科学家转型成一名创业者的夏天。 选择的创业方向&#xff0c;作为大名鼎鼎NEC实验室&#xff08;全球最早的人工智能实验室&#xf…

基于单片机的废气监测系统研究与实现

【 摘 要 】 如今为了尽早发现和防治各种各样的废气,减少对人们的危害,保护自身以及个人或者公共财产安全,需要自动化的报警器给人们提前预警。 随着 “ 科技时代 ” 的快速发展,传感器技术取得了飞速的发展和提升,应用它的地方越来越多,市场需求越来越紧迫,技术要求也越…

【C++初阶】模版入门看这一篇就够了

文章目录 1. 泛型编程2. 函数模板2. 1 函数模板概念2. 2 函数模板格式2. 3 函数模板的原理2. 4 函数模板的实例化2. 5 模板参数的匹配原则2. 6 补充&#xff1a;使用调试功能观察函数调用 3. 类模板3 .1 类模板的定义格式3. 2 类模板的实例化 1. 泛型编程 在C语言中&#xff0…

【React前端框架】全面解析:从入门到精通的最佳指南

&#x1f9d1;‍&#x1f4bc; 一名茫茫大海中沉浮的小小程序员&#x1f36c; &#x1f449; 你的一键四连 (关注 点赞收藏评论)是我更新的最大动力❤️&#xff01; &#x1f4d1; 目录 &#x1f53d; 前言1️⃣ React的基本概念2️⃣ React的安装与环境配置3️⃣ 组件的创建与…

Springboot项目搭建的问题

1.第一次出现这个问题是在使用postgresql进行搭建项目的时候&#xff0c;但是配置文件中的驱动一致导入不了 最后发现是meaven中依赖导入不进来&#xff08;不知道为什么&#xff09;&#xff0c;于是手动的在meaven中央仓库下载了对应的jar进行配置 然后项目可以正常启动 2.…

DBeaver如何导出insert的sql数据

前言 我们在使用DBeaver连接数据库的时候&#xff0c;有时候需要将数据库某张表的数据全部导出&#xff0c;用于导入到其他的数据库。一般导出的格式有csv&#xff0c;也要sql语句&#xff0c;今天就来介绍下如何导出sql语句。这样在其他新的数据库中&#xff0c;就能直接执行…

大数据新视界 -- 大数据大厂之大数据重塑影视娱乐产业的未来(4 - 3)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

python之多任务爬虫——线程、进程、协程的介绍与使用(16)

文章目录 1、什么是多任务?1.1 进程和线程的概念1.2 多线程与多进程的区别1.3 并发和并行2、python中的全局解释器锁3、多线程执行机制4、python中实现多线程(threading模块)4.1 模块介绍4.2 模块的使用5、python实现多进行程(Multiprocessing模块)5.1 导入模块5.2 模块的…

【JavaEE】【多线程】定时器

目录 一、定时器简介1.1 Timer类1.2 使用案例 二、实现简易定时器2.1 MyTimerTask类2.2 实现schedule方法2.3 构造方法2.4 总代码2.5 测试 一、定时器简介 定时器&#xff1a;就相当于一个闹钟&#xff0c;当我们定的时间到了&#xff0c;那么就执行一些逻辑。 1.1 Timer类 …