C# 使用SpecFlow创建BDD测试用例
将自然语言编写的测试用例转换为可执行的测试,可以大大降低需求与开发之间的沟通成本,这是BDD(行为驱动开发)希望达到的效果。SpecFlow是.Net平台的BDD工具,可以帮助我们创建面向BDD的测试用例。
首先,在Visual Studio 2022中安装SpecFlow插件。选择菜单扩展->管理扩展,然后搜索SpecFlow:

点击下载,下载完成后,需要退出Visual Studio 2022,插件会自动安装。
我们编写一个简单的计算BMI(Body Mass Index身体质量指数)的功能作为测试目标,算法很简单,输入是身高和体重,计算公式是体重除以身高的平方。
再次启动Visual Studio,创建一个类库项目,名称为CalBmi,编写代码如下:
namespace CalBmi
{
public class BmiCalculator
{
public Decimal Height { get; set; }
public Decimal Weight { get; set; }
public Decimal Bmi()
{
throw new NotImplementedException();
}
}
}
接下来,在解决方案中添加SpecFlow项目,选择项目类型为SpecFlow:

项目名称为TestBmi,选择xUnit作为Test Framework:

创建完成后,项目的结构是这样的:

然后,添加项目引用,将测试目标项目CalBmi添加到TestBmi的项目引用中:

到这里,准备工作完成,现在可以开始写测试用例了。在TestBmi中有一个示例模板,

代码是这样的:
Feature: Calculator

