Gerkin+Pytest(python)建立自动化(BDD)

news/2025/10/10 9:32:36/文章来源:https://www.cnblogs.com/lxjshuju/p/19132393

将 ​​BDD(行为驱动开发)​​ 思想与 ​​pytest + Python​​ 框架结合来实现自动化测试,是一个非常强大和现代的方法。可以让我们在享有 pytest 所有强大功能(如 fixture、参数化、丰富插件)的同时,编写出业务方也能看懂的、活文档式的测试用例。

相较于unitttes+Gerkin 只需要一个插件便可以实现

目录

一、核心工具选择

二、项目目录结构

三、实现步骤

步骤 1: 编写 Gherkin 特性文件 (.feature)

步骤 2: 实现步骤定义 (Step Definitions)

步骤 3: (可选但推荐) 使用 Page Object 模式

步骤 4: 配置 Fixture (如初始化浏览器)

四、运行测试与生成报告

运行测试

生成丰富的报告

五、BDD + pytest 的优势


一、核心工具选择

要实现这个组合,核心是使用 ​​pytest-bdd​​ 插件。它是 pytest 的一个插件,允许你使用 Gherkin 语法编写特性文件(.feature),并用 pytest 来执行它们。

​安装所需库:​

pip install pytest pytest-bdd
# 如果需要Web自动化,再安装
pip install selenium

二、项目目录结构

一个清晰的结构是成功的一半。推荐的组织方式如下:

project_root/
│
├── features/               # 存放所有的Gherkin特性文件
│   ├── login.feature
│   └── shopping_cart.feature
│
├── tests/                  # 存放所有的测试代码
│   ├── __init__.py
│   ├── conftest.py        # pytest的全局 fixture 配置
│   └── test_features/     # 按功能模块组织步骤定义和测试
│       ├── __init__.py
│       ├── test_login.py  # 登录功能的步骤定义
│       └── test_cart.py   # 购物车功能的步骤定义
│
└── pages/                 # (可选)Page Object模型目录
├── __init__.py
├── base_page.py
├── login_page.py
└── cart_page.py

三、实现步骤

步骤 1: 编写 Gherkin 特性文件 (.feature)

features/login.feature中,用业务语言描述行为。

# features/login.feature
Feature: User Login
As a user of the website
I want to log into my account
So that I can access my personal dashboard
Scenario: Successful login with valid credentials
Given the user is on the login page
When the user enters a valid username and password
And clicks the login button
Then the user is redirected to the dashboard
And a welcome message containing "Welcome" is displayed
Scenario Outline: Failed login attempts
Given the user is on the login page
When the user enters username "" and password ""
And clicks the login button
Then an error message "" should be displayed
Examples:
| username      | password | error_message          |
| invalid_user  | Pass123  | Invalid username       |
| testuser      | wrong    | Invalid password       |
| ""            | Pass123  | Username is required   |
步骤 2: 实现步骤定义 (Step Definitions)

tests/test_features/test_login.py中,编写 Python 代码来实现每个 Gherkin 步骤。

​关键点:​

  • 使用 @given, @when, @then装饰器将函数映射到 Gherkin 步骤。

  • pytest-bdd支持从步骤中​​提取参数​​(使用正则表达式或解析器)。

  • 使用 pytestassert进行断言。

# tests/test_features/test_login.py
import pytest
from pytest_bdd import scenarios, given, when, then, parsers
from pages.login_page import LoginPage # 导入Page Object
# 让pytest-bdd发现并加载login.feature文件
scenarios("../../features/login.feature")
# 共享 fixture:在 conftest.py 中定义 browser fixture
@pytest.fixture
def login_page(browser): # 'browser' 是另一个fixture,例如初始化Selenium WebDriver
return LoginPage(browser)
# 实现 "Given the user is on the login page" 步骤
@given("the user is on the login page")
def go_to_login_page(login_page):
login_page.load()
# 实现 "When the user enters a valid username and password"
@when("the user enters a valid username and password")
def enter_valid_credentials(login_page):
login_page.enter_username("standard_user")
login_page.enter_password("secret_sauce")
# 实现带参数的步骤(用于Scenario Outline)
@when(parsers.cfparse('the user enters username "{username}" and password "{password}"'))
def enter_credentials(login_page, username, password):
login_page.enter_username(username)
login_page.enter_password(password)
# 实现点击登录按钮的步骤(可以被多个场景复用)
@when("clicks the login button")
def click_login(login_page):
login_page.click_login()
# 实现结果验证步骤,并提取欢迎消息中的部分文本
@then(parsers.cfparse('a welcome message containing "{message_text}" is displayed'))
def verify_welcome_message(login_page, message_text):
actual_message = login_page.get_welcome_message()
assert message_text in actual_message, f"Expected '{message_text}' in message, but got '{actual_message}'"
# 实现结果验证步骤,验证错误消息
@then(parsers.cfparse('an error message "{expected_message}" should be displayed'))
def verify_error_message(login_page, expected_message):
actual_message = login_page.get_error_message()
assert actual_message == expected_message, f"Expected '{expected_message}', but got '{actual_message}'"
步骤 3: (可选但推荐) 使用 Page Object 模式

