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;依次输入…

速盾:高防cdn的好处体现在什么地方?

随着互联网的迅猛发展&#xff0c;网络安全问题也日益受到关注。为了保护网站免受恶意攻击和DDoS攻击的影响&#xff0c;许多网站选择使用高防CDN&#xff08;Content Delivery Network&#xff09;服务。高防CDN的好处体现在以下几个方面。 首先&#xff0c;高防CDN可以有效防…

Ubuntu 上安装 Redmine 5.1 指南

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

Hudi 核心知识点详解

‌数据写入‌&#xff1a; ‌近实时写入‌&#xff1a;Hudi支持近实时写入&#xff0c;可以减少碎片化工具的使用&#xff0c;并通过CDC&#xff08;Change Data Capture&#xff09;增量导入RDBMS数据。此外&#xff0c;Hudi还限制小文件的大小和数量&#xff0c;优化存储效率…

Java开发者的成长轨迹:从入门到权威的二十年征程

在Java开发的漫长征途中&#xff0c;流传着一句耳熟能详的话&#xff1a;“三年入门&#xff0c;五年入行&#xff0c;十年精英&#xff0c;十五年专家&#xff0c;二十年权威”。这句话不仅是对Java开发者职业生涯的高度概括&#xff0c;更是对技术成长路径的一种深刻洞察。它…

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;重启就行 结果 舒服&…

前端-基础CSS总结常用

1.书写位置:title 标签下方添加 style 双标签,style 标签里面书写 CSS 代码。 <title>CSS 初体验</title> <style>/* 选择器 { } */p {/* CSS 属性 */color: red;} </style><p>体验 CSS</p> <link rel="stylesheet" href=…

论文阅读(二十四):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…

【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (二):项目文件夹架构及路由的设置

本项目旨在学习如何快速使用 nodejs 开发后端api&#xff0c;并为以后开展其他项目的开启提供简易的后端模版。&#xff08;非后端工程师&#xff09; 由于文档是代码写完之后&#xff0c;为了记录项目中需要注意的技术点&#xff0c;因此文档的叙述方式并非开发顺序&#xff0…

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

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

SpringBoot项目整合Mybatis-MySql数据库编程

1.Mybatis-MySql 话不多说-直接上代码&#xff01; 1. 数据库编程的依赖 <!-- Mybatis整合Spring Boot的依赖项 --> <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><…

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

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

HTML、CSS 和 JavaScript 的介绍

HTML、CSS 和 JavaScript 是网页设计的核心技术组合,以下是关于它们在网页设计中的介绍: 一、HTML(超文本标记语言) 结构基础 HTML 负责构建网页的结构和内容。它使用各种标签来定义网页的不同部分,如 <html>、<head>、<body> 等。例如,<h1> 到…

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

学习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、露卡菲娅防脱育发…