Unit testing 如何进行单元测试

Unit testing 如何进行单元测试,unit-testing,Unit Testing,我有一个方法CreateTask(UserId) 对于此方法,检查UserId是否符合null或空值和无效值就足够了 或者我应该检查是否为特定的用户ID创建了任务 我还应该检查创建的任务数量及其日期和时间吗?1)保持方法简短,这样单元测试就容易了(顺便说一句,这是鼓励良好设计的原因之一) 2) 检查所有边界条件(无效输入、琐碎输入等)(顺便说一句,简化的方法之一) 3) 检查所有可能的场景以实现高覆盖率(所有可能的执行都通过您的方法,通过最简单的输入来实现)(顺便说一句,这是有效的原因之一) 4

我有一个方法
CreateTask(UserId)

对于此方法,检查
UserId
是否符合
null
或空值和无效值就足够了

或者我应该检查是否为特定的
用户ID
创建了
任务

我还应该检查创建的任务数量及其日期和时间吗?

1)保持方法简短,这样单元测试就容易了(顺便说一句,这是鼓励良好设计的原因之一)

2) 检查所有边界条件(无效输入、琐碎输入等)(顺便说一句,简化的方法之一)

3) 检查所有可能的场景以实现高覆盖率(所有可能的执行都通过您的方法,通过最简单的输入来实现)(顺便说一句,这是有效的原因之一)

4) 使用演示该方法典型用法的真实数据检查几个(可能是一个)典型场景

和你可能已经注意到的——考虑使用,这样你就不必担心“测试现有方法”的问题:(

< P > 1)保持你的方法简明,因此单元测试会很容易(BTW.鼓励良好设计的原因之一)

2) 检查所有边界条件(无效输入、琐碎输入等)(顺便说一句,简化的方法之一)

3) 检查所有可能的场景以实现高覆盖率(所有可能的执行都通过您的方法,通过最简单的输入来实现)(顺便说一句,这是有效的原因之一)

4) 使用演示该方法典型用法的真实数据检查几个(可能是一个)典型场景


正如你可能注意到的——考虑使用,这样你就不必担心“测试现有方法”的问题:

< P>我认为这里没有足够的信息来回答这个问题。但我要谈谈你的一些观点:

对于这个方法,这是否足以检查UserId null或空且无效的Id

方法本身可以在内部实现这一点,但这不是测试的一部分。这只是运行时执行一些错误检查的方法。这通常被称为“防御性编程”

或者我应该检查是否为指定的UserId创建了任务

这就是多云的地方。这就是你想退一步看一看更大的图景的地方。确保单元测试没有与实现逻辑紧密耦合。测试应该验证业务逻辑,而不知道实现

“创建任务”很可能不是业务逻辑,而只是一个实现细节。您应该测试的是,当执行步骤A时,观察结果B。系统如何产生结果B基本上是测试的内容,但不是直接或明确的

让单元测试保持这种高水平的一个重要原因是,如果实现细节发生了变化,那么您就不想用它们来改变测试。这大大降低了这些测试的价值,因为它不仅为任何更改增加了更多的工作,而且消除了作为这些更改验证点的测试,因为测试本身也会更改。测试应该相当简单和静态,充当一组用于验证代码的规则。如果测试很复杂并且经常变化,那么它们就会失去验证代码所需的信心

你不必测试每一种方法。您应该测试系统执行的每个可观察到的业务操作。执行这些操作的方法因此得到了测试。那些不执行这些操作的方法会让人怀疑你是否需要它们。代码覆盖率工具非常适合确定这一点

例如,假设您有
MethodA()
,任何测试都不会使用它。没有测试直接调用它,因为它只是一个实现细节,测试不需要知道它。(在这种情况下,方法可能是私有的,或者以其他方式从外部调用代码中隐藏)这就给您留下了两个选项:

  • 测试不完整,因为未被测试的业务流程需要
    MethodA()
    。为该业务流程添加测试
  • 测试已经完成,系统实际上不需要
    MethodA()
    。移除它

  • 如果您的测试盲目地测试每一种方法,而不考虑业务逻辑的整体情况,那么您将永远无法确定系统何时不需要某些东西。不推荐不再需要的代码是保持一个简单且可维护的代码库的一个重要部分。

    我认为这里没有足够的信息来回答这个问题。但我要谈谈你的一些观点:

    对于这个方法,这是否足以检查UserId null或空且无效的Id

    方法本身可以在内部实现这一点,但这不是测试的一部分。这只是运行时执行一些错误检查的方法。这通常被称为“防御性编程”

    或者我应该检查是否为指定的UserId创建了任务

    这就是多云的地方。这就是你想退一步看一看更大的图景的地方。确保单元测试没有与实现逻辑紧密耦合。测试应该验证业务逻辑,而不知道实现

    “创建任务”很可能不是业务逻辑,而只是一个实现细节。您应该测试的是,当执行步骤A时,观察结果B。系统如何产生结果B基本上是测试的内容,但不是直接或明确的

    让单元测试保持这种高水平的一个重要原因是,如果实现细节发生了变化,那么您就不想用它们来改变测试。这大大降低了这些测试的价值,因为它不仅