BDD - SpecFlow ExternalData Plugin 导入外部测试数据

news2024/11/13 11:28:05

BDD - SpecFlow ExternalData Plugin 导入外部测试数据

  • 引言
  • SpecFlow ExternalData 插件
    • 支持的数据源
    • Tags
  • 实践
    • 创建一个 Class Libary Project
    • 添加 NuGet Packages
    • 添加测试数据源文件
      • CSV 文件
      • Excel 文件
    • 添加 Feature 文件
    • 实现 Step Definition
    • 执行
      • Scenario 导入测试数据源
      • Scenario Outline 导入测试数据源
      • 重命名数据源中的列名
      • Excel 指定 worksheet

引言

在设计 BDD Scenarios 时,有时会用到大量的测试数据,或是多个 Scenarios 共享这些大量数据,如果将这些数据都列在 Sceanrios 中,会使得 Scenario 非常庞大,大量重复的数据快也使得 Feature 文件非常庞大,数据行非常长等,导致可读性差,不够简洁。

这时我们就会思考能不能将数据放在某个文件中,Scenarios 中的参数可以跟这些外部数据关联起来。非常棒的是 SpecFlow 可以做到,支持加载外部数据源,并且非常方便地将这加载的数据导入到 Scenarios 中。

SpecFlow ExternalData 插件

利用 SpecFlow ExternalData 插件,可以实现将测试数据和测试 Scenarios 分开,并且 Scenarios 之间可以重用这些测试数据。这个插件支持最低版本 SpecFlow 3.5.5 起。

支持的数据源

  1. CSV 文件(格式 ‘CSV’, 扩展名 .csv)

Note: 标准的 RFC 4180 CSV 格式是带一行 header line,也就是表头 (ExternalData 插件利用 CsvHelper 来解析这类文件).

  1. Excel 文件(格式 Excel, 扩展名 .xlsx, .xls, .xlsb)

Note: XLSX 和 XLS 都是支持的 (ExternalData 插件利用 ExcelDataReader 来解析这类文件).

注意:SpecFlow ExternalData 某些版本可能支持 JSON 格式的文件,可参考官网实例 ExternalDataSample,但是这个插件后面被重写了,最新版本不再支持 JSON 文件加载导入到 Scenarios 中,具体参考 Issue #2559

Tags

@DataSource:path-to-file
这个 tag 主要是指明数据来源,可以加到 Scenario 或 Scenario Outline 上。

注意: 这个路径是基于 Feature 文件所在 folder 的相对路径。也就是说数据源文件应该放在 Feature 文件夹范围内,不能 Feature 文件夹范围外其它地方,不然编译会出错。

@DisableDataSource
@DataSource tag 可以加在 Feature 节点上,将所有 scenarios 转化成 scenario outlines。当整个 Feature 文件都用到相同的外部数据源时,这种方式非常有用。@DisableDataSource 用于少数 Scenarios 不使用这个 tag 在 Feature 节点的外部数据源。

@DataFormat:format
这个 tag 仅用在文件的扩展名不能被识别。

@DataSet:data-set-name
这个 tag 只应用于 Excel 文件。 默认是指定第一个 worksheet,当有多个 worksheet,就可以用这个 tag 指明特定的 worksheet。

@DataField:name-in-feature-file=name-in-source-file
这个 tag 用于 “重命名” 外部数据源的列名

tags 汇总:

  • Tags 可加在 Feature,scenario, scenario outline 或 scenario outline examples 上
  • Tags 可从 Feature 节点上继承,但是可覆盖父类 tag 或者用 @DisableDataSource 弃用数据源。
  • Tags 不能包含空格,通常用下划线 (_) 代表一个空格。目前不支持访问访问一个文件名或路径含有空格的文件

实践

创建一个 Class Libary Project

在这里插入图片描述

添加 NuGet Packages

都是最新版本:
SpecFlow 3.9.74
SpecRun.SpecFlow 3.9.31

SpecFlow.ExternalData 3.9.74

FluentAssertions 6.8.0

在这里插入图片描述

添加测试数据源文件

为了区分数据源 path,我们将准备两个数据源,一个直接放在 Feature 文件夹下,一个放在 Feature 文件夹下的子文件夹下。

CSV 文件

Feature/TestData 目录下添加一个 CSV 文件 products.csv

