Mis*_*pic 4 c# bdd automated-tests unit-testing
基于对 BDD 的一些轻松阅读,我得出的结论是,单元测试是测试应用程序某些细粒度部分的好工具,而 BDD 是更高级别的,您可以在其中执行功能工作流。
我会考虑用于单元测试的一些项目:排序算法、状态缩减器、几何计算等......
我认为适合 BDD 的项目将是功能工作流:将项目添加到购物车、登录、搜索网站内容以查找课程资料等......
客户要求我编写排序算法,通常我会编写一个单元测试,例如:
public class SorterTest
{
[TestMethod]
public void TestSort()
{
var numbers = new List<int>() { 9, 8, 7, 6, 5, 4, 3, 2, 1 };
var expected = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var sorter = new Sorter()
{
Input = numbers
};
var sorted = sorter.Sort();
CollectionAssert.AreEqual(expected, sorted.ToList());
}
}
Run Code Online (Sandbox Code Playgroud)
然而,客户要求进行 BDD 测试,所以我想出了以下内容:
Feature: Sort
In order to to ensure sorting of integers
I want to be able to sort a collection of integers
Scenario Outline: Perform a sort
Given I have these integers: '<input>'
When I sort them
Then the result should be '<expected>'
Examples:
| input | expected |
| 9,8,7,6,5,4,3,2,1 | 1,2,3,4,5,6,7,8,9 |
Run Code Online (Sandbox Code Playgroud)
为了使我的Sorter对象可用于 BDD 测试,我必须对其进行更改:
private Sorter sorter = new Sorter();
[Given(@"^I have the following integers: '(.*)'$")]
public void GivenIHaveTheFollowingIntegers(string numbers)
{
var inputs = numbers.Split(',')
.Select(s => Convert.ToInt32(s.Trim()))
.ToList();
sorter.Input = inputs;
}
Run Code Online (Sandbox Code Playgroud)
使用 设置测试的注意事项Given,我必须添加一个Input属性来为Sortertp 准备排序。缺点是在应用程序代码中,如果我希望我的排序器执行排序,我将始终需要在执行排序之前设置此属性:
sorter.Input = intCollection;
var result = sorter.sort();
Run Code Online (Sandbox Code Playgroud)
我宁愿只有:
var result = sorter.sort(intCollection);
Run Code Online (Sandbox Code Playgroud)
BDD 适合这种测试吗?如果是这样,我做得对吗?添加Input属性感觉不对,我应该以其他方式做吗?
如果不合适,如何在 BDD 和单元测试之间划清界限?有一个现有的 SO post,但答案参考了一本书。得到一些更好的指导会很好。
在两种风格之间进行选择
在单元测试 (TDD) 方法和 BDD 方法之间进行选择归结为偏好。如果客户要求 BDD,请提供 BDD。如果团队更喜欢 TDD,请使用 TDD。
混合两种方法
选择不是排他性的。我有混合两种方法的经验。要回答如何在两种方法之间划清界限的问题,敏捷测试象限非常有用:
画一条线
我发现单元测试 (TDD) 方法对面向测试的技术更有帮助。BDD 方法对面临测试的业务更有帮助。
有关此观察的详细信息
将业务需求映射到 BDD 样式测试更为自然。为了测试具有某种触觉业务价值的业务需求,通常需要集成多个类。根据我的经验,那些 BDD 风格的测试通常是集成测试,具有功能测试和用户验收测试的特征。
另一方面,TDD 测试是由程序员为程序员编写的。许多程序员对单元测试 (TDD) 方法更熟悉或有更多经验。这些测试通常单独测试类,并强调系统的边缘情况和技术方面。
您提供的示例是一个例外,因为它在单个类中映射了一个业务案例。在这种情况下,两种方法都可以。
| 归档时间: |
|
| 查看次数: |
2529 次 |
| 最近记录: |