Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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
Unit testing 编写不首先失败的测试_Unit Testing_Tdd - Fatal编程技术网

Unit testing 编写不首先失败的测试

Unit testing 编写不首先失败的测试,unit-testing,tdd,Unit Testing,Tdd,TDD最佳实践表明,新的测试应该失败。然而,我认为测试可能是必要的,尽管它在刚编写时并没有失败 工作流示例: 编写测试,检查结束日期是否早于开始日期-测试失败 编写代码-测试通过 bool验证(条件) { if(条件.EndDate条件.StartDate); } 在第3步之后,我发现如果我没有重构条件,我可以添加一个新的测试,如果开始日期早于结束日期,该测试将检查该方法是否返回true。然而,如果我先进行重构,编写这样的测试就意味着它会立即通过。在我看来,测试可能会使代码更加健壮 根据TDD

TDD最佳实践表明,新的测试应该失败。然而,我认为测试可能是必要的,尽管它在刚编写时并没有失败

工作流示例:

  • 编写测试,检查结束日期是否早于开始日期-测试失败
  • 编写代码-测试通过
    bool验证(条件)
    {
    if(条件.EndDate条件.StartDate);
    }
    
    在第3步之后,我发现如果我没有重构条件,我可以添加一个新的测试,如果开始日期早于结束日期,该测试将检查该方法是否返回true。然而,如果我先进行重构,编写这样的测试就意味着它会立即通过。在我看来,测试可能会使代码更加健壮

    根据TDD,为什么写这样的测试是个坏主意/不是个好主意


    编辑:我现在在想,也许写
    返回true在实现中可能不是一个好主意,我应该抛出一个
    NotImplementedException
    。根据TDD编写代码是正确的方法吗?

    编写失败的测试的目的是使每一个测试都是值得的。这只是为了让您考虑您的测试和代码。如果您编写的测试一开始就失败了,然后只编写了足够的代码使测试通过,那么您就知道您编写的所有代码都是必要的,并为您的应用程序增加了价值

    例如,在上面的场景中,以最纯粹的形式使用TDD,如果您希望您的第一个测试测试方法是否返回true(如果一个日期在另一个日期之后),那么您可以将测试编写为断言true,并将方法设置为true

    bool Validate(Condition condition)
    {
        return true;
    }
    
    这将使你的第一次考试通过。然后,如果结束日期早于开始日期,您将编写另一个测试来断言该方法是否失败,这显然会失败。然后您将编写代码以通过测试,如下所示:

    bool Validate(Condition condition)
    {
        return (condition.EndDate > condition.StartDate);
    }
    

    这意味着您编写的每一段代码都是必需的,并且您知道它的行为完全符合您的要求。这还允许您将问题分解为多个步骤,并一次一个地处理每个阶段。据我所知,这就是TDD的全部内容。

    编写失败的测试的意义在于,每一个测试都是值得的。这只是为了让您考虑您的测试和代码。如果您编写的测试一开始就失败了,然后只编写了足够的代码使测试通过,那么您就知道您编写的所有代码都是必要的,并为您的应用程序增加了价值

    例如,在上面的场景中,以最纯粹的形式使用TDD,如果您希望您的第一个测试测试方法是否返回true(如果一个日期在另一个日期之后),那么您可以将测试编写为断言true,并将方法设置为true

    bool Validate(Condition condition)
    {
        return true;
    }
    
    这将使你的第一次考试通过。然后,如果结束日期早于开始日期,您将编写另一个测试来断言该方法是否失败,这显然会失败。然后您将编写代码以通过测试,如下所示:

    bool Validate(Condition condition)
    {
        return (condition.EndDate > condition.StartDate);
    }
    

    这意味着您编写的每一段代码都是必需的,并且您知道它的行为完全符合您的要求。这还允许您将问题分解为多个步骤,并一次一个地处理每个阶段。据我所知,这就是TDD的全部内容。

    红/绿/重构的概念是,当您编写测试时,它不应该通过,因为功能还不存在。正是测试的需求引导您编写合格的实现

    你看到的是一个非常简单的案例。一个有经验的TDD实践者可能会关注这个问题并跳过测试执行步骤,直到编写代码之后,从而节省编译/测试周期的成本

    另一方面,可能需要进行更多的重构。一件事是名称:验证。验证什么?它有什么作用?它应该做多少?重命名它,直到它说出它的作用。接下来,您将对该对象之外的对象进行日期比较。“条件”类是否有责任确保结束日期在开始日期之后?或者它真的是与条件的特定使用相关联的业务规则吗

    不要忘记更多的测试。你的要求是什么?起始日期可以为空吗?一项任务可以用不到一天的时间,所以结束日期和开始日期可以相同吗?但是如果你也在比较分和秒,这意味着它们实际上是日期时间,而不仅仅是日期,因此它们不应该被命名为StartDateTime/EndDateTime吗


    目标不仅仅是生产可工作的软件。目标是编写可读、易懂、清晰的软件。软件应作为自己的文档。TDD可以通过提出正确的问题来帮助您。

    红/绿/重构的概念是,当您编写测试时,它不应该通过,因为功能还不存在。正是测试的需求引导您编写合格的实现

    你看到的是一个非常简单的案例。一个有经验的TDD实践者可能会关注这个问题并跳过测试执行步骤,直到编写代码之后,从而节省编译/测试周期的成本

    另一方面,可能需要进行更多的重构。一件事是名称:验证。验证什么?它有什么作用?它应该做多少?重命名它,直到它说出它的作用。接下来,您将对该对象之外的对象进行日期比较。“条件”类是否有责任确保结束日期在开始日期之后?或者它真的是与条件的特定使用相关联的业务规则吗

    不要忘记更多的测试。你的要求是什么?起始日期可以为空吗?一项任务可以用不到一天的时间,所以结束日期和开始日期可以相同吗?但是如果你是比较一分钟