在这里插入图片描述

在这里插入图片描述

Excel 文件

Feature 目录下添加一个 Excel 文件 products.xlsx

在这里插入图片描述

在这里插入图片描述

添加 Feature 文件

Products.feature

Feature: Products

@DataSource:TestData/products.csv
Scenario: The basket price is calculated correctly (csv)
	Given the price of <product> is<price>
	And the customer has put 1 piece of <product> in the basket
	When the basket price is calculated
	Then the basket price should be €<price>

@DataSource:TestData/products.csv
Scenario Outline: Valid product prices are calculated (csv Outline)	
	Given the price of <product> is<price>
	And the customer has put 1 piece of <product> in the basket
	When the basket price is calculated
	Then the basket price should be €<price>

Examples: 
	| product    | price |
	| Cheesecake | 2.0   |

@DataSource:TestData/products.csv @DataField:product-name=product @DataField:price-in-EUR=price
Scenario: The basket price is calculated correctly (csv renamed fields)	
	Given the price of <product-name> is<price-in-EUR>
	And the customer has put 1 piece of <product-name> in the basket
	When the basket price is calculated
	Then the basket price should be €<price-in-EUR>

@DataSource:products.xlsx @DataSet:other_products
Scenario: The basket price is calculated correctly for other products
	Given the price of <product> is<price>
	And the customer has put 1 piece of <product> in the basket
	When the basket price is calculated
	Then the basket price should be €<price>

在这里插入图片描述

实现 Step Definition

ProductBindings.cs
这里我们只是想知道 Scenarios 中的参数和测试文件的联系,所以只实现了部分 step,保证 Scenarios 能跑起来就 OK。

using System;
using TechTalk.SpecFlow;

namespace ExternalData.Steps
{
    [Binding]
    public class ProductBindings
    {
        [Given(@"the price of (.*) is €(.*)")]
        public void GivenThePriceOfProductIsPrice(string product, float price)
        {
            Console.WriteLine($"product:{product}");
            Console.WriteLine($"price:{price}");
        }

        [Given(@"the customer has put (.*) piece of (.*) in the basket")]
        public void GivenTheCustomerHasPutPieceOfProductInTheBasket(int number, string product)
        {
        }

        [When(@"the basket price is calculated")]
        public void WhenTheBasketPriceIsCalculated()
        {
        }

        [Then(@"the basket price should be €(.*)")]
        public void ThenTheBasketPriceShouldBePrice(string price)
        {
        }

    }
}

在这里插入图片描述

执行

Scenario 导入测试数据源

这个 Scenario 导入了 TestData/products.csv 文件的数据,注意文件路径
@DataSource:TestData/products.csv

@DataSource:TestData/products.csv
Scenario: The basket price is calculated correctly (csv)
	Given the price of <product> is<price>
	And the customer has put 1 piece of <product> in the basket
	When the basket price is calculated
	Then the basket price should be €<price>

products.csv 中有三行数据,所以 Scenario 会自动转换成 Scenario outline

在这里插入图片描述

在这里插入图片描述
执行其中一个 Scenario,Step 中的 参数和 CSV 列名对应上了,自动关联起来了。

Given the price of <product> is<price>
 [Given(@"the price of (.*) is €(.*)")]
        public void GivenThePriceOfProductIsPrice(string product, float price)
        {
            Console.WriteLine($"product:{product}");
            Console.WriteLine($"price:{price}");
        }

在这里插入图片描述

Scenario Outline 导入测试数据源

@DataSource:TestData/products.csv
Scenario Outline: Valid product prices are calculated (csv Outline)	
	Given the price of <product> is<price>
	And the customer has put 1 piece of <product> in the basket
	When the basket price is calculated
	Then the basket price should be €<price>

Examples: 
	| product    | price |
	| Cheesecake | 2.0   |

生成了 4 个 Scenarios,其中绿色部分是 Scenario 中 Example 中的数据,黄色高亮是 CSV 中三行数据生成的。

在这里插入图片描述

重命名数据源中的列名

@DataField:product-name=product @DataField:price-in-EUR=price 通过这种方式将 Scenario 中的参数名和数据源中的列名映射起来。

