Java 测试数据工厂方法是危险的还是有益的?

Java 测试数据工厂方法是危险的还是有益的?,java,unit-testing,design-patterns,junit,Java,Unit Testing,Design Patterns,Junit,在使用JUnit进行单元测试时,我遇到了一个问题,我想知道是否有标准的解决方案 我开始使用Podam生成随机测试数据,但一位同事正确地指出,这可能导致意外的单元测试失败。一方面,这显然是不好的,并且可能使调试成为一种真正的痛苦。另一方面,它可以通过突出显示代码问题来完成它的工作 我确定了我认为解决这个问题的三种方法。我错过了任何选择吗?这些是否被视为标准实践 工厂法生成随机测试数据 返回标准数据的工厂方法 手工制作的方法,没有工厂。每个单元测试在内部声明自己的输入数据和预期输出 此外,我认为每种

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

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

我确定了我认为解决这个问题的三种方法。我错过了任何选择吗?这些是否被视为标准实践

  • 工厂法生成随机测试数据
  • 返回标准数据的工厂方法
  • 手工制作的方法,没有工厂。每个单元测试在内部声明自己的输入数据和预期输出
  • 此外,我认为每种方法都有以下优点和缺点。我是否遗漏了任何重要的设计考虑因素

    优点:

  • 健壮的测试,易于创建,通过覆盖生成的值实现半确定性
  • 易于创建,易于调试
  • 适度稳健的测试和适度容易调试
  • 缺点:

  • 意外的单元测试失败(但至少您发现了问题)。更难调试
  • 非稳健测试
  • 人为错误、冗余和冗长的代码、不易维护、实现多样

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

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

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

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


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

    不幸的是,线程被搁置,因此我无法添加完整答案(您可以在此处找到更多信息:),但是-随机化可能会导致意外失败。可能是开发人员遗漏了一个bug,或者他不知道某些行为,或者仅仅是生成器编写错误。为了解决这些问题,a)在提交之前在本地运行数百次/数千次单元测试(IntelliJ在运行配置中有这样的选项)b)以及对于组件和系统测试,您还可以使用测试中使用的数据记录或创建报告,以便更容易地重现问题。