C#?使用SpecFlow創(chuàng)建BDD測(cè)試用例的示例代碼
將自然語(yǔ)言編寫(xiě)的測(cè)試用例轉(zhuǎn)換為可執(zhí)行的測(cè)試,可以大大降低需求與開(kāi)發(fā)之間的溝通成本,這是BDD(行為驅(qū)動(dòng)開(kāi)發(fā))希望達(dá)到的效果。SpecFlow是.Net平臺(tái)的BDD工具,可以幫助我們創(chuàng)建面向BDD的測(cè)試用例。
首先,在Visual Studio 2022中安裝SpecFlow插件。選擇菜單擴(kuò)展->管理擴(kuò)展,然后搜索SpecFlow:

點(diǎn)擊下載,下載完成后,需要退出Visual Studio 2022,插件會(huì)自動(dòng)安裝。
我們編寫(xiě)一個(gè)簡(jiǎn)單的計(jì)算BMI(Body Mass Index身體質(zhì)量指數(shù))的功能作為測(cè)試目標(biāo),算法很簡(jiǎn)單,輸入是身高和體重,計(jì)算公式是體重除以身高的平方。
再次啟動(dòng)Visual Studio,創(chuàng)建一個(gè)類(lèi)庫(kù)項(xiàng)目,名稱為CalBmi,編寫(xiě)代碼如下:
namespace CalBmi
{
public class BmiCalculator
{
public Decimal Height { get; set; }
public Decimal Weight { get; set; }
public Decimal Bmi()
{
throw new NotImplementedException();
}
}
}
接下來(lái),在解決方案中添加SpecFlow項(xiàng)目,選擇項(xiàng)目類(lèi)型為SpecFlow:

項(xiàng)目名稱為T(mén)estBmi,選擇xUnit作為T(mén)est Framework:

創(chuàng)建完成后,項(xiàng)目的結(jié)構(gòu)是這樣的:

然后,添加項(xiàng)目引用,將測(cè)試目標(biāo)項(xiàng)目CalBmi添加到TestBmi的項(xiàng)目引用中:

到這里,準(zhǔn)備工作完成,現(xiàn)在可以開(kāi)始寫(xiě)測(cè)試用例了。在TestBmi中有一個(gè)示例模板,

代碼是這樣的:
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
這個(gè)測(cè)試的是兩個(gè)數(shù)字相加,我們照貓畫(huà)虎,編寫(xiě)我們自己的測(cè)試用例,我們添加一個(gè)新的SpecFlow feature:

編寫(xiě)代碼如下:
Feature: 計(jì)算BMI @mytag Scenario: 根據(jù)身高體重計(jì)算BMI Given 身高1.75米 And 體重70.00公斤 When 計(jì)算BMI Then 結(jié)果應(yīng)該是22.86
點(diǎn)擊右鍵,選擇DefineSteps:

一個(gè)新的測(cè)試文件被創(chuàng)建了:

代碼如下:
using System;
using TechTalk.SpecFlow;
namespace TestBmi.StepDefinitions
{
[Binding]
public class 計(jì)算BMIStepDefinitions
{
[Given(@"身高(.*)米")]
public void Given身高米(Decimal p0)
{
throw new PendingStepException();
}
[Given(@"體重(.*)公斤")]
public void Given體重公斤(Decimal p0)
{
throw new PendingStepException();
}
[When(@"計(jì)算BMI")]
public void When計(jì)算BMI()
{
throw new PendingStepException();
}
[Then(@"結(jié)果應(yīng)該是(.*)")]
public void Then結(jié)果應(yīng)該是(Decimal p0)
{
throw new PendingStepException();
}
}
}
在這個(gè)類(lèi)中,編寫(xiě)測(cè)試,首先創(chuàng)建BmiCalculator的實(shí)例:
private readonly BmiCalculator _bmical = new BmiCalculator();
然后,改寫(xiě)各個(gè)方法:
using CalBmi;
using System;
using TechTalk.SpecFlow;
namespace TestBmi.StepDefinitions
{
[Binding]
public class 計(jì)算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(@"計(jì)算BMI")]
public void When計(jì)算BMI()
{
_result=_bmical.Bmi();
}
[Then(@"結(jié)果應(yīng)該是(.*)")]
public void Then結(jié)果應(yīng)該是(Decimal result)
{
_result.Should().Be(result);
}
}
}
在測(cè)試管理器中運(yùn)行這個(gè)測(cè)試:

與想象的一樣,測(cè)試沒(méi)有通過(guò),因?yàn)槲覀儧](méi)有編寫(xiě)實(shí)現(xiàn)代碼,現(xiàn)在,修改BmiCalculator ,增加計(jì)算方法:
namespace CalBmi
{
public class BmiCalculator
{
public Decimal Height { get; set; }
public Decimal Weight { get; set; }
public Decimal Bmi()
{
return Weight/Height/Height;
}
}
}
再次運(yùn)行測(cè)試:

仍然沒(méi)有通過(guò),問(wèn)題是需要保留兩位小數(shù),最后一位四舍五入,修改算法:
public Decimal Bmi()
{
return System.Decimal.Round(Weight /Height/Height,2);
}
再次運(yùn)行測(cè)試,這次通過(guò)了:

在測(cè)試中給出了測(cè)試步驟和每個(gè)步驟花費(fèi)的時(shí)間。
到此這篇關(guān)于C# 使用SpecFlow創(chuàng)建BDD測(cè)試用例的文章就介紹到這了,更多相關(guān)C# SpecFlow BDD測(cè)試用例內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解WPF如何使用WriteableBitmap提升Image性能
這篇文章主要為大家詳細(xì)介紹了WPF如何使用WriteableBitmap提升Image性能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01
C#實(shí)現(xiàn)Winform小數(shù)字鍵盤(pán)模擬器
本文主要介紹了C#實(shí)現(xiàn)Winform小數(shù)字鍵盤(pán)模擬器,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
C#使用RestSharp實(shí)現(xiàn)封裝常用的http請(qǐng)求方法
這篇文章主要為大家詳細(xì)介紹了C#如何使用RestSharp實(shí)現(xiàn)封裝常用的http請(qǐng)求方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2024-02-02
c#項(xiàng)目實(shí)現(xiàn)發(fā)布到服務(wù)器全過(guò)程
這篇文章主要介紹了c#項(xiàng)目實(shí)現(xiàn)發(fā)布到服務(wù)器全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04

