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 的区别
Fixture和Background都是在开启测试前设置预期环境或状态的工具,但它们在用途和功能上有所区别,用在不同的场景。
-
Fixture:在 pytest 和许多其他测试框架中,fixture 是设置测试环境的一种工具,它为测试提供了需要的初识状态或值。可以把 pytest fixture 理解为设置给定环境或预设需要的工作,它可以创建对象、连接数据库、开启服务器或其他任何为了测试需要预先设定的操作。Fixture 可以被多个测试用例重复使用,从而避免代码的重复。
-
Background:在 Gherkin 语言(被许多 BDD 框架,如 Cucumber 和 behave 使用)中,Background 是一个特殊的场景,它在包含它的
Feature中的每个Scenario或Scenario 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的规格和测试文件的编写的时候,常常会遇到下面的概念: Fixture : 测试设施。设定测试环境的预设状态或值的机制。Background: 背景。所有场景的公共部分。Scenario: 场景。Given : 前置条件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语言中文网的学习与整理,非原创,如有侵权请告知删除。 一、运算符重载的含义 所谓重载,就是赋予新的含义。函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同…...
【unity实战】unity3D中的PRG库存系统和换装系统(附项目源码)
文章目录 先来看看最终效果前言素材简单绘制库存UI前往mixamo获取人物模型动画获取一些自己喜欢的装备物品模型库存系统换装系统装备偏移问题添加消耗品最终效果源码完结 先来看看最终效果 前言 之前2d的换装和库存系统我们都做过不少了,这次就来学习一个3d版本的&…...
编程语言发展史:C语言的诞生及其影响
预计更新 第一部分:早期编程语言 1.1布尔代数和机器语言 1.2汇编语言的出现和发展 1.3高级语言的兴起 第二部分:主流编程语言 1.1 C语言的诞生及其影响 1.2 C语言的发展和应用 1.3 Java语言的出现和发展 1.4 Python语言的兴起和特点 1.5 JavaScript语言…...
(二)pytest自动化测试框架之添加测试用例步骤(@allure.step())
前言 在编写自动化测试用例的时候经常会遇到需要编写流程性测试用例的场景,一般流程性的测试用例的测试步骤比较多,我们在测试用例中添加详细的步骤会提高测试用例的可阅读性。 allure提供的装饰器allure.step()是allure测试报告框架非常有用的功能&am…...
【用unity实现100个游戏之16】Unity程序化生成随机2D地牢游戏2(附项目源码)
文章目录 先看看最终效果前言生成走廊生成房间修复死胡同增加走廊宽度获取走廊位置信息集合方法一方法二 源码完结 先看看最终效果 前言 上期已经实现了房间的生成,本期紧跟着上期内容,生成走廊并结合上期内容生成连通的房间。 生成走廊 修改Procedur…...
潮玩宇宙大逃杀游戏开发源码说明
潮玩宇宙大逃杀游戏是一款简单而刺激的游戏。玩家在倒计时结束前从8个房间中选择一个房间并投入宝石。倒计时结束后,系统会自动生成一个敌人,然后随机挑选一个房间并清除这个房间内的人。其余7个房间内的玩家就可以按照投入比例获得被清除掉玩家的宝石。…...
UE5 操作WebSocket
插件:https://www.unrealengine.com/marketplace/zh-CN/product/websocket-client 参考:http://dascad.net/html/websocket/bp_index.html 1. 安装Plugings 2.测试websocket服务器 http://www.websocket-test.com/ 3.连接服务器 如果在Level BP里使用&a…...
Linux文件
目录 一、基本概念 二、研究进程和被打开文件的关系 (一)w方式 (二)a方式 三、认识系统接口,操作文件 (一)认识文件描述符 (二)举例 (三)…...
素短语的定义
素短语,是指至少含有一个终结符的短语,并且除自身外,不包含更小的素短语。 最左素短语是句型中最左边的素短语。...
【华为OD题库-033】经典屏保-java
题目 DVD机在视频输出时,为了保护电视显像管,在待机状态会显示"屏保动画”,如下图所示,DVD Logo在屏幕内来回运动,碰到边缘会反弹:请根据如下要求,实现屏保Logo坐标的计算算法 1、屏幕是一个800 * 600像素的矩形&…...
clang+llvm多进程gdb调试
clangllvm多进程gdb调试 前言1. 命令行gdb2. 父进程调试3. 子进程调试4. 返回父进程 前言 在学习新增llvm的优化pass时,需要跟踪clang及llvm的调用栈。然而llvm通过posix_spawn()创建了新进程,这使得gdb调试必须有一定的技巧了。 1. 命令行gdb 以下命…...
PHP反序列化简单使用
注:比较简陋,仅供参考。 编写PHP代码,实现反序列化的时候魔法函数自动调用计算器 PHP反序列化 serialize(); 将对象序列化成字符串 unserialize(); 将字符串反序列化回对象 创建类 class Stu{ public $name; public $age; public $sex; publi…...
专业课140+总分420+东南大学920专业综合考研,信息学院通信专业考研分享
专业课140总分420东南大学920专业综合考研,信息学院通信专业考研分享 我是三月开始系统考研备战,寒假先看的高数全书,奈何在家效率极其低下,才草草看了前三四章。回校后学习的比较认真,每天大概保持10个小时左右&…...
数据结构与算法编程题11
已知两个链表A和B分别表示两个集合,其元素递增排列。 请设计算法求出A与B的交集,并存放于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 本题详解:回溯算法 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丢失的有哪些解决方法
在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“msvcp140.dll丢失”。这个错误通常会导致某些应用程序无法正常运行。为了解决这个问题,我们需要采取一些措施来修复丢失的msvcp140.dll文件。本文将详细介绍5个解决msvcp140.dl…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
