Feature文件已经写好了,Scenario下的Step的Definition也已经完成,但是注意到在ArithmeticFeatureStepDefinition.cs文件中Step的代码并没有做实际的事情,就是说该Step对应的函数并没有依照Step的文字描述信息做对应的事情。
现在,我们就开始做这件事。既然是要测试四则运算,我们得提供一个能四则运算的程序。这里我们用一个简单的类来实现该功能:
什么东西能做四则运算?很容易想到计算器。写一个如下的简单计算器类Calculator用于测试。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SpecflowSample.UnderTest { class Calculator { private List<double> numbers = new List<double>(); public double Result { get; private set; } public void EnterNumber(double number) { if (numbers.Count == 2) { numbers.RemoveAt(0); } numbers.Add(number); } public void Operate(string operatorType) { switch (operatorType) { case "add": Result = numbers.Sum(); break; case "subtract": Result = numbers[0] - numbers[1]; break; case "mutiply": Result = numbers[0] * numbers[1]; break; case "divide": Result = numbers[0] / numbers[1]; break; } } } }
我们将为StepDefinition填充要执行的代码:
using SpecflowSample.UnderTest; using System; using System.Collections.Generic; using System.Linq; using System.Text; using TechTalk.SpecFlow; namespace SpecflowSample.StepDefinitions { [Binding] public sealed class ArithmeticFeatureStepDefinition { private Calculator calculator = new Calculator(); [Given("I have entered (.*) into the calculator")] public void GivenIHaveEnteredSomethingIntoTheCalculator(int number) { calculator.EnterNumber(number); } [When("I press add")] public void WhenIPressAdd() { calculator.Operate("add"); } [Then("the result should be (.*) on the screen")] public void ThenTheResultShouldBe(int result) { Assert.AreEqual(result, calculator.Result); } } }
这样,每个StepDefinition就按照Step语句的描述信息做了对应的事情。但是,我们的Feature还不能运行。
其实,Specflow将我们的StepDefinition最终翻译成了对应的某个测试框架的代码(即一个个的testcase),可以展开feature.cs文件查看
而Specflow使用的默认测试框架是Nunit,而我们创建的项目使用Mstest。通过修改配置文件app.config添加<unitTestProvider name="mstest">结点来更换。
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="specFlow" type="TechTalk.SpecFlow.Configuration.ConfigurationSectionHandler, TechTalk.SpecFlow" /> </configSections> <specFlow> <unitTestProvider name="mstest"/> <!-- For additional details on SpecFlow configuration options see http://go.specflow.org/doc-config --> </specFlow> </configuration>
现在我们重新生成项目,就可以调试case了。
打开测试资源管理器,就可以看到我们添加的两个Scenario对应的test case了
在第一条case AddTwoNumbers 上右击运行选定的测试,即可运行该条case