基于pytest-bdd的项目目录结构和命名规范

pytest-bdd 的文件的命名规范

pytest-bdd 是基于pytest 之上,所以需要遵循pytest 的命名规则才能进行测试,具体有:

  1. 测试文件名必须以*test.py或者test*.py命名
  2. 测试函数必须以 test_开头

在pytest-bdd中存在两类文件:

  1. 以 .feature 结尾的用户场景文件
  2. 以 .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装饰器需要遵循一定的规则,如下:

  1. 一个@scenario装饰器用于定义一个场景。

  2. 必须指定该场景所属的 feature 文件的路径和场景名称。

  3. 测试函数的名称必须与场景名称匹配。

  4. 测试函数的参数必须与场景步骤的参数名称相匹配。

  5. 测试函数必须使用 BDD 关键字来编写场景步骤。

  6. pytest-bdd 将自动加载与场景匹配的步骤,并在执行测试时逐步执行它们。

  7. 可以将多个场景分组在同一个 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是有终端用户参与进来的部分, 目录层级较深不利于使用,个人是比较不建议这种方式。



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

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

相关文章

SQL题

[极客大挑战 2019]EasySQL 进行简单的尝试&#xff0c;就知道是单引号的字符型注入 万能密码进行一个简单的尝试 结果就出来了 还是要了解一下原理 输入的是1&#xff0c;形成的sql语句是错误的SELECT*FROM table_name WHERE username1and password123; 第一个单引号和第二个…

01Urllib

1.什么是互联网爬虫&#xff1f; 如果我们把互联网比作一张大的蜘蛛网&#xff0c;那一台计算机上的数据便是蜘蛛网上的一个猎物&#xff0c;而爬虫程序就是一只小蜘蛛&#xff0c;沿着蜘蛛网抓取自己想要的数据 解释1&#xff1a;通过一个程序&#xff0c;根据Url(http://www.…

Flutter应用-使用sqflite升级数据库

文章目录 问题描述具体做法代码示例更多条件限制升级 数据库迁移和备份简介数据库迁移数据库备份 问题描述 使用fluttter开发的应用程序发布后&#xff0c;发现数据库有些设计不合理。如何来更新数据库呢&#xff1f; 使用sqflite来处理数据库&#xff0c;但是第一版软件发布后…

JQuery ajax 提交数据提示:Uncaught TypeError:Illegal invocation

JQuery ajax 提交数据提示&#xff1a;Uncaught TypeError:Illegal invocation 1 问题描述 用jQuery Ajax向DRF接口提交数据的时候&#xff0c;console提示&#xff1a;Uncaught TypeError:Illegal invocation(未捕获的异常&#xff1a;非法调用)。 这个问题可能有两种原因导…

Zookeeper学习笔记(1)—— 基础知识

Zookeeper概述 Zookeeper 是一个开源的分布式的&#xff0c;为分布式框架提供协调服务的 Apache 项目 工作机制 Zookeeper从设计模式角度来理解&#xff1a;是一个基于观察者模式设计的分布式服务管理框架&#xff0c;它负责存储和管理大家都关心的数据&#xff0c;然后接受…

LeetCode700. Search in a Binary Search Tree

文章目录 一、题目二、题解 一、题目 You are given the root of a binary search tree (BST) and an integer val. Find the node in the BST that the node’s value equals val and return the subtree rooted with that node. If such a node does not exist, return nul…

ClickHouse UDF 运行速度慢问题

一、环境版本 环境版本docker clickhouse22.3.10.22 二、UDF运行速度时快时慢 udf配置文件xxx_function.xml type- 可执行类型。如果type设置为executable则启动单个命令。如果设置为&#xff0c;executable_pool则创建命令池。 pool_size- 命令池的大小。可选参数&#xff…

【AI视野·今日Robot 机器人论文速览 第六十三期】Thu, 26 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Fri, 27 Oct 2023 Totally 27 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers 6-DoF Stability Field via Diffusion Models Authors Takuma Yoneda, Tianchong Jiang, Gregory Shakhnarovich, Matthew R. …

微软Surface/Surface pro笔记本电脑进入bios界面

微软Surface笔记本电脑进入bios界面 方法一推薦這種方法&#xff1a;Surface laptop 进BIOS步骤 开机后&#xff0c;不停按音量键进bios界面。 方法二&#xff1a;Surface Book、Surface Pro进bios步骤 1、关闭Surface&#xff0c;然后等待大约10秒钟以确保其处于关闭状态。…

SQL中的数据类型和规范化,助力数据存储优化