pages/login_page.py中封装页面逻辑,使步骤定义文件更清晰、更易维护。

# pages/login_page.py
class LoginPage:
def __init__(self, driver):
self.driver = driver
self.url = "https://www.saucedemo.com/"
def load(self):
self.driver.get(self.url)
def enter_username(self, username):
self.driver.find_element("id", "user-name").send_keys(username)
def enter_password(self, password):
self.driver.find_element("id", "password").send_keys(password)
def click_login(self):
self.driver.find_element("id", "login-button").click()
def get_welcome_message(self):
# 假设登录成功后跳转到dashboard,这里有欢迎信息
return self.driver.find_element("css selector", ".title").text
def get_error_message(self):
# 定位错误信息元素
return self.driver.find_element("css selector", "[data-test='error']").text
步骤 4: 配置 Fixture (如初始化浏览器)

tests/conftest.py中定义全局的 fixture。

# tests/conftest.py
import pytest
from selenium import webdriver
@pytest.fixture(scope="session")
def browser():
# 初始化浏览器,这里以Chrome为例
driver = webdriver.Chrome()
driver.implicitly_wait(10)
yield driver
# 测试结束后退出浏览器
driver.quit()
# 可以在这里定义其他全局fixture

四、运行测试与生成报告

运行测试

你可以像运行普通 pytest 测试一样运行 BDD 测试:

# 运行所有测试
pytest
# 运行特定feature的测试
pytest tests/test_features/test_login.py -v
# 使用pytest-bdd的特定选项,例如显示场景名称
pytest --cucumberjson=results.json  # 生成Cucumber风格的JSON报告
生成丰富的报告

​1. 生成 HTML 报告(推荐):​

pip install pytest-html
pytest --html=report.html

​2. 生成 Allure 报告(非常强大美观):​

pip install allure-pytest
pytest --alluredir=allure_results
allure serve allure_results  # 在本地查看报告

五、BDD + pytest 的优势

  1. ​业务可读性​​:.feature文件可以作为活文档,方便产品、测试、开发三方沟通。

  2. ​强大的 pytest 生态​​:你可以使用所有 pytest 的特性:fixture、参数化、标记(mark)、丰富的插件等。

  3. ​灵活的目录结构​​:不像 behave那样强制要求固定的目录结构。

  4. ​优秀的报告​​:可以生成多种格式的详细测试报告。

  5. ​易于集成CI/CD​​:可以轻松地与 Jenkins、GitLab CI 等工具集成。

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

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

相关文章

arm环境vg损坏mysql数据库恢复---惜分飞

arm环境vg损坏mysql数据库恢复---惜分飞联系:手机/微信(+86 17813235971) QQ(107644445) 标题:arm环境vg损坏mysql数据库恢复 作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任…

2025 年国内连接器厂商最新推荐排行榜:聚焦 Type-C / 板对板等核心品类,精选优质企业助力下游选型针座/板对板/卡座/FPC/排针连接器厂家推荐

当前电子产业加速升级,连接器作为设备信号与电力传输的核心部件,其品质直接决定终端产品稳定性与用户体验。但市场上品牌数量繁杂,部分厂商为压缩成本简化品控,导致产品频繁出现接触不良、抗干扰能力差等问题,不仅…

Linux设置分辨率(临时)

Linux设置分辨率(临时)xrandr 查看命令输出,当前正在使用的分辨率旁会有一个星号(*)标记,当前连接且启用的显示器旁会标记为 "connected" 并显示其分辨率。例如,在 HDMI-0 connected primary 1920x1080…

git克隆代码保留提交记录,从源仓库迁移到新仓库地址

