Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 何时使用单元测试与BDD测试_C#_Unit Testing_Automated Tests_Bdd - Fatal编程技术网

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

C# 何时使用单元测试与BDD测试,c#,unit-testing,automated-tests,bdd,C#,Unit Testing,Automated Tests,Bdd,基于对BDD的一些浅显阅读,我得出结论,单元测试是测试应用程序某些细粒度部分的好工具,而BDD是更高级别的,您可以在其中执行功能工作流 有些项目我会考虑单元测试的候选:排序算法、状态约简、几何计算等等… 项目,我认为BDD的候选将是特征工作流:添加一个项目到一个购物车,登录,搜索一个网站的内容,找到课程材料,等等。 客户要求我编写一个排序算法,通常我会编写一个单元测试,如: public class SorterTest { [TestMethod] public void Te

基于对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());
    }
}
注意:为了使用给定的
设置测试,我必须向
分拣机
添加
输入
属性以准备分拣。缺点是,在应用程序代码中,如果我希望我的分拣机执行分拣,我将始终需要在执行分拣之前设置此属性:

sorter.Input = intCollection;
var result = sorter.sort();
我宁愿只吃:

var result = sorter.sort(intCollection);
BDD是否适用于此类测试?如果是,我做得对吗?添加
Input
属性感觉不对,我应该用其他方法吗


如果不合适,如何在BDD和单元测试之间划清界限?有一个答案,但答案参考一本书。如果能得到更好的指导,那就太好了。

我会写一个单元测试

你提到

有些项目我会考虑单元测试的候选:排序算法、状态约简、几何计算等等…

项目,我认为BDD的候选将是特征工作流:添加一个项目到一个购物车,登录,搜索一个网站的内容,找到课程材料,等等。

我同意这一点。行为驱动测试擅长快速“指定”,确保应用程序正常运行,并完成它应该做的事情。你可以接受这个定义,并说你正在确保你的排序工作,但关键(IMO)是你不是在测试你的程序如何工作,而是测试一个算法如何工作,这是程序的一个非常具体的元素。如果你看一下你是如何构建测试的,你会发现你在试图模仿一个单元测试:你抛出一堆输入,然后与你试图得到的输出进行比较

BDD测试的目的是测试功能,如场景。例如,如果您有一个从文件中组织电话号码的程序,排序将是该过程的一部分,但您不包括“排序”本身,而是测试程序的一般行为(如果您通过执行应用程序获得预期的文件)。设置测试,执行测试,验证结果


您还应该在编写代码之前编写测试,我同意@Theo Lenndoff的观点,将输入作为属性是很奇怪的,而且非常违反直觉。(你也提到了。)

在两种风格之间进行选择

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

混合两种方法

选择不是唯一的。我有混合这两种方法的经验。要回答在这两种方法之间划清界限的问题,以下方法非常有用:

画一条线

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

有关此观察的详细信息

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

另一方面,TDD测试是由程序员为程序员编写的。许多程序员对单元测试(TDD)方法比较熟悉或有更多的经验。这些测试通常对类进行隔离测试,重点放在边缘情况和系统的技术方面


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

首先,我的经验是,在测试单元时,BDD思维有时会很有帮助

第二,我认为“给定”关键字被误用了。您是否可以要求您的客户将其场景改写为:

Scenario Outline: Perform a sort
When I sort these integers: '<input>'
Then the result should be '<expected>'
场景大纲:执行排序
当我对这些整数排序时:“”
那么结果应该是“”
我发现正确使用Given是为了测试系统中必须存在的对象。在您的示例中,它被用于存在于用户头脑中的某些东西:在代码中实现它注定是不自然的


第三,如果我必须实现“Given”子句,我会将整数列表存储在测试环境中,而不是试图立即将它们插入到应用程序中。然后,“何时”步骤可以从测试环境中检索它们,并在代码需要它们的地方使用它们。

将输入作为属性。这种设计有什么特别的原因吗?我宁愿提供输入作为Sort方法的参数。@Thelendorff这是我文章的关键所在-我必须添加一个
Input
属性来设置
给定的
中的测试。我同意这感觉很尴尬,但我不知道我该如何设置BDD测试。简言之:应用程序级别的行为测试,组件级别的单元测试。您通常不会为排序方法编写行为测试;您可以编写行为测试,例如为UI功能编写行为测试,它可以跨整个应用程序堆栈进行测试(或者至少测试到某个定义良好的边界)。@Mister Epic:明白。我瘦了
var result = sorter.sort(intCollection);
Scenario Outline: Perform a sort
When I sort these integers: '<input>'
Then the result should be '<expected>'