java - 智能 : rerun intermittently failing random test with previos run's data

标签 java unit-testing intellij-idea junit intermittent

我有一个包含许多测试的 JUnit 测试类。为了增加场景覆盖率,我们测试中的一些数据是随机的,这意味着它可能在各个测试运行之间采用一系列值,例如:

protected MonthlyAmountWithRemainder getMonetaryAmountMultipleOf(int multiplier) {
    BigDecimal monthly = randomBigDecimal(1000);
    BigDecimal multiply = new BigDecimal(multiplier);
    BigDecimal total = monthly.multiply(multiply);
    return new MonthlyAmountWithRemainder(total, monthly, ZERO);
}

你看到这个 randomBigDecimal(1000) 了吗?这可能会生成 0 到 1000 之间的任何值。我们还可以在测试中随机化日期和其他一些值。

通常情况下,我们的测试运行得很好,但在极少数情况下(我说的当前情况是大约 50 次),测试会在没有任何明显原因的情况下失败。可以想象,如此罕见的故障使得无法通过调试测试用例来找出故障原因或进行修复。

因此,问题是:是否可以捕获在失败的测试运行中生成的数据并使用完全相同的测试数据重新运行测试,以便我可以调试失败的场景?换句话说,我想重新体验我之前失败的试运行。能实现吗?

最佳答案

简单:使用种子种子随机数生成器。该种子 可以从随机数生成器本身创建(这样您每次运行都会得到不同 随机值)。核心点是然后记录被使用的种子。

因为“失败重现”归结为不使用随机种子,而是使用导致测试失败的种子值。

当然:需要努力才能让事情“正确”——您要确保您确实使用不同的种子运行日常测试。但是您还想确保固定种子是微不足道的,并且会导致确定性的结果。

或者,无论何时出现随机数据,您都应该研究基于“快速检查”的测试方法(例如,参见 here)。进入这种方法需要一些思考,但通常值得花时间。这个想法是您指定生产代码的某些属性 - 然后框架生成随机数据并尝试伪造这些属性。真正好的部分是:一旦框架找到破坏您的属性的方法,它就会开始搜索导致问题的最小示例。

关于java - 智能 : rerun intermittently failing random test with previos run's data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48419833/

相关文章:

java - 不同(不相同)的副本集是从单例对象返回的

java - Spring MVC UTF-8 编码

unit-testing - 如何模拟 CakePHP 的单元测试行为

scala - 对于在 Scala 中使用默认参数的方法,Mockito 验证失败,错误为 "TooManyActualInvocations"

android - 如何在 Intellij IDEA 中运行 Proguard

java - DataStax 找不到 JAVA_HOME

java - 无法使用带有 % 或 * 的 LIKE 搜索 MS Access 数据库

c# - 将新测试项目的测试引入解决方案时,MSTest 单元测试适配器无法连接到数据源

java - 无法理解Intellij IDEA的内存使用和管理

java - 如何在 IntelliJ Idea 中添加远程 Maven 存储库?