Simple calculator for adding **two** numbers
Link to a feature: [Calculator](TestBmi/Features/Calculator.feature)
***Further read***: **[Learn more about how to generate Living Documentation](https://docs.specflow.org/projects/specflow-livingdoc/en/latest/LivingDocGenerator/Generating-Documentation.html)**
@mytag
Scenario: Add two numbers
Given the first number is 50
And the second number is 70
When the two numbers are added
Then the result should be 120
这个测试的是两个数字相加,我们照猫画虎,编写我们自己的测试用例,我们添加一个新的SpecFlow feature:

编写代码如下:
Feature: 计算BMI
@mytag
Scenario: 根据身高体重计算BMI
Given 身高1.75米
And 体重70.00公斤
When 计算BMI
Then 结果应该是22.86
点击右键,选择DefineSteps:

一个新的测试文件被创建了:

代码如下:
using System;
using TechTalk.SpecFlow;
namespace TestBmi.StepDefinitions
{
[Binding]
public class 计算BMIStepDefinitions
{
[Given(@"身高(.*)米")]
public void Given身高米(Decimal p0)
{
throw new PendingStepException();
}
[Given(@"体重(.*)公斤")]
public void Given体重公斤(Decimal p0)
{
throw new PendingStepException();
}
[When(@"计算BMI")]
public void When计算BMI()
{
throw new PendingStepException();
}
[Then(@"结果应该是(.*)")]
public void Then结果应该是(Decimal p0)
{
throw new PendingStepException();
}
}
}
在这个类中,编写测试,首先创建BmiCalculator的实例:
private readonly BmiCalculator _bmical = new BmiCalculator();
然后,改写各个方法:
using CalBmi;
using System;
using TechTalk.SpecFlow;
namespace TestBmi.StepDefinitions
{
[Binding]
public class 计算BMIStepDefinitions
{
private readonly BmiCalculator _bmical = new BmiCalculator();
private decimal _result;
[Given(@"身高(.*)米")]
public void Given身高米(Decimal p0)
{
_bmical.Height = p0;
}
[Given(@"体重(.*)公斤")]
public void Given体重公斤(Decimal p0)
{
_bmical.Weight=p0;
}
[When(@"计算BMI")]
public void When计算BMI()
{
_result=_bmical.Bmi();
}
[Then(@"结果应该是(.*)")]
public void Then结果应该是(Decimal result)
{
_result.Should().Be(result);
}
}
}
在测试管理器中运行这个测试:

与想象的一样,测试没有通过,因为我们没有编写实现代码,现在,修改BmiCalculator ,增加计算方法:
namespace CalBmi
{
public class BmiCalculator
{
public Decimal Height { get; set; }
public Decimal Weight { get; set; }
public Decimal Bmi()
{
return Weight/Height/Height;
}
}
}
再次运行测试:

仍然没有通过,问题是需要保留两位小数,最后一位四舍五入,修改算法:
public Decimal Bmi()
{
return System.Decimal.Round(Weight /Height/Height,2);
}
再次运行测试,这次通过了:

在测试中给出了测试步骤和每个步骤花费的时间。
C# 使用SpecFlow创建BDD测试用例的更多相关文章
- Robot Framework(三)创建测试用例
2.2.1测试用例语法 基本语法 测试用例由关键字在测试用例表中构建.关键字可以从测试库或资源文件导入,也可以在测试用例文件本身的关键字表中创建. 测试用例表中的第一列包含测试用例名称.测试用例从包含 ...
- BDD测试框架Spock概要
前言 为了找到一个适合自己的.更具操作性的.以DDD为核心的开发方法,我最近一直在摸索如何揉合BDD与DDD.围绕这个目标,我找到了Impact Mapping → Cucumber → Spock ...
- 如何用 Robotframework 来编写优秀的测试用例
介绍 这篇文档将会是一篇在「高层面」的怎么用 Robotframework 来编写优秀测试用例的原则.至于如何使用 Robotframework 来与您的待测试系统相作用这样的细节讨论是不包含在这篇文 ...
- 怎么用C#获取Scenario step在specflow里
公司最近在用specflow 这种BDD的模式,但PM还是想把case再存进TestManager里面一份儿一遍后期集成TestManager 自动runcase用.所以我们需要获取每个scenari ...
- Testlink1.9.17使用方法(第五章 测试用例管理)
第五章 测试用例管理 QQ交流群:585499566 TestLink支持的测试用例的管理包含二层:分别为新建测试用例集(Test Suites).创建测试用例(Test Cases).可以把测试用例 ...
- Spring 官方教程:使用 Restdocs 创建 API 文档
https://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247483998&idx=1&sn=6ae5fa795d36b1 ...
- postman系列之批量执行接口测试用例
postman如何批量执行接口测试用例~其实很简单,但是会给我们的工作带来很多方便~ 比如我们写了几十个测试用例,请求都是同一个服务器IP,一旦服务器IP地址从测试环境搬到线上环境,需要修改所有的服务 ...
- ReadyAPI创建功能测试的方法
声明:如果你想转载,请标明本篇博客的链接,请多多尊重原创,谢谢! 本篇使用的 ReadyAPI版本是2.5.0 在ReadyAPI中有多种方法可以创建功能测试,本篇将分步操作创建功能测试. 1.从So ...
- 行为驱动开发BDD概要
BDD脱胎于TDD 行为驱动开发(Behavior-Driven Development,简称BDD),是在测试驱动开发(Test-Driven Development,TDD)基础上发展而来的一种软 ...
随机推荐
- numpy---(上)
Numpy Numpy ndarray N维数组对象ndarray, 是一系列同类型数据的集合, 索引以0下标开始, 创建一个ndarray对象, 需调用array函数: numpy.array(ob ...
- BI系统打包Docker镜像及容器化部署的具体实现
在过去的几年中,"云"作为明星热词站在了各种新潮技术之中,你可能使用过,但说不清它的原理:或者是没用过,但听过它的大名:也可能连它的名字都没听过,但你对这只蓝色鲸鱼一定十分眼熟.作 ...
- 3道常见的vue面试题,你都会了吗?
最近流传各大厂纷纷裁员,导致很多人"被迫"毕业,显然很多人还是想留级,无奈出现在名单中,只能感叹命运不公,不过拿了N+1,也算是很欣慰. 又得去面试了,接下来一起来巩固下vue的3 ...
- 介绍一款倍受欢迎的.NET 开源UI库
概述 今天要带大家了解的是一款WPF的开源控件库MahApps.Metro.MahApps.Metro是用于创建现代WPF应用程序的工具包,它许多开箱即用的好东西. 目前支持的NET Framewor ...
- 小米手环解锁MacOS系统笔记本MacBookPro
通过小米手环解锁笔记本 官方windows是提供了方法的. 我目前用的MacBookPro,所以说下苹果笔记本的解锁方式. 安装软件BLEUnlock 库 安装方式: brew 安装 brew ins ...
- python中的嵌套
嵌套:将一系列字典存储在列表中,或将列表作为值存储在字典中,这称为嵌套.既可以在列表中嵌套字典,也可以在字典中嵌套列表,甚至在字典中嵌套字典. 一.列表中嵌套字典 1)一般创建方式: student_ ...
- OpenHarmony 3.1 Beta版本关键特性解析——OpenHarmony图形框架
(以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点) 李煜 华为技术有限公司 崔坤华为技术有限公司 众所周知,动画是系统和应用与用户交互的重要环节.动画效果的好坏会直接影响 ...
- flex 布局 自己做的demo
.row {/*横*/ display: -webkit-box;// display: -webkit-flex; /* Safari */ display: -moz-box; display: ...
- 接口测试 Mock 实战(二) | 结合 jq 完成批量化的手工 Mock
因为本章的内容是使用jq工具配合完成,因此在开始部分会先花一定的篇幅介绍jq机器使用,如果读者已经熟悉jq,可以直接跳过这部分.先来看应用场景,App 经常会有一些信息展示的列表页,比如商家的菜品.股 ...
- 简单了解 TiDB 架构
一.前言 大家如果看过我之前发过的文章就知道,我写过很多篇关于 MySQL 的文章,从我的 Github 汇总仓库 中可以看出来: 可能还不是很全,算是对 MySQL 有一个浅显但较为全面的理解.之前 ...