当前位置: 首页 > news >正文

python BDD 的相关概念

在Python 语言中进行BDD的规格和测试文件的编写的时候,常常会遇到下面的概念:

  • Fixture : 测试设施。设定测试环境的预设状态或值的机制。
  • Background: 背景。所有场景的公共部分。
  • Scenario: 场景。
  • Given : 前置条件
  • When: 用户操作
  • Then:预期结果

规格文件

pytest-bdd 和Behave 是Python中比较流行的BDD 框架,两种使用的规格文件基本类型,规格文件都是以 .feature结尾,一个需求文件中只能有一个Feature字段,可以包含多个Scenario(用户场景)。
Given->When->Then类似于准备->执行->验证/清理的流程。

  • Given:一般可以用来做预置条件/数据准备,下面第一个And也属于Given。
  • When下面的And都属于When, 一般是操作步骤。
  • Then: 一般用于验证结果(断言),也可以进行清理数据。

Fixture 测试设施

在软件测试中,“Fixture” 是一种设定测试环境的预设状态或值的机制。通常为了某个测试或一组测试,需要一些预设的对象、文件或数据库等等。如何设置和管理这些预设状态就是 “Fixture” 的作用,它通常用来初始化测试环境,或者在每次测试完成后进行清理。

考虑到这个功能,有些中文翻译可能会把 “Fixture” 翻译为 “固件” 或 **“前置条件” **或 “测试设施”。然而,这通常还需要结合上下文具体理解。在很多开发文档或技术讨论中,也常常直接使用英文 “Fixture”。

在 BDD 和测试中,Fixture 是设置给定环境或编写 “Given” 步骤所需的一项工作。可以把它看作是一个重复使用的预设条件,使你能够用一致的环境运行测试。这些预设条件可能涉及各种各样的事情,比如创建数据库、初始化变量、创建类的实例,或者运行特定的命令等。

在 pytest,这些 fixtures 是用 @pytest.fixture 装饰器声明的 Python 函数。例如:

@pytest.fixture
def client():from myapp import MyClientreturn MyClient()

这个 client fixture 可以在测试函数、类或模块中通过参数 re-use。

def test_get_data(client):data = client.get_data()assert data is not None

在 pytest-bdd 中,fixture 的使用方式非常相似,但支持为步骤 (given, when, then) 设置 fixture,使在 BDD 测试中更容易设置和共享上下文。

举个例子:

from pytest_bdd import given, scenario, then, when
import pytest@scenario('calculations.feature', 'Adding numbers')
def test_add():pass@pytest.fixture
def calc():return Calculator()@given('I have a calculator', target_fixture='calculator')
def i_have_a_calculator(calc):return calc@when('I add <number1> and <number2>')
def add_numbers(calculator, number1, number2):calculator.add(int(number1), int(number2))@then('I should get <result>')
def get_result(calculator, result):assert calculator.result == int(result)

在这个例子中,

  • @pytest.fixture 注解的 calc()方法创建了一个 Calculator 类的实例
  • @given('I have a calculator', target_fixture='calculator') 的作用是 返回一个名为“calculator”的fixture(即测试用例执行前需要准备的对象或数据)。这个fixture可以在之后的测试步骤中被引用和使用。
    使用这种方式的好处是在 BDD 的步骤中更容易地重用和共享设置和数据。同时,它也可以帮助你分离你的测试代码,使得它们更加模块化和易维护。

Background 是什么?

在 BDD 中,Background关键字用于定义在执行每个场景时都需要执行的步骤。通常,这些步骤用于设置初始条件或预设环境。换句话说,它是需要在每个场景开始之前运行的给定(Given)步骤。

以下是一个例子,演示如何在 Background 中设置初始的环境状态:

Feature: 乘坐地铁Background:Given 我有一张有效的地铁卡Scenario: 乘坐地铁When 我刷地铁卡Then 旋转门应该打开Scenario: 余额不足Given 我的卡余额是0When 我刷地铁卡Then 旋转门不会打开 

在这个示例中,Background包含了一个 “Given 我有一张有效的地铁卡” 的步骤。这意味着在执行每个场景 “乘坐地铁” 和 “余额不足” 之前,测试始终会先执行这个步骤。

Background的目的是帮助减少测试场景之间的重复,并传达对所有场景都有效的前提条件。但需要注意的是,过度使用Background可能会使测试复杂化和难以理解,特别是在Background中有很多步骤或它们的效果不明显时。

Fixture 和 Background 的区别

