基于pytest-bdd的项目目录结构和命名规范
pytest-bdd 的文件的命名规范
pytest-bdd 是基于pytest 之上,所以需要遵循pytest 的命名规则才能进行测试,具体有:
- 测试文件名必须以*test.py或者test*.py命名
- 测试函数必须以 test_开头
在pytest-bdd中存在两类文件:
- 以 .feature 结尾的用户场景文件
- 以 .py 结尾的测试代码。这里又细分为两类:
- 以
@given,@when,@then注解的步骤函数,这些函数名没有强制限制, 也可以借鉴beheave的写法以step_开头。 - 以
@scenario注解的测试场景函数,这个函数名需要以test_开头, 因为这样才会被pytest 识别。
举例来看: @given,@when,@then 的步骤函数的示例:
@pytest.fixture
@given("I have a calculator")
def calculator():return Calculator()@when(parsers.parse('I enter "{a}" and "{b}"'))
def enter_numbers(calculator, a, b):calculator.a = int(a)calculator.b = int(b)@then(parsers.parse('the result should be "{result}"'))
def verify_result(calculator, result):assert calculator.add(calculator.a, calculator.b) == int(result)
@scenario 注解的测试场景函数的示例:
@scenario('../features/calculator.feature','Add two numbers')
def test_add():pass
@scenario本身没有实际的内容,只是一个占位符,关联场景和步骤,但是又不可少
关于 @scenario
@scenario是 pytest-bdd 框架中的一个装饰器,用于标记一个 BDD 场景并将其与编写的测试函数关联起来。
@scenario装饰器可以用来定义一个场景,并确定它所属的 feature 和 scenario。其语法如下:
@scenario('<feature_file_path>', '<scenario_name>')
def test_my_scenario():pass
其中,<feature_file_path>是 feature 文件的路径,<scenario_name>是场景的名称。在测试方法中不需要任何具体的测试步骤。相反,pytest-bdd 将自动加载与场景匹配的步骤,并在执行测试时逐步执行它们。这意味着测试方法本身只是一个占位符,其定义的唯一目的是将场景与步骤关联起来。
使用@scenario装饰器需要遵循一定的规则,如下:
-
一个
@scenario装饰器用于定义一个场景。 -
必须指定该场景所属的 feature 文件的路径和场景名称。
-
测试函数的名称必须与场景名称匹配。
-
测试函数的参数必须与场景步骤的参数名称相匹配。
-
测试函数必须使用 BDD 关键字来编写场景步骤。
-
pytest-bdd 将自动加载与场景匹配的步骤,并在执行测试时逐步执行它们。
-
可以将多个场景分组在同一个 feature 文件中,并在同一个测试类中执行它们。
使用pytest-bdd的项目的目录结构
基于以上,目录的设计如下:
1…feature 场景文件放置在项目根目录的 features目录中。[非强制]
2. 步骤函数和场景函数可以放在一个.py文件中, 也可以放在两个 .py文件中。
3. 包含场景函数的.py 需要以test_ 开头 [强制]
4. 测试步骤的文件放置在项目根目录的steps 或step_defs 目录中[非强制]
5. 场景函数如果分拆出来,放置在根目录的 test_cases目录中[非强制]
6. 在基于面向对象的设计中,可以一个类一个场景文件, 也可以一个功能一个场景文件。[非强制]
基于以上原则,提供的几个目录结构示例如下:
目录结构1:
步骤函数和场景函数放在一起,一个功能一个场景文件:
├────features/ # 用户场景
│ ├────user/
│ │ ├────create_user.feature
│ ├────login.feature
├────step_defs/ # 步骤函数和测试场景
│ ├────user/
│ │ ├────test_create_user.py
│ └────test_login.py
目录结构2:
步骤函数和场景函数放在一起,一个类一个场景文件:
├────features/ # 用户场景
│ ├────user.feature│ ├────login.feature
├────step_defs/ # 步骤函数和测试场景
│ ├────user.feature│ └────test_login.py
目录结构3:
├────features/ # 用户场景
│ ├────user/
│ │ ├────create_user.feature
│ ├────login.feature
├────step_defs/ # 步骤函数
│ ├────user/
│ │ ├────create_user_steps.py
│ └────login_steps.py
├────test_case/ # 测试场景
│ ├────test_user/
│ │ ├────test_create_user.py
│ └────test_login.py
其他还可以用 cases和 test_cases 来命名,类似如下:
├────cases/ # 用户场景
│ ├────projects/
│ │ ├────create_project.features
│ ├────login.features
├────test_cases/ # 步骤函数和测试场景
│ ├────projects/
│ │ ├────test_create_project.py
│ └────test_login.py
├────test_cases/ # 测试用例
│ ├────features/ # 用户场景
│ │ ├────login.features
│ ├────step_defs/ # 步骤函数和测试场景
│ │ ├────test_login.py
以测试角度出发的目录
上面的目录规范是将BDD的规范文件和测试作为独立的部分, 也有的项目从测试角度出发,将BDD的文件作为测试的一部分, 统一放入项目的tests 目录中,
|-- tests
| |-- features
| | |-- step_definitions
| | | |-- __init__.py
| | | |-- test_steps.py
| | |-- support
| | | |-- conftest.py
| | | |-- env.py
| | | |-- hooks.py
| | |-- feature1.feature
| | |-- feature2.feature
| |-- unit
| | |-- __init__.py
| | |-- test_module1.py
| | |-- test_module2.py
| |-- __init__.py
| |-- conftest.py
|-- setup.py
|-- requirements.txt
|-- README.md
tests目录包含所有测试相关文件,其中features目录用于存放 BDD 测试用例和相关文件,unit目录用于存放其他类型的测试用例。step_definitions目录用于存放实现 BDD 测试用例步骤的 Python 脚本。每个 BDD 测试用例的步骤都应该在这里实现support目录用于存放 BDD 测试用例所需的支持文件,比如环境设置、钩子函数等。conftest.py文件放在tests目录下,用于实现项目级别的配置和夹具设置。setup.py文件是一个 Python 包的安装脚本。requirements.txt文件用于存储项目依赖库的清单。README.md文件是项目的说明文档。
如果从BDD的定义和作用来看的话,这种目录结构就有点混淆了 BDD和测试的概念,因为BDD是有终端用户参与进来的部分, 目录层级较深不利于使用,个人是比较不建议这种方式。
相关文章:
基于pytest-bdd的项目目录结构和命名规范
pytest-bdd 的文件的命名规范 pytest-bdd 是基于pytest 之上,所以需要遵循pytest 的命名规则才能进行测试,具体有: 测试文件名必须以*test.py或者test*.py命名测试函数必须以 test_开头 在pytest-bdd中存在两类文件: 以 .feat…...
web前端开发网页设计课堂作业/html练习《课程表》
目标图: 代码解析: 代码解析1<table border"3" align"center"><输入内容(的) 边界"3px" 位置"居中">2<tr><td colspan"7" align"center">课程表</td><t…...
用欧拉路径判断图同构推出reverse合法性:1116T4
http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b,我们在 a i a_i ai 和 a i 1 a_{i1} ai1 之间连边, b b b 同理,则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然࿰…...
高阶数据结构---树状数组
文章目录 楼兰图腾一个简单的整数问题 一个简单的整数问题2谜一样的牛 一、楼兰图腾OJ链接 二、一个简单的整数问题OJ链接 三、一个简单的整数问题2OJ链接 四、谜一样的牛OJ链接...
如何保护PayPal账户安全:防止多个PayPal账号关联?
PayPal是一家全球领先的在线支付平台,已经成为全球最受欢迎的在线支付工具之一,广泛应用于电子商务、跨境交易和个人之间的付款,很多跨境卖家的支付平台都会选择PayPal。PayPal支持全球多个国家和20多种货币在线支付,并且能即时收…...
关于 Spring :松耦合、可配置、IOC、AOP
关于 Spring :松耦合、可配置、IOC、AOP 文章目录 关于 Spring :松耦合、可配置、IOC、AOP一、关于 Spring1、概述2、Spring 的“松耦合”体现在哪3、Spring 的“可配置”体现在哪4、Spring 的 IOC 容器的主要作用5、Spring 的 AOP 容器的主要作用 一、关…...
pytorch tensor数据类型转换为python数据
一、item() input: x torch.tensor([1.0]) x.item()output: 1.0二、tolist() input: a torch.randn(2, 2) a.tolist() a[0,0].tolist()output: [[0.012766935862600803, 0.5415473580360413],[-0.08909505605697632, 0.7729271650314331]]0.012766935862600803...
HarmonyOS开发:动态共享包的依赖问题
一、共享包的依赖方式 在需要依赖的模块包目录下oh-package.json5文件中添加依赖: "dependencies": {"ohos/srpaasUI": "file:../../srpaasUI","ohos/srbusiness": "file:../../feature/srbusiness"} 引入之后…...
中睿天下加入中关村华安关键信息基础设施安全保护联盟
近日,中睿天下正式加入中关村华安关键信息基础设施安全保护联盟,成为其会员单位。 中关村华安关键信息基础设施安全保护联盟是由北京市科学技术委员会、中关村科技园区管理委员会指导支持,经北京市民政局批准,于2023年8月正式注册…...
【c++STL算数仿函数,关系仿函数,逻辑仿函数】
文章目录 C STL中的算数、关系和逻辑仿函数1. 算数仿函数2. 关系仿函数3. 逻辑仿函数 C STL中的算数、关系和逻辑仿函数 STL(Standard Template Library)是C标准库的一部分,提供了许多强大的工具和功能,其中包括仿函数࿰…...
产品经理的能力模型是什么?
一个产品的成功需要团队成员利用自己的技能共同合作完成。作为团队的核心和产品的主导者,产品经理需要具备一定的能力模型,以更好地完成工作。下面从五个方面进行解答。 首先,产品经理需要具备需求分析的能力。需求是用户在特定场景下产生的欲…...
缓存和DB一致性
读操作,一般是先查询缓存,查询不到再查询数据库,最后回写进缓存。 写操作,究竟是先删除(更新)缓存,再更新数据库,还是先更新数据库,再删除(更新)缓存呢? 1、给缓存设置过期时间 适用…...
netty websockt之断连重试
断连重试有以下两点考虑: 1、连接异常,比如网络抖动导致连接失败; 2、连接过程中断开连接重试; 主要用到两个工具类: ChannelFutureListener监听ChannelFuture..isSuccess(); ChannelInboundHandlerAd…...
【Gateway】基于ruoyi-cloud-plus项目,gateway局部过滤器和过滤返回以及集成nacos
1.使用Gateway路由转发 1.1标题引入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>1.2添加YML配置 spring:cloud:gateway:# 打印请求日志(自定义)…...
mysql -mmm
MMM(Master-Master replication manager for MvSQL,MySQL主主复制管理器) 是一套支持双主故障切换和双主日常管理的脚本程序。MMM 使用 Perl 语言开发,主要用来监控和管理 MySQL Master-Master (双主)复制&…...
C++初阶 类和对象(下)
目录 一、拷贝构造函数 1.1 什么是拷贝构造函数? 1.2 为什么得是引用? 1.3 使用拷贝构造函数 1.4 拷贝构造函数有什么用? 二、运算符重载 2.1 什么是运算符重载? 2.2 尝试前须知 2.3 常见运算符重载 2.3.1运算符重载 …...
使用Postman进行压力测试
1.打开Postman新建测试接口 2.点击右边保存,选择一个文件集合,如果没有就创建,然后保存 就是这个东西,这里不便展示出来,压力测试需要在文件夹里面进行 3.选择要测试的接口,iterations 表示请求发起次数&a…...
AI视频检索丨历史视频标签化,助力重要事件高效溯源
随着科技的不断发展,安全监控已成为我们生活中不可或缺的一部分。当发生盗窃、人员走失、安全事故等重要事件时,常常需要通过查看视频回放了解事情经过,为解决问题提供证据或指明查找方向。但是,人工查看视频回放往往费时费力&…...
【前段基础入门之】=>CSS3新特性 响应式布局
文章目录 概念媒体查询媒体类型媒体特性媒体运算符 概念 所谓对响应式布局方案的理解,众说纷纭,核心点就是同一套代码在不同尺度屏幕下的布局呈现方式的不同 社区中有很多人分享,并列出了多种实现响应式布局的方案,比如【 rem&…...
【Java 进阶篇】JQuery 遍历:发现元素的魔法之旅
欢迎来到 JQuery 的奇妙世界,一个充满活力和灵感的地方。在这个世界里,我们将一起探讨 JQuery 的遍历功能,这是一个让你轻松发现和操作网页元素的神奇工具。无需太多前端经验,只要有一颗探险的心,你就能在 JQuery 遍历…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...
统计学(第8版)——统计抽样学习笔记(考试用)
一、统计抽样的核心内容与问题 研究内容 从总体中科学抽取样本的方法利用样本数据推断总体特征(均值、比率、总量)控制抽样误差与非抽样误差 解决的核心问题 在成本约束下,用少量样本准确推断总体特征量化估计结果的可靠性(置…...
Spring事务传播机制有哪些?
导语: Spring事务传播机制是后端面试中的必考知识点,特别容易出现在“项目细节挖掘”阶段。面试官通过它来判断你是否真正理解事务控制的本质与异常传播机制。本文将从实战与源码角度出发,全面剖析Spring事务传播机制,帮助你答得有…...
代理服务器-LVS的3种模式与调度算法
作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们上一章介绍了Web服务器,其中以Nginx为主,本章我们来讲解几个代理软件:…...
