何时使用单元测试与 BDD 测试

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,但答案参考了一本书。得到一些更好的指导会很好。

The*_*rff 9

在两种风格之间进行选择

在单元测试 (TDD) 方法和 BDD 方法之间进行选择归结为偏好。如果客户要求 BDD,请提供 BDD。如果团队更喜欢 TDD,请使用 TDD。

混合两种方法

选择不是排他性的。我有混合两种方法的经验。要回答如何在两种方法之间划清界限的问题,敏捷测试象限非常有用:

敏捷测试象限图片

画一条线

我发现单元测试 (TDD) 方法对面向测试技术更有帮助。BDD 方法对面临测试业务更有帮助。

有关此观察的详细信息

将业务需求映射到 BDD 样式测试更为自然。为了测试具有某种触觉业务价值的业务需求,通常需要集成多个类。根据我的经验,那些 BDD 风格的测试通常是集成测试,具有功能测试用户验收测试的特征

另一方面,TDD 测试是由程序员为程序员编写的。许多程序员对单元测试 (TDD) 方法更熟悉或有更多经验。这些测试通常单独测试类并强调系统的边缘情况和技术方面。

您提供的示例是一个例外,因为它在单个类中映射了一个业务案例。在这种情况下,两种方法都可以。