【问题标题】:Using random value in a JUnit test class [closed]在 JUnit 测试类中使用随机值 [关闭]
【发布时间】:2016-04-30 01:25:23
【问题描述】:

使用随机值通过 JUnit 创建测试对象是一种好习惯吗? 像这样:

public class MonomialTest {

    private static final Random RANDOM = new Random();

    private Monomial monomial;
    private float coefficient;
    private int exponent;

    @Before
    public void setUp() throws Exception {
        coefficient = RANDOM.nextFloat();
        exponent = RANDOM.nextInt();
        monomial = new Monomial(coefficient, exponent);
    }

    @Test
    ...
    ...
    ...

}

或者我应该使用固定值吗?

【问题讨论】:

  • 为什么是 -1 ?请告诉我
  • 许多基于意见的问题将被否决或标记为该论坛的主题外。这个想法是他们吸引了很多垃圾邮件和不相关的 cmets 到这个论坛。您可以尝试堆栈交换网站系列中的代码审查论坛。你也可以问一些更具体的问题,这样你会吸引更多高质量的答案。一个例子是这种方法是否比另一种方法更安全和/或更快。我相信最佳实践一词对人们来说意味着很多不同的东西,这取决于他们如何学习使用该语言进行编码以及他们在哪里工作。
  • @LarryLane 对于 CodeReview 来说太假设了
  • 感谢您的反馈。你对他们可能会在哪里提出类似的问题有什么建议吗?看起来有人可以在这里为他们回答问题。

标签: java unit-testing random junit


【解决方案1】:

单元测试应该是确定性的,以便在测试失败时简化故障查找。因此它们不应包含随机值。

检查某些属性是否适用于 任意 值(您的测试有效地执行此操作)确实有意义:为此,您可以使用基于属性的测试框架,例如 junit-quickcheck,它将执行随机为您生成数据。

【讨论】:

    【解决方案2】:

    可以使用 random,但要确保它运行良好: 打印随机值,以便您查看,并确保结果符合预期。

    或者只是输入一个已知值而不是随机值。

    【讨论】:

      【解决方案3】:

      如果我没有弄错 new Random() (没有随机种子)总是产生相同的伪随机数序列,所以我认为使用它是可以的,因为实际上你总是会测试相同的数字序列!

      【讨论】:

      • 只有当所有测试总是以相同的顺序运行时才适用。它还会使您的测试套件在添加、更改或删除测试方面变得脆弱。
      • 感谢您澄清这一点!我没想到:)
      • 这不是真的。 Random() 使用 System.nanoTime() 作为种子的一部分,所以它不应该每次都相同。
      【解决方案4】:

      通常在单元测试用例中使用随机数据不是一个好主意。通常,您希望您的测试产生确定性的结果。然而,在某些情况下,人们使用随机数据测试功能——如果被测系统非常复杂,并且怀疑系统设计的测试套件(仍然应该存在)是否能够获得足够的覆盖率。然而,此类随机测试大多是长时间运行的测试,不会在回归测试的正常过程中执行。

      【讨论】:

        猜你喜欢
        • 2011-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多