大家好&#xff0c;目前优化数据存储对于获得良好的性能始终至关重要&#xff0c;选择合适的数据类型并应用正确的规范化过程对于决定其性能至关重要。本文将介绍最重要和最常用的数据类型和规范化过程。 一、SQL中的数据类型 SQL中主要有两种数据类型&#xff1a;字符串和数…

jquery常用方法积累

01-text() text() 是 jQuery 库中的一个方法&#xff0c;它用两个作用&#xff1a; ①用于获取匹配元素的文本内容。 ②用于设置匹配元素的文本内容 ①当 text() 方法被用于获取文本时&#xff0c;它会返回所有匹配元素的文本内容&#xff0c;并将它们连接成一个字符串。例如…

小程序action-sheet结合自定义tabbar显示

要实现此效果&#xff0c;遇到的问题&#xff1a;背景在电脑端调试的情况正常的情况下&#xff0c;手机端点击事件工单&#xff0c;返回回来的时候action-sheet卡住在屏幕上&#xff0c;点击遮罩层都不消失。更奇怪的是 这种情况并不是每次发生&#xff0c;而是有时候发生&…

给VSCode插上一双AI的翅膀

#AI编程助手哪家好&#xff1f;DevChat“真”好用# 文章目录 前言一、安装DevChat1.1、访问地址1.2、注册1.3、在VSCode里安装DevChat插件1.3.1、未安装状态1.3.2、已安装状态 二、设置Access Key2.1. 点击左下角管理&#xff08;“齿轮”图标&#xff09;—命令面板&#xff…

DNS域名解析服务

1.概述 1.1.产生原因 IP 地址:是互联网上计算机唯一的逻辑地址&#xff0c;通过IP 地址实现不同计算机之间的相互通信&#xff0c;每台联网计算机都需要通过I 地址来互相联系和分别&#xff0c;但由于P 地址是由一串容易混淆的数字串构成&#xff0c;人们很难记忆所有计算机的…

【7】Spring Boot 3 集成组件:缓存组件 spring cache + spring data redis

目录 【7】Spring Boot 3 集成组件&#xff1a;缓存组件 spring cache spring data redis什么是缓存抽象声明式注解JSR-107对应SpEL上下文数据 引入依赖cache 支持的缓存类型缓存类型配置NONESIMPLEREDIS自定义配置 CAFFEINE Hazelcast...总结 个人主页: 【⭐️个人主页】 需要…

企业邮箱认证指南:安全与高效的邮箱认证方法

企业邮箱是专门为企业提供的电子邮件服务&#xff0c;安全性和专业性更高。在开始使用企业邮箱之前&#xff0c;很多人会有一些问题&#xff0c;比如企业邮箱需要认证吗、如何开通企业邮箱&#xff0c;以及哪款企业邮箱好。 1、企业邮箱在使用前需要认证吗&#xff1f; 答案是肯…

flume异常关闭文件修复方法

​ flume在从kafka采集数据后&#xff0c;会将数据写入到hdfs文件中。在写入过程中&#xff0c;由于集群负载、资源或者网络原因会导致文件没有正常关闭,即文件表现为tmp格式&#xff0c;这种格式的文件从hdfs往hive分区load数据时&#xff0c;会导致数据无法查询问题。 flume写…

golang学习笔记——指针

文章目录 指针Go语言中的指针与C语言的区别Go语言中的指针—newGo语言中的指针—makenew与make的区别 参考资料 指针 Go语言中的指针与C语言的区别 区别于C/C中的指针&#xff0c;Go语言中的指针不能进行偏移和运算&#xff0c;是安全指针。 C语言 #include <stdio.h>…

esp-01刷固件/下载软件到内部单片机的方法

此文章为转载&#xff0c;非原创 一、准备 需要准备三个东西&#xff1a; 1.esp模块。ESP-01 和 ESP-01s 的引脚及 flash 容量基本完全兼容&#xff0c;只是内部硬件设计粗糙与否的区别&#xff0c;所以理论上都适用。 2.官方固件。此部分可以从安信可官方教程中下载&#xff0…

WPF实现将鼠标悬浮在按钮上时弹出菜单

在WPF 中&#xff0c;要实现当鼠标悬停在按钮上时显示菜单&#xff0c;并能够灵活设置菜单的位置&#xff08;如按钮的上方或下方&#xff09;&#xff0c;你可以使用 Popup 控件来创建自定义的弹出菜单。以下是如何通过 Popup 控件来实现这种功能的步骤&#xff1a; 1. 在 XA…