gpt4 book ai didi

c# - 何时使用单元测试与 BDD 测试

转载 作者:太空宇宙 更新时间:2023-11-03 19:47:45 25 4
gpt4 key购买 nike

基于对 BDD 的一些简单阅读,我得出结论,单元测试是测试应用程序某些细粒度部分的好工具,而 BDD 是更高级别的工具,您可以在其中练习功能工作流。

我会考虑进行单元测试的一些项目:排序算法、状态缩减器、几何计算等......

我认为 BDD 候选人的项目将是功能工作流程:将项目添加到购物车、登录、搜索站点内容以查找类(class) Material 等...

我被客户要求写一个排序算法,通常我会写一个单元测试,比如:

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());
}
}

但是,客户要求进行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 |

为了使我的 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;
}

注意使用 Given 设置测试,我必须将 Input 属性添加到 Sorter tp 准备排序。缺点是在应用程序代码中,如果我希望我的排序器执行排序,我将始终需要在执行排序之前设置此属性:

sorter.Input = intCollection;
var result = sorter.sort();

我宁愿只拥有:

var result = sorter.sort(intCollection);

BDD 适合这种测试吗?如果是这样,我这样做对吗?添加 Input 属性感觉不对,我应该用其他方式来做吗?

如果不合适,如何在 BDD 和单元测试之间划清界线?有一个 existing SO post ,但答案引用了一本书。如果能得到更好的指导就好了。

最佳答案

在两种风格之间进行选择

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

混合两种方法

选择不是唯一的。我有混合使用这两种方法的经验。要回答在这两种方法之间划清界限的问题,Agile Testing Quadrants很有帮助:

Agile Testing Quadrants Picture

画一条线

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

有关此观察的详细信息

将业务需求映射到 BDD 样式测试更为自然。要测试具有一定商业值(value)的业务需求,通常需要集成多个类。根据我的经验,那些 BDD 风格的测试通常是集成测试,并且具有功能测试用户验收测试 的特征。

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

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

关于c# - 何时使用单元测试与 BDD 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43232793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com