@DataSource:TestData/products.csv @DataField:product-name=product @DataField:price-in-EUR=price
Scenario: The basket price is calculated correctly (csv renamed fields)	
	Given the price of <product-name> is<price-in-EUR>
	And the customer has put 1 piece of <product-name> in the basket
	When the basket price is calculated
	Then the basket price should be €<price-in-EUR>

在这里插入图片描述

Excel 指定 worksheet

Excel 有三个 worksheet,其中 other_products 有两行测试数据。

在这里插入图片描述

@DataSet:other_products 通过 @DataSet 来指定特定的 worksheet

@DataSource:products.xlsx @DataSet:other_products
Scenario: The basket price is calculated correctly for other products
	Given the price of <product> is<price>
	And the customer has put 1 piece of <product> in the basket
	When the basket price is calculated
	Then the basket price should be €<price>

生成了 2 条 Scenarios,并且参数能够自动关联起来。

在这里插入图片描述

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

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

相关文章

深入URP之Shader篇4: Depth Only Pass

Depth only pass unlit shader中包含了一个Depth Only Pass&#xff0c;这个pass的代码在Packages\com.unity.render-pipelines.universal\Shaders\DepthOnlyPass.hlsl中。这是一个公共pass&#xff0c;几乎所有的URP shader都会包含这个pass。本篇说一说这个pass的作用以及实…

Ubuntu映射到Windows网络驱动器

将虚拟机Ubuntu映射到Windows网络驱动器中&#xff0c;我们需要Ubuntu的网络和主机网络处于同一网段下&#xff0c;然后使Ubuntu具备共享文件功能&#xff0c;最后在windows下添加网络地址。 将Ubuntu设置和主机同一网段 查看主机网络信息 在虚拟机中 选择编辑-- 虚拟网络编…

Java的字符串String

文章目录什么是字符串String类的声明为什么我们的String是不可变的为什么String类用final修饰String的创建字符串比较相等关于Java中的比较关于字符串不同赋值操作对应的内存分配那对象如何进行比较内容字符串常量池StringTalbe的位置字符串常见的操作拼接操作获得字符串的子串…

事件驱动的微服务、CQRS、SAGA、Axon、Spring Boot

事件驱动的微服务、CQRS、SAGA、Axon、Spring Boot 学习构建分布式事件驱动的微服务、CQRS、事件溯源、SAGA、事务 课程英文名&#xff1a;Event-Driven Microservices, CQRS, SAGA, Axon, Spring Boot 此视频教程共10.0小时&#xff0c;中英双语字幕&#xff0c;画质清晰无…

一个带有楼中楼的评论系统数据库设置思路

前言 有个需求&#xff0c;需要实现百度贴吧那样能评论帖子中某一楼的评论里的评论 分析 说起来有点拗口&#xff0c;其实这个评论系统分为4个部分&#xff1a; 主题&#xff08;楼主发布的帖子&#xff09;直接返回楼主的评论&#xff08;从帖&#xff09;&#xff1a;直接…

(11)点云数据处理学习——Colored point cloud registration(彩色点注册)

1、主要参考 &#xff08;1&#xff09;官网介绍 Colored point cloud registration — Open3D 0.16.0 documentation 2、原理和实现 2.1原理 本教程演示了使用几何形状和颜色进行配准的ICP变体。实现了[Park2017]算法。颜色信息锁定沿切平面的对齐。因此&#xff0c;该算法…

Yocto创建自己的分区(基于STM32MP1)

Yocto创建自己的分区&#xff08;基于STM32MP1&#xff09; 前几章节我们分析了machine class里面几篇关键的class&#xff0c;还有machine conf里面的inc文件&#xff0c;大致的创建分区的流程都比较清晰了&#xff0c;本章节动手实际操作一把&#xff0c;创建一个自己的分区…

Unity中的协程

一、什么是协程 协程(Coroutines) 是一种比线程更加轻量级的存在&#xff0c;也被称为用户态线程一个进程可以拥有多个线程&#xff0c;一个线程可以拥有多个协程协程并不会增加线程&#xff0c;它在线程中运行&#xff0c;通过分时复用的方式运行多个协程&#xff0c;其切换代…

《Spring 5.x源码解析之Spring AOP 注解驱动使用及其实现原理》

