将自然语言编写的测试用例转换为可执行的测试,可以大大降低需求与开发之间的沟通成本,这是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
![Calculator](https://specflow.org/wp-content/uploads/2020/09/calculator.png)
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测试用例的更多相关文章

  1. Robot Framework(三)创建测试用例

    2.2.1测试用例语法 基本语法 测试用例由关键字在测试用例表中构建.关键字可以从测试库或资源文件导入,也可以在测试用例文件本身的关键字表中创建. 测试用例表中的第一列包含测试用例名称.测试用例从包含 ...

  2. BDD测试框架Spock概要

    前言 为了找到一个适合自己的.更具操作性的.以DDD为核心的开发方法,我最近一直在摸索如何揉合BDD与DDD.围绕这个目标,我找到了Impact Mapping → Cucumber → Spock ...

  3. 如何用 Robotframework 来编写优秀的测试用例

    介绍 这篇文档将会是一篇在「高层面」的怎么用 Robotframework 来编写优秀测试用例的原则.至于如何使用 Robotframework 来与您的待测试系统相作用这样的细节讨论是不包含在这篇文 ...

  4. 怎么用C#获取Scenario step在specflow里

    公司最近在用specflow 这种BDD的模式,但PM还是想把case再存进TestManager里面一份儿一遍后期集成TestManager 自动runcase用.所以我们需要获取每个scenari ...

  5. Testlink1.9.17使用方法(第五章 测试用例管理)

    第五章 测试用例管理 QQ交流群:585499566 TestLink支持的测试用例的管理包含二层:分别为新建测试用例集(Test Suites).创建测试用例(Test Cases).可以把测试用例 ...

  6. Spring 官方教程:使用 Restdocs 创建 API 文档

    https://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247483998&idx=1&sn=6ae5fa795d36b1 ...

  7. postman系列之批量执行接口测试用例

    postman如何批量执行接口测试用例~其实很简单,但是会给我们的工作带来很多方便~ 比如我们写了几十个测试用例,请求都是同一个服务器IP,一旦服务器IP地址从测试环境搬到线上环境,需要修改所有的服务 ...

  8. ReadyAPI创建功能测试的方法

    声明:如果你想转载,请标明本篇博客的链接,请多多尊重原创,谢谢! 本篇使用的 ReadyAPI版本是2.5.0 在ReadyAPI中有多种方法可以创建功能测试,本篇将分步操作创建功能测试. 1.从So ...

  9. 行为驱动开发BDD概要

    BDD脱胎于TDD 行为驱动开发(Behavior-Driven Development,简称BDD),是在测试驱动开发(Test-Driven Development,TDD)基础上发展而来的一种软 ...

随机推荐

  1. 从数据库中获取图片编号,然后通过request获取图片下载

    import pandas as pd from pandas.core.dtypes.dtypes import register_extension_dtype from sqlalchemy i ...

  2. 解决帝国CMS搜索页面模板不支持灵动标签和万能标签的方法

    1,打开 /e/search/result/index.php 文件 查找 require("../../class/connect.php"); require(".. ...

  3. STL空间分配器源码分析(一)

    一.摘要 STL的空间分配器(allocator)定义于命名空间std内,主要为STL容器提供内存的分配和释放.对象的构造和析构的统一管理.空间分配器的实现细节,对于容器来说完全透明,容器不需关注内存 ...

  4. 好用的表单验证工具 vuelidate

    Vue validation(表单验证)--vuelidate 表单是用户那里收集的数据的工具.如果它没有收集到你需要的数据,或者收集到的数据不对,那么你的表单就没有达到它的目的.这就是为什么我们需要 ...

  5. 2021.08.05 P5357 康托展开模板(康托展开)

    2021.08.05 P5357 康托展开模板(康托展开) P5367 [模板]康托展开 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.康托展开 算法学习笔记(56): ...

  6. python基础练习题(题目 将一个整数分解质因数。例如:输入90,打印出90=2*3*3*5)

    day9 --------------------------------------------------------------- 实例014:分解质因数 题目 将一个整数分解质因数.例如:输入 ...

  7. 前后端分离后台管理系统 Gfast v3.0 全新发布

    GFast V3.0 平台简介 基于全新Go Frame 2.0+Vue3+Element Plus开发的全栈前后端分离的管理系统 前端采用vue-next-admin .Vue.Element UI ...

  8. linux在图形界面一登录就自动闪退

    今天一登录linux图形界面就自动退出了,又退到了登录界面了,密码是正确的. 解决方法如下: 1. 先按 Ctrl + Alt + F1,进入 命令行模式. 2. 在命令行里,输入用户名密码正常登录. ...

  9. 将Excel数据转换为Java可识别时间(Date、Timestamp)

    引言 Excel的时间,POI读取到的是double,这个值不是timestamp.需要进行一些转换,将它转换为Date或者Timestamp. Excel中的日期数据: 程序中读取到的数据: 如何转 ...

  10. python appium server代码启动和关闭遇到的坑

    第一次使用博客,小白级,互相交流,有说的不对的地方欢迎来喷!!! 自动化的目的就是减少人工成本,如果每次跑自动化用例时都要手动起appium客户端,太费事了~~故,将appium server的调起和 ...