git克隆代码保留提交记录,从源仓库迁移到新仓库地址在 Git 中迁移代码并保留完整的提交历史记录,可以通过以下几种方法实现,具体选择取决于源仓库和目标仓库的访问权限、是否需要重写历史(如修改提交信息或作者信息…

MySQL从入门到熟练查询

MySQL 作为世界上最流行的开源关系型数据库,是我们每一位码农、数据分析师乃至产品经理都应掌握的核心工具。它以其高性能、高可靠性和易用性而闻名。掌握其基础知识,是通往后端开发、数据科学等领域的必经之路。 我…

MySQL笔记8 - 指南

MySQL笔记8 - 指南2025-10-10 09:12 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fam…

Elasticsearch 备份:方案篇

在 Elasticsearch 集群的日常运维中,制定完善的数据备份与恢复策略是保障业务连续性和数据安全的基石。在本文中,我们将探讨 ES 各类备份方案的实现逻辑,对比各自方案的优劣势,归纳它们适合的场景1. 为什么要备份 …

Atcoder Beginner Contest 422

ABC422A 按照题意输出即可。 /*********************************************************************程序名:作者: xAlec日期: 2025-10-01 15:45说明: sakana ~ *************************************************…

【Android】解决安卓在隐藏强大的系统栏后usb鼠标被隐藏的疑问

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

centos安装libgdiplus-6.1

centos安装libgdiplus-6.1参考:https://chat.deepseek.com/share/fhak78p0eprkm8reeh 源码:# 从Mono官方下载完整源码包 wget https://download.mono-project.com/sources/libgdiplus/libgdiplus-6.1.tar.gz tar -xz…

RapidJSON 自定义内存分配器详解与实战 - 详解

RapidJSON 自定义内存分配器详解与实战 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &q…

完整教程:考研408计算机网络第47题(2024年)

完整教程:考研408计算机网络第47题(2024年)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &q…

进步与现代化

线性方程组 线性无关、系数矩阵行列式、解的情况 简化行阶梯型矩阵:主元全 \(1\),所在行左侧全 \(0\),所在列剩余全 \(0\) 生成子空间:\(\langle A\rangle\),线性表出の所有向量 \(A\) 线性无关 \(\Longleftright…

2025 最新推荐!溴化锂回收公司精选榜单:含制冷机 / 溶液 / 机组回收服务商权威测评及选择指南

随着工业与商业领域溴化锂制冷设备迭代加速,老旧设备处置需求激增,但市场仍存在服务标准混乱、环保措施缺失、技术能力参差不齐等痛点。部分机构拆解流程不规范,既造成铜、铝等资源浪费,又易因溴化锂溶液泄漏引发污…

使用OpenCvSharp , Emgu.CV 手搓 视觉识别算法 以及 成果展示

举个🌰 一个培养皿里有若干条鱼苗,需要将它全部区分识别出来, 像如下图所示的小蝌蚪就是(培养皿里三个黑点是热带鱼苗,做实验用的,一毫米长) 用的是海康威视的黑白工业相机拍摄。 先讲讲思路,图片是一组庞大的…

PKC7300高频电流探头在新能源汽车车载充电机稳态电流测试中的应用方案

一、应用背景 新能源汽车车载充电机(OBC)是将外部电网电能转换为车载动力电池电能的关键部件。在工作过程中,它需要处理0-300A的电流,而其内部的高频开关电路容易产生干扰信号。因此,对电流测量的量程、高频信号捕…

质量检验知识专题讲座之六:抽样检验步骤

抽样检验步骤抽样检验是从一批产品中随机抽取部分样本进行检验,再根据样本结果判断整批产品是否合格的过程,主要步骤如下: 1)、确定抽样检验的对象和目的 明确需要检验的产品批次、检验的质量特性(如尺寸、性能、…

羡慕线段树

顺颂 YFST 板子 & 使用例 题。首先树剖,然后变成在 \(\text{dfn}\) 区间上插一个关于 \(\text{dis}\) 的一次函数。这个很神奇,一般的李超树是,在 \(x\) 轴区间上插入关于 \(x\) 的一次函数。然而这里,\(\text…

质量检验知识专题讲座之七:来料检验

来料检验(IQC)1、来料检验的定义: 来料检验是指对采购进来的原材料、部件或产品做品质确认和查核,即在供应商送原材料或部件时通过抽样的方式对品质进行检验,并最后做出判断该批产品是允收还是拒收。 来料检验是企业…