《Spring 5.x源码解析之Spring AOP 注解驱动使用及其实现原理》 学好路更宽&#xff0c;钱多少加班。---- mercyblitz 一、前言 大家好&#xff0c;欢迎阅读《Spring 5.x源码解析》系列&#xff0c;本篇作为该系列的第二篇&#xff0c;重点介绍Spring AOP在注解驱动编程模式上的…

基于J2EE的大型视频影音系统的设计与实现

目 录 毕业设计&#xff08;论文&#xff09;任务书 I 摘 要 II ABSTRACT III 第1章 绪 论 1 1.1 课题的提出 1 1.1.1 Web2.0浪潮进一步影响全球互联网发展 1 1.1.2 视频分享成为2.0浪潮的最新爆发点 1 1.2 系统研究目的 2 1.3 系统设计目标 2 第2章 关键技术介绍 4 2.1 网页…

C#使用策略模式或者委托替代多IfElse判断和Switch语句

这篇文件介绍使用设计模式中的策略模式和委托来解决多个IfElse判断语句和Switch语句&#xff0c;这种替换方式在其他语言也一样可以做到&#xff0c;比如PHP、JavaScript、Python或者Java等。 这里以C#为例进行演示。 需要为一个程序编写计算方法&#xff0c;根据标签名称来决定…

【华为上机真题 2022】TLV解码

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

abc280

D 解法1&#xff0c;直接暴力&#xff0c;答案一定在2~1e6里面或者k本身&#xff08;如果k是个质数的话&#xff09; #include<bits/stdc.h> using namespace std; signed main() {long long k;cin>>k;for(long long i1;i<2000010;i) {k/__gcd(k,i);if(k1) {co…

在Linux中,使用Docker,安装es和kibana

1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里先创建一个网络&#xff1a; # 创建一个网络&#xff1a;es-net docker network create es-net# 查看本机的网络 docker network ls# 删除一个网络&#xff1a;es-ne…

Allegro如何缩放数据操作指导

Allegro如何缩放数据操作指导 Allegeo上可以缩放数据,尤其是在做结构时候非常有用,具体操作如下 以下图为例,需要把这个数据缩小0.5倍 点击Create Detail命令 Option里面选定一个层面,比如放在Board Geomertry,silkscreen top层 Scaling Factor输入0.5 Find选择所有 …

UE5 中 LiveLink 的开发全流程教程

注意&#xff0c;需要有源代码版本的 Unreal Engine&#xff0c;而不是从游戏 Launcher 中下载的 Unreal 版本。 本文使用是 Unreal Engine 5.1 版本。关于一些基础 API 介绍&#xff0c;可以参考之前的一篇。 起点 可以将 Engine\Source\Programs\BlankProgram 作为模板拷贝…

虚拟机搭载Linux · VMware + Ubuntu 部署 路线参考(20.04.5)

提前回家&#xff0c;要部署OS的实验环境。感谢广源同学给予的帮助和支持~ 电脑文件系统进行了整理&#xff0c;重型文件大部分转移到移动硬盘上。 &#xff08;解压了好久然后我找到镜像源了呜呜没发过来&#xff09; 一、VMware 16 安装 VMware虚拟机安装Linux教程(超详细)…

详解 Spring Boot 项目中的日志文件

目录 1. 日志的作用 2. 自定义日志打印 2.1 日志的基本格式 2.2 得到日志对象 2.3 使用日志对象提供的方法&#xff0c; 打印自定义的日志内容 2.4 日志框架的说明 3. 日志的持久化 3.1 配置日志文件的文件名 3.2 配置日志文件的保存路径 3.3 持久化日志的特性 4. 日…

Java集合(Collection List Set Map)

文章目录Collection接口和常用方法Collection接口遍历元素方式1 -使用Iterator(迭代器)Collection接口遍历对象方式2-for循环增强List接口和常用方法List[ArrayList, LinkedList, Vector]的三种遍历方式ArrayList的注意事项ArrayList的底层操作机制源码分析Vector和ArrayList的…

【已解决】vue后台页面跳转无法正常显示

今天写后端&#xff0c;发现一个问题&#xff0c;我的其他页面之间都可以正常跳转显示&#xff0c;但是我的其中一个页面&#xff08;简称U页面&#xff09;&#xff0c;我跳转到U页面时还可以显示&#xff0c;但之后点击其他页面就无法正常显示了&#xff08;能跳转不能显示&a…