Pytest-Bdd-Playwright 系列教程(1):从零开始教你写自动化测试框架「喂饭教程」

Pytest-Bdd-Playwright 系列教程(1):从零开始教你写自动化测试框架「喂饭教程」

  • 前言
  • 一、项目结构
  • 二、安装依赖
  • 三、BDD特性文件
  • 四、页面对象
  • 五、步骤定义
  • 六、测试脚本
  • 七、Pytest配置
  • 八、运行测试

前言

  • 最近收到一些小伙伴在后台的留言,能不能提供相应的自动化测试项目的源码参考下,那么今天就来开始新的一期喂饭教程专栏,教大家如何完整的搭建一个完善的自动化测试框架;
  • 我们将逐步讲解从项目结构设计到测试执行的整个过程,帮助大家深入理解自动化测试框架的各个组成部分及其工作原理。

本文教程内容如下:
在这里插入图片描述

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

  • 理解BDD在自动化测试中的应用;
  • 掌握Page Object设计模式;
  • 学会使用PytestPlaywright进行Web自动化测试;
  • 了解如何组织和管理自动化测试项目
  • 掌握测试报告生成日志管理技巧。

一、项目结构

│
├── 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格式的测试报告(自动生成)
│
├── conftest.py              # Pytest fixtures和全局配置
├── pytest.ini               # Pytest配置文件
├── requirements.txt         # 项目依赖
└── README.md                # 项目说明文档