FixtureBackground都是在开启测试前设置预期环境或状态的工具,但它们在用途和功能上有所区别,用在不同的场景。

  • Fixture:在 pytest 和许多其他测试框架中,fixture 是设置测试环境的一种工具,它为测试提供了需要的初识状态或值。可以把 pytest fixture 理解为设置给定环境或预设需要的工作,它可以创建对象、连接数据库、开启服务器或其他任何为了测试需要预先设定的操作。Fixture 可以被多个测试用例重复使用,从而避免代码的重复。

  • Background:在 Gherkin 语言(被许多 BDD 框架,如 Cucumber 和 behave 使用)中,Background 是一个特殊的场景,它在包含它的Feature中的每个ScenarioScenario Outline开始前运行。我们可以把 Background 理解成作为每个场景前提的共享步骤。背景的目标是为了消除场景之间的冗余

它们的区别主要在于:

  • Background 是 BDD 中 Gherkin 语法的一部分,用于描述在每个测试场景开始时的共享行为,
  • 而 Fixture 是 pytest 测试中的一个概念,它更倾向于代码层面,负责进行一些设置和清理工作。

Background 和Fixture 也可以一起使用。例如,在 Given 步骤中使用fixture去实现在Background中描述的行为。

Feature: 乘坐地铁Background:Given 我有一张有效的地铁卡

对应的Given实现可能如下:

@given("我有一张有效的地铁卡", target_fixture="card")
def have_subway_card():return SubwayCard(is_valid=True)

在这个例子中,have_subway_card就是一个 fixture,它在Background描述的Given步骤中被使用。

Scenario 用户场景

在行为驱动开发(Behavior-Driven Development,BDD)中,Scenario是描述一个特定功能如何在特定情境下工作的方法,或者说是描述功能如何被使用的故事。每个Scenario是一个完整的可测试的用户故事。

Scenario通常使用 “Given-When-Then” 的格式描述,这种格式可以清晰地阐述环境条件、行为和期望结果。每个Scenario应该是自足并可以单独运行。

以下是一个例子:


Scenario: User login with correct username and passwordGiven a user has been registered with username "user1" and password "pass1"When the user login with username "user1" and password "pass1"Then the login should be successful

在这个例子中:

  • Given步骤设定了开始条件,即已经有一个注册用户 “user1”,其密码是 “pass1”。

  • When步骤描述了用户尝试使用正确的用户名和密码登录的行为。

  • Then步骤描述了期望的结果,即登录应该成功。

  • 每个Scenario开始都是独立的,不依赖于其他Scenario,每个Scenario均应清理其测试环境,以确保不会影响其他测试。这就是所谓的测试原子性。

  • Scenario是 BDD 的核心部分,它帮助我们将抽象的需求转化为具体、可执行和可验证的测试。



相关文章:

python BDD 的相关概念

在Python 语言中进行BDD的规格和测试文件的编写的时候&#xff0c;常常会遇到下面的概念&#xff1a; Fixture : 测试设施。设定测试环境的预设状态或值的机制。Background&#xff1a; 背景。所有场景的公共部分。Scenario&#xff1a; 场景。Given &#xff1a; 前置条件Whe…...

【Exception】Error: Dynamic require of “path“ is not supported

Talk is cheap, show me the code. 环境 | Environment kversionOSwindows 11Node.jsv18.14.2npm9.5.0vite5.0.0vue3.3.8 报错日志 | Error log >npm run dev> app10.0.0 dev > viteERROR failed to load config from C:\code\frontend\app1\vite.config.js …...

【蓝桥杯选拔赛真题25】C++两个数比大小 第十三届蓝桥杯青少年创意编程大赛C++编程选拔赛真题解析

目录 C/C++两个数比大小 一、题目要求 1、编程实现 2、输入输出 二、算法分析...

C++学习——C++运算符重载(含义、格式、示例、遵循的规则)

以下内容源于C语言中文网的学习与整理&#xff0c;非原创&#xff0c;如有侵权请告知删除。 一、运算符重载的含义 所谓重载&#xff0c;就是赋予新的含义。函数重载&#xff08;Function Overloading&#xff09;可以让一个函数名有多种功能&#xff0c;在不同情况下进行不同…...

【unity实战】unity3D中的PRG库存系统和换装系统(附项目源码)

文章目录 先来看看最终效果前言素材简单绘制库存UI前往mixamo获取人物模型动画获取一些自己喜欢的装备物品模型库存系统换装系统装备偏移问题添加消耗品最终效果源码完结 先来看看最终效果 前言 之前2d的换装和库存系统我们都做过不少了&#xff0c;这次就来学习一个3d版本的&…...

编程语言发展史:C语言的诞生及其影响

