java - 测试数据工厂方法是危险还是有益?

标签 java unit-testing design-patterns junit

在使用 JUnit 进行单元测试时,我遇到了一个问题,我想知道是否有标准解决方案。

我开始使用 Podam 生成随机测试数据,但一位同事正确地指出这可能会导致意外的单元测试失败。一方面,这显然很糟糕,并且可能使调试变得非常痛苦。另一方面,它可以通过突出显示代码问题来完成其工作。

我确定了我认为解决该问题的 3 种方法。我错过了什么选择吗?这些是否被视为标准做法?

  1. 生成随机测试数据的工厂方法
  2. 返回标准数据的工厂方法
  3. 手工制作,没有工厂。每个单元测试在内部声明自己的输入数据和预期输出。

此外,我认为每种方法都有以下优点和缺点。我是否遗漏了任何重要的设计考虑因素?

优点:

  1. 稳健的测试、轻松的创建、通过覆盖生成的值实现半确定性。
  2. 轻松创建,轻松调试。
  3. 测试比较稳健,调试也比较容易。

缺点:

  1. 意外的单元测试失败(但至少您发现了问题)。更难调试。
  2. 非稳健测试
  3. 人为错误、冗余且冗长的代码、难以维护、实现多样化。

最佳答案

我认为一个好的单元测试需要做好它的工作并专注于健壮的测试。

我更喜欢选项 1。使用随机数据可能会导致意外的单元测试失败,但归根结底这是一件好事,因为您涵盖了所有技术上可能的场景,包括开发人员不会想到的场景。

选项 1 可能需要更多的工作调试,但如果被测试的方法很简单,那么这不太可能是一个重要的开销。如果正在测试的方法极其复杂,那么无论如何调试都可能很困难,并且可能需要分解。

选项 2 和 3 会引入人为错误。最大限度地减少人为错误是任何计划的关键目标。 3 也很冗长且难以维护。这些问题最终可能会花费比专门进行额外调试更多的时间和精力。

我的猜测是,从长远来看,#1 会花费更少的时间和精力。这只是一个猜测,并不是主要问题。主要关注的是#1 是确保执行稳健测试的正确方法。

关于java - 测试数据工厂方法是危险还是有益?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42633279/

相关文章:

java - 用于在线 cab 项目的 Node.js 或 Java

java - 识别Web服务的类型

java - 如何设置带有 UTC 时间的日历?

c# - 在测试使用 JWT Bearer Authentication 的 NancyFX 网站时,我应该模拟 CurrentUser 还是添加授权 header ?

javascript - 主干门面/中介模式挑战

java - GraphQL 分页 : cursor vs offset

python - 确保单元测试中的代码覆盖率?

unit-testing - 如何验证在单独的 go 例程中调用了一个方法

c++ - (Ab)使用构造函数和析构函数进行副作用不好的做法?备择方案?

python - 创建一个对象,该对象的方法延迟到另一个对象执行 [Python]