二、安装依赖

  1. 安装 Python
  • 项目最低支持 Python 版本: 3.7
  • 推荐 Python 版本: 3.8+(我自己安装的是3.11.9
  1. 创建requirements.txt文件,包含以下依赖:
pytest==7.3.1
pytest-bdd==7.3.0
playwright==1.48.0
pytest-html==4.1.1
  1. 使用以下命令安装依赖:
pip install -r requirements.txt
  1. 下载Playwright浏览器驱动
playwright install

三、BDD特性文件

features/search.feature中编写BDD场景:

Feature: 百度搜索作为用户我想要能够在百度上搜索信息以便找到相关的信息Background:Given 我在百度搜索页面Scenario Outline: 成功搜索When 我输入搜索词 "<search_term>"And 点击搜索按钮Then 我应该看到搜索结果Examples:| search_term || python |Scenario: 失败搜索When 我输入空的搜索词And 点击搜索按钮Then 我应该看到搜索结果

BDD特性文件(Feature File)的写法说明如下:

BDD特性文件(Feature File):BDD特性文件使用Gherkin语言编写,用于描述系统的行为。
主要包含以下几个部分:

  1. Feature(特性):每个.feature文件以Feature:关键字开头,后面跟特性名称,可以在Feature下添加描述;

  2. Background(背景):用于定义在每个场景之前都需要执行的步骤;

  3. Scenario(场景):用于描述具体的测试场景;

  4. Scenario Outline(场景大纲):用于定义参数化的场景

  5. 步骤关键字

    Given: 描述前置条件
    When: 描述用户的操作
    Then: 描述预期结果
    And: 用于连接同类型的步骤
    But: 用于表示例外情况

使用说明如下

文件命名: 特性文件以.feature为后缀,如search.feature
文件位置: 放在项目的features/目录下
语言: 可以使用自然语言编写,便于非技术人员理解
复用: 相同的步骤可以在不同的场景中重复使用
标签: 可以使用@标签来标记场景,如@smoke、@regression等
注释: 使用#添加注释

四、页面对象

页面对象模式是一种常用的设计模式,用于将页面元素和操作封装到单独的类中,以提高代码的可维护性和复用性。

pages/search_page.py中创建SearchPage类:

import logging
from playwright.sync_api import Page, expectlogging.basicConfig(level=logging.INFO)
log = logging.getLogger(__name__)class SearchPage:def __init__(self, page: Page):self.page = pageself.search_input = page.locator("#kw")self.search_button = page.locator("#su")self.search_results = page.locator("a.sc-link")def navigate(self, url: str):self.page.goto(url)log.info(f"跳转至 {url}")def search(self, input_value: str):self.search_input.fill(input_value)def click_search_button(self):self.search_button.click()def assert_search_results_visible(self):expect(self.search_results).to_be_visible()

五、步骤定义

使用这个步骤定义文件,pytest-bdd会自动将feature文件中的步骤与这里定义的函数关联起来。在运行测试时,会按照场景中的步骤顺序依次调用对应的函数。

steps/search_steps.py中实现步骤定义:

from pytest_bdd import given, when, then, parsers
from pytest_bdd.parsers import stringfrom pages.search_page import SearchPage
from pytest import fixture@fixture(scope="function")
def search_page(page):search_page = SearchPage(page)yield search_page@given('我在百度搜索页面')
def navigate_to_search_page(search_page):search_page.navigate("")@when(parsers.parse('我输入搜索词 "{search_term}"'))
def enter_search_term(search_page, search_term: string):search_page.search(search_term)@when('我输入空的搜索词')
def enter_empty_search_term(search_page):search_page.search("")@when('点击搜索按钮')
def click_search_button(search_page):search_page.click_search_button()@then('我应该看到搜索结果')
def see_search_results(search_page):search_page.assert_search_results_visible()

六、测试脚本

tests/test_search.py中编写测试脚本:

import pytest
from steps.search_steps import *
from pytest_bdd import scenario@pytest.mark.smoke
@scenario('search.feature', '成功搜索')
def test_successful_search():"""这里可以添加额外的测试逻辑,比如:- 添加详细的日志记录- 截图保存- 额外的断言检查- 测试数据清理等"""pass@pytest.mark.low
@scenario('search.feature', '失败搜索')
def test_failed_search():pass

通过这种方式,我们将BDD场景与实际的测试执行关联起来,让测试更加结构化和易于理解。同时,通过使用标记,我们可以灵活地组织和运行测试套件。

七、Pytest配置

conftest.py中配置Pytest和Playwright:

import pytest
import logging
from playwright.sync_api import sync_playwrightlog = logging.getLogger(__name__)@pytest.fixture(scope="function")
def playwright():with sync_playwright() as playwright:yield playwright@pytest.fixture(scope="function")
def browser_type(playwright):return playwright.chromium@pytest.fixture(scope="function")
def browser(browser_type):browser = browser_type.launch(headless=False)log.info("启动浏览器")yield browserbrowser.close()@pytest.fixture(scope="function")
def page(browser):page = browser.new_page()yield pagepage.close()log.info("页面关闭")

pytest.ini中配置Pytest:

[pytest]
# 指定BDD特性文件的基础目录
bdd_features_base_dir = features/# 添加命令行选项
addopts =# 生成HTML测试报告--html=reports/test_report.html# 定义自定义标记
markers =smoke: 'mark test cases for smoke'low: 'mark test cases for low'# 配置控制台日志
log_cli = true
log_cli_level = INFO
log_cli_format = %(asctime)s %(levelname)s %(message)s
log_cli_date_format = %Y-%m-%d %H:%M:%S# 配置文件日志
log_file = reports/logs/test_log.log
log_file_level = INFO
log_file_date_format = %Y-%m-%d %H:%M:%S
log_file_format = %(asctime)s %(levelname)s %(message)s

八、运行测试

# 运行所有测试
pytest 
# 运行特定标记的测试
pytest -m smoke

运行结果如下:

  • 生成HTML报告: 报告将自动生成在reports目录下;
  • 查看详细日志: 控制台会显示INFO级别的日志,同时日志也会写入到指定的文件中。
    在这里插入图片描述

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

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

相关文章

生成式AI时代的内容安全与系统构建:合合信息文档图像篡改检测创新方案

目录 一、生成式AI时代的内容安全与图像识别1.图像内容安全的重要性2.伪造文档与证件检测的应用场景3.人脸伪造检测技术 二、系统构建加速与文档解析1.TextIn文档解析平台2.TextIn文档解析输出的示例 三、合合信息的行业影响力总结 一、生成式AI时代的内容安全与图像识别 随着…

python-----函数详解(一)

一、概念及作用&#xff1a; 概念&#xff1a;由若干条语句组成语句块&#xff0c;其中包括函数名称、参数列表&#xff0c;它是组织代码的最小单元&#xff0c;完成一定的功能 作用&#xff1a;把一个代码封装成一个函数&#xff0c;一般按功能组织一段代码 目的就是为了重…

autMan奥特曼机器人-安装或更新golang依赖

autMan2.3.4及以上需要更新中间件或安装golang依赖&#xff0c;参照下列步骤&#xff1a; 一、直装版本 ssh下进入autMan文件夹下plugin/scripts下面输入以下指令&#xff1a; go get -u github.com/hdbjlizhe/middleware二、docker版本 从后台进入web终端&#xff0c;依次输入…

Ubuntu 上安装 Redmine 5.1 指南

文章目录 官网安装文档&#xff1a;命令步骤相关介绍GemRubyRailsBundler 安装 Redmine更新系统包列表和软件包&#xff1a;安装必要的依赖&#xff1a;安装 Ruby&#xff1a;安装 bundler下载 Redmine 源代码&#xff1a;安装 MySQL配置 Redmine 的数据库配置文件&#xff1a;…

Node.js:深入探秘 CommonJS 模块化的奥秘

在Node.js出现之前&#xff0c;服务端JavaScript基本上处于一片荒芜的境况&#xff0c;而当时也没有出现ES6的模块化规范。因此&#xff0c;Node.js采用了当时比较先进的一种模块化规范来实现服务端JavaScript的模块化机制&#xff0c;它就是CommonJS&#xff0c;有时也简称为C…

2024ideaUI切换和svn与git的切换,svn的安装和配置,idea集成svn ,2024-10-18日

2024-10-18日 2024的UI实在很不舒服&#xff0c;隐藏了很多按键&#xff1b; 第一步&#xff1a; 视图 -》 外观 -》 工具栏选出来&#xff1b; 结果出来&#xff1a; 运行的按键和设置的按钮 第二步 点击设置的按钮&#xff0c;选择最后一个&#xff0c;重启就行 结果 舒服&…

论文阅读(二十四):SA-Net: Shuffle Attention for Deep Convolutional Neural Networks

文章目录 Abstract1.Introduction2.Shuffle Attention3.Code 论文&#xff1a;SA-Net&#xff1a;Shuffle Attention for Deep Convolutional Neural Networks(SA-Net&#xff1a;置换注意力机制)   论文链接&#xff1a;SA-Net&#xff1a;Shuffle Attention for Deep Convo…

九州未来亓绚亮相丽台Solution Day 2024,共建AI赋能教育新时代

在数字化浪潮席卷全球的当下&#xff0c;生成式人工智能正迅速渗透至数字世界的每一个角落&#xff0c;而AI技术的物理化应用也正成为新的趋势。10月22日&#xff0c;丽台解决方案日Solution Day 2024&#xff1a;物理AI推动行业数字变革在上海绿地外滩中心顺利举行。 大会聚焦…

报表工具怎么选?山海鲸VS帆软,哪个更适合你?

概述 在国产报表软件市场中&#xff0c;山海鲸报表和帆软这两款工具都占有一席之地&#xff0c;许多企业在选择报表工具时常常在它们之间徘徊。然而&#xff0c;随着企业对数据分析需求的不断增长和复杂化&#xff0c;如何选取一款高效、易用且性价比高的报表工具&#xff0c;…

“摄像机”跟随及攻击抖动实现

学习Unity的摄像机功能&#xff0c;可以帮助我们实现摄像机对人物的跟随移动&#xff0c;还可以使用这个工具自带的插件&#xff0c;摄像机震动&#xff0c;颤动&#xff0c;增强打击感&#xff1b; 首先来安装一下这个插件&#xff0c;window菜单--packageManage--左上角Unit…

vcpkg 从清单文件安装依赖项

vcpkg 有两种运行模式&#xff1a;经典模式和清单模式。清单文件有自己的 vcpkg_installed 目录&#xff0c;可在其中安装依赖项&#xff0c;与所有包都安装在通用 %VCPKG_ROOT%/installed 目录中的经典模式不同。 因此&#xff0c;每个项目都可以有自己的清单和自己的一组依赖…

R语言机器学习算法实战系列(十)自适应提升分类算法 (Adaptive Boosting)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍原理步骤教程下载数据加载R包导入数据数据预处理数据描述数据切割调节参数构建模型预测测试数据评估模型模型准确性混淆矩阵模型评估指标ROC CurvePRC Curve特征的重要性保存模型总…

生发产品哪个效果最好?油秃头秋冬季养发搭子

如果你是大额头 或者 M型发际线&#xff0c;无论是天生的 亦或者是后天造成的&#xff0c;养发防脱一定要重视起来&#xff0c;因为防脱育发是需要循序渐进坚持的&#xff0c;今天就给大家分享一下几个特别有效的育发液&#xff0c;选对产品养发那真是稳了~ 1、露卡菲娅防脱育发…

Unity之XR Interaction Toolkit 射线拖拽3DUI

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、想实现的功能二、实现原理1.UI挂在XRGrabInteractable、刚体、BoxCollder2.修改刚体属性3.加BoxCollder 总结 前言 VR项目里正常情况有放置两种3DUI的方式…

Ovis: 多模态大语言模型的结构化嵌入对齐

论文题目&#xff1a;Ovis: Structural Embedding Alignment for Multimodal Large Language Model 论文地址&#xff1a;https://arxiv.org/pdf/2405.20797 github地址&#xff1a;https://github.com/AIDC-AI/Ovis/?tabreadme-ov-file 今天&#xff0c;我将分享一项重要的研…

关于使用 C# 处理水位数据多种格式的统一转换

关于使用 C# 处理水位数据多种格式的统一转换 1、前言2、水位数据的多种格式3、水位数据多种格式的统一转换程序展示4、水位数据多种格式的统一转换 C# 代码4.1、声明引用命名空间4.2、多种格式的统一转换 C# 代码4.3、多种格式的统一转换 C# 代码&#xff0c;文件输出保存 1、…

微知-Lecroy力科的PCIe协议分析仪型号命名规则(PCIe代,金手指lanes数量)

文章目录 要点主要型号命名规则各代主要产品图片Summit M616 协议分析仪/训练器Summit T516 分析仪Summit T416 分析仪Summit T3-16分析仪Summit T28 分析仪 综述 要点 LeCroy(力科)成立于1964年&#xff0c;是一家专业生产示波器厂家。在美国纽约。一直把重点放在研制改善生产…

Hallo2 长视频和高分辨率的音频驱动的肖像图像动画 (数字人技术)

HALLO2: LONG-DURATION AND HIGH-RESOLUTION AUDIO-DRIVEN PORTRAIT IMAGE ANIMATION 论文&#xff1a;https://arxiv.org/abs/2410.07718 代码&#xff1a;https://github.com/fudan-generative-vision/hallo2 模型&#xff1a;https://huggingface.co/fudan-generative-ai/h…

TikTok营销实用技巧与数据分析工具:视频洞察

TikTok凭借其独特的机制和庞大的流量&#xff0c;成为了众多品牌和卖家对产品进行宣传推广的必要平台之一。要在TikTok上优化营销效果、提升推广效率&#xff0c;可以使用平台提供的重要工具——视频洞察&#xff08;Video Insights&#xff09;。 一、视频洞察功能与技巧 视频…

线性回归(一)

线性回归 1.基本术语 ①特征&#xff1a;预测所依据的自变量称为特征或协变量 ②标签&#xff1a;试图预测的目标称为标签或目标 2.举个栗子 线性假设是指目标&#xff08;房屋价格&#xff09;可以表示为特征&#xff08;面积和房龄&#xff09;的加权和&#xff0c;如下面…