预计更新 第一部分&#xff1a;早期编程语言 1.1布尔代数和机器语言 1.2汇编语言的出现和发展 1.3高级语言的兴起 第二部分&#xff1a;主流编程语言 1.1 C语言的诞生及其影响 1.2 C语言的发展和应用 1.3 Java语言的出现和发展 1.4 Python语言的兴起和特点 1.5 JavaScript语言…...

(二)pytest自动化测试框架之添加测试用例步骤(@allure.step())

前言 在编写自动化测试用例的时候经常会遇到需要编写流程性测试用例的场景&#xff0c;一般流程性的测试用例的测试步骤比较多&#xff0c;我们在测试用例中添加详细的步骤会提高测试用例的可阅读性。 allure提供的装饰器allure.step()是allure测试报告框架非常有用的功能&am…...

【用unity实现100个游戏之16】Unity程序化生成随机2D地牢游戏2(附项目源码)

文章目录 先看看最终效果前言生成走廊生成房间修复死胡同增加走廊宽度获取走廊位置信息集合方法一方法二 源码完结 先看看最终效果 前言 上期已经实现了房间的生成&#xff0c;本期紧跟着上期内容&#xff0c;生成走廊并结合上期内容生成连通的房间。 生成走廊 修改Procedur…...

潮玩宇宙大逃杀游戏开发源码说明

潮玩宇宙大逃杀游戏是一款简单而刺激的游戏。玩家在倒计时结束前从8个房间中选择一个房间并投入宝石。倒计时结束后&#xff0c;系统会自动生成一个敌人&#xff0c;然后随机挑选一个房间并清除这个房间内的人。其余7个房间内的玩家就可以按照投入比例获得被清除掉玩家的宝石。…...

UE5 操作WebSocket

插件&#xff1a;https://www.unrealengine.com/marketplace/zh-CN/product/websocket-client 参考&#xff1a;http://dascad.net/html/websocket/bp_index.html 1. 安装Plugings 2.测试websocket服务器 http://www.websocket-test.com/ 3.连接服务器 如果在Level BP里使用&a…...

Linux文件

目录 一、基本概念 二、研究进程和被打开文件的关系 &#xff08;一&#xff09;w方式 &#xff08;二&#xff09;a方式 三、认识系统接口&#xff0c;操作文件 &#xff08;一&#xff09;认识文件描述符 &#xff08;二&#xff09;举例 &#xff08;三&#xff09;…...

素短语的定义

素短语&#xff0c;是指至少含有一个终结符的短语&#xff0c;并且除自身外&#xff0c;不包含更小的素短语。 最左素短语是句型中最左边的素短语。...

【华为OD题库-033】经典屏保-java

题目 DVD机在视频输出时&#xff0c;为了保护电视显像管&#xff0c;在待机状态会显示"屏保动画”&#xff0c;如下图所示,DVD Logo在屏幕内来回运动&#xff0c;碰到边缘会反弹:请根据如下要求&#xff0c;实现屏保Logo坐标的计算算法 1、屏幕是一个800 * 600像素的矩形&…...

clang+llvm多进程gdb调试

clangllvm多进程gdb调试 前言1. 命令行gdb2. 父进程调试3. 子进程调试4. 返回父进程 前言 在学习新增llvm的优化pass时&#xff0c;需要跟踪clang及llvm的调用栈。然而llvm通过posix_spawn()创建了新进程&#xff0c;这使得gdb调试必须有一定的技巧了。 1. 命令行gdb 以下命…...

PHP反序列化简单使用

注&#xff1a;比较简陋&#xff0c;仅供参考。 编写PHP代码&#xff0c;实现反序列化的时候魔法函数自动调用计算器 PHP反序列化 serialize(); 将对象序列化成字符串 unserialize(); 将字符串反序列化回对象 创建类 class Stu{ public $name; public $age; public $sex; publi…...

专业课140+总分420+东南大学920专业综合考研,信息学院通信专业考研分享

专业课140总分420东南大学920专业综合考研&#xff0c;信息学院通信专业考研分享 我是三月开始系统考研备战&#xff0c;寒假先看的高数全书&#xff0c;奈何在家效率极其低下&#xff0c;才草草看了前三四章。回校后学习的比较认真&#xff0c;每天大概保持10个小时左右&…...

数据结构与算法编程题11

已知两个链表A和B分别表示两个集合&#xff0c;其元素递增排列。 请设计算法求出A与B的交集&#xff0c;并存放于A链表中。 a: 1, 2, 2, 4, 5, 7, 8, 9, 10 b: 1, 2, 3, 6, 7, 8 #include <iostream> using namespace std;typedef int Elemtype; #define ERROR 0; #defin…...

