C# 使用SpecFlow创建BDD测试用例的示例代码

作者:寻找无名的特质 时间:2021-05-25 21:35:00 

将自然语言编写的测试用例转换为可执行的测试,可以大大降低需求与开发之间的沟通成本,这是BDD(行为驱动开发)希望达到的效果。SpecFlow是.Net平台的BDD工具,可以帮助我们创建面向BDD的测试用例。

首先,在Visual Studio 2022中安装SpecFlow插件。选择菜单扩展->管理扩展,然后搜索SpecFlow:

C# 使用SpecFlow创建BDD测试用例的示例代码

点击下载,下载完成后,需要退出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:

C# 使用SpecFlow创建BDD测试用例的示例代码

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

C# 使用SpecFlow创建BDD测试用例的示例代码

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

C# 使用SpecFlow创建BDD测试用例的示例代码

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

C# 使用SpecFlow创建BDD测试用例的示例代码

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

C# 使用SpecFlow创建BDD测试用例的示例代码

代码是这样的:

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:

C# 使用SpecFlow创建BDD测试用例的示例代码

编写代码如下:

Feature: 计算BMI

@mytag
Scenario: 根据身高体重计算BMI
Given 身高1.75米
And 体重70.00公斤
When 计算BMI
Then 结果应该是22.86

点击右键,选择DefineSteps:

C# 使用SpecFlow创建BDD测试用例的示例代码

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

C# 使用SpecFlow创建BDD测试用例的示例代码

代码如下:

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);
       }
   }
}

在测试管理器中运行这个测试:

C# 使用SpecFlow创建BDD测试用例的示例代码

与想象的一样,测试没有通过,因为我们没有编写实现代码,现在,修改BmiCalculator ,增加计算方法:

namespace CalBmi
{
   public class BmiCalculator
   {
       public Decimal Height { get; set; }

public Decimal Weight { get; set; }

public Decimal Bmi()
       {
           return Weight/Height/Height;
       }
   }
}

再次运行测试:

C# 使用SpecFlow创建BDD测试用例的示例代码

仍然没有通过,问题是需要保留两位小数,最后一位四舍五入,修改算法:

public Decimal Bmi()
       {
           return System.Decimal.Round(Weight /Height/Height,2);
       }

再次运行测试,这次通过了:

C# 使用SpecFlow创建BDD测试用例的示例代码

在测试中给出了测试步骤和每个步骤花费的时间。

来源:https://www.cnblogs.com/zhenl/p/16380928.html

标签:C#,SpecFlow,BDD,测试用例
0
投稿

猜你喜欢

  • C#中try...catch的使用与常见面试题分享

    2022-10-22 16:30:35
  • java http token请求代码实例

    2022-09-28 18:23:19
  • java读取properties配置文件的方法

    2022-02-13 17:15:44
  • C#通过反射创建自定义泛型

    2022-12-30 07:12:38
  • 解决mybatis plus 驼峰式命名规则问题

    2022-09-29 11:24:34
  • java多线程复制文件的实例代码

    2022-03-04 04:29:54
  • OpenCV画任意圆弧曲线

    2023-06-22 19:28:44
  • JDK8并行流及串行流区别原理详解

    2023-06-25 16:23:39
  • 详解Kotlin:forEach也能break和continue

    2022-05-03 01:24:10
  • mybatis使用pagehelper插件过程详解

    2023-02-16 18:11:11
  • c#多线程中Lock()关键字的用法小结

    2022-07-08 04:33:27
  • c# 使用计时器和观察者模式实现报警推送需求

    2022-05-24 02:16:46
  • java控制台输出百分比进度条示例

    2023-08-21 22:58:20
  • springboot做代理分发服务+代理鉴权的实现过程

    2021-06-28 03:22:14
  • java 中的instanceof用法详解及instanceof是什么意思(推荐)

    2023-06-07 13:52:27
  • 前端如何调用后端接口进行数据交互详解(axios和SpringBoot)

    2023-10-17 02:48:43
  • 深入理解java中Arrays.sort()的用法

    2021-05-26 22:25:58
  • Android使用PhotoView实现图片双击放大单击退出效果

    2022-10-10 04:52:11
  • C# 调用API函数弹出映射网络驱动器对话框问题

    2023-03-25 15:41:05
  • Jackson 反序列化时实现大小写不敏感设置

    2021-11-18 06:17:18
  • asp之家 软件编程 m.aspxhome.com