前言
上次,我们介绍了行为驱动开发(BDD)
它的优点是可以使用纯文本编写测试用例,不需要编程经验。
如果测试用例也全部是程序员写的情况,这种方式反而存在障碍,feature使用与编写代码的语言完全不同的语言来编写,维护测试需要在feature和step代码间来回切换。
LightBDD
LightBDD是轻量级的行为驱动开发框架。
它提供了一种替代方案,你可以直接在C#代码中编写BDD风格的测试,以便开发人员可以使用IDE以简单自然的方式维护测试。
我们以SpecFlow官方的计算器示例为例,演示使用LightBDD如何实现。
1. 创建Calculator项目
假设,我们需要实现加法功能。
创建一个类库,编写如下代码:
public class Calculator
{public int FirstNumber { get; set; }public int SecondNumber { get; set; }public int Add(){return FirstNumber + SecondNumber;}
}
2. 创建XUnit测试项目
添加XUnit测试项目,引用nuget包LightBDD.XUnit2
。
然后创建partial类,以便将feature和step代码分开,这样更好管理和阅读:
[FeatureDescription("第一个feature")]
public partial class UnitTest1 : FeatureFixture
{//放置场景代码
}public partial class UnitTest1
{//放置步骤代码
}
3. 编写场景代码
现在编写我们第一个场景,使用SpecFlow是这样的:
我们用LightBDD可以这样写:
[Scenario]
public void Adding_two_numbers_should_return_total()
{Runner.RunScenario(_ => Given_the_first_number_is(50),_ => And_the_second_number_is(70),_ => When_the_two_numbers_are_added(),_ => Then_the_result_should_be(120));
}
4. 编写step代码
可以看到,场景全部用C#代码,因此从场景定义中自动生成方法变得非常容易。
填充后的step代码如下:
public partial class UnitTest1
{private readonly Calculator _calculator = new Calculator();private int _result;private void Given_the_first_number_is(int number){_calculator.FirstNumber = number;}private void And_the_second_number_is(int number){_calculator.SecondNumber = number;}private void When_the_two_numbers_are_added(){_result = _calculator.Add();}private void Then_the_result_should_be(int number){Assert.Equal(number, _result);}
}
5. 运行测试
最后,运行测试:
而且,如果你打开bin\Debug\net5.0\Reports文件夹,可以找到一个HTML报告,更加清晰地反映测试质量:
结论
我们都知道,好的测试可以带来更好、错误更少的程序,实现更快的开发。
但是编写出有效的测试不是一件容易的事!
LightBDD提供了一个方便的解决方案,使你的测试场景清晰,编写起来更加轻松!
如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“,记住我!