【LeetCode刷题】--40.组合总和II

40.组合总和II 本题详解&#xff1a;回溯算法 class Solution {public List<List<Integer>> combinationSum2(int[] candidates, int target) {int len candidates.length;List<List<Integer>> res new ArrayList<>();if (len 0) {return re…...

mysql面试内容点

left join和inner join的区别 1.返回不同 innerjoin只返回两个表中联结字段相等的行。left join返回包括左表中的所有记录和右表中联结字段相等的记录。 2.数量不同 inner join的数量小于等于左表和右表中的记录数量。left join的数量以左表中的记录数量相同。 3.记录属性不同…...

msvcp140.dll是什么?msvcp140.dll丢失的有哪些解决方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp140.dll丢失”。这个错误通常会导致某些应用程序无法正常运行。为了解决这个问题&#xff0c;我们需要采取一些措施来修复丢失的msvcp140.dll文件。本文将详细介绍5个解决msvcp140.dl…...

ncmdumpGUI终极指南:3分钟解锁你的网易云音乐NCM文件加密

ncmdumpGUI终极指南&#xff1a;3分钟解锁你的网易云音乐NCM文件加密 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经在网易云音乐下载了心爱的歌曲…...

5分钟掌握Windows安卓应用安装:APK Installer轻量级解决方案揭秘

5分钟掌握Windows安卓应用安装&#xff1a;APK Installer轻量级解决方案揭秘 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想在Windows电脑上运行安卓应用…...

多模型路由系统的工程决策:从成本约束到动态降级的架构设计

在 AI 工程落地中&#xff0c;模型调用不再是‘选最优模型’的简单问题。当业务面临成本压力、额度限制与稳定性要求三重约束时&#xff0c;系统必须能在主模型不可用或成本过高时&#xff0c;自动、无感地切换到备用模型&#xff0c;同时保证用户体验不出现断崖式下跌。本文基…...

分布式水文模型学习进展

swat模型及分布式水文模型使用与开发简介问题记录简介 这是swat及其他分布式水文模型的使用及开发过程中遇到的问题及解决方法的记录&#xff0c;目前仅为暂时的、非完整、非体系化的记录&#xff0c;待日后完善。 问题记录 什么都对但结果数量级不对 &#xff1a; 分几种情…...

GPT-SoVITS macOS MPS加速实战指南:Metal性能优化与300%推理速度提升

GPT-SoVITS macOS MPS加速实战指南&#xff1a;Metal性能优化与300%推理速度提升 【免费下载链接】GPT-SoVITS 1 min voice data can also be used to train a good TTS model! (few shot voice cloning) 项目地址: https://gitcode.com/GitHub_Trending/gp/GPT-SoVITS …...

从激光笔到工业切割头:深入浅出聊聊‘光束质量’M²因子到底是个啥?

从激光笔到工业切割头&#xff1a;光束质量M因子的实战解读 激光技术已经从实验室走向千家万户&#xff0c;无论是孩子手中的红色激光笔&#xff0c;还是工厂里切割金属的万瓦光纤激光器&#xff0c;都离不开一个关键参数——光束质量。这个看似抽象的概念&#xff0c;实际上决…...

QMCDecode终极指南:5分钟快速解锁QQ音乐加密文件,让音乐播放无限制!

QMCDecode终极指南&#xff1a;5分钟快速解锁QQ音乐加密文件&#xff0c;让音乐播放无限制&#xff01; 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac&#xff0c;qmc0,qmc3转mp3, mflac,mflac0等转flac)&#xff0c;仅支持macOS&#xff0c;可自动识…...

Audacity音频编辑框架:从信号处理到现代架构的技术演进

Audacity音频编辑框架&#xff1a;从信号处理到现代架构的技术演进 【免费下载链接】audacity Audio Editor 项目地址: https://gitcode.com/GitHub_Trending/au/audacity Audacity作为开源音频编辑软件的标杆&#xff0c;其技术架构的演进历程反映了音频处理领域从传统…...

网盘文件直链解析工具LinkSwift:让下载回归简单纯粹

网盘文件直链解析工具LinkSwift&#xff1a;让下载回归简单纯粹 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云…...

Agent 一接无限滚动页就开始漏内容:从 Viewport Checkpoint 到 Stable Item Key 的工程实战

很多团队把浏览器 Agent 接到商品流或监控列表后&#xff0c;第一批线上事故并不是“不会滚动”&#xff0c;而是它滚得很勤&#xff0c;却依旧漏内容。⚠️ 页面每次只暴露一个视口&#xff0c;模型若把“当前看到的列表”直接当成“完整世界”&#xff0c;结果就会一边下滚一…...