Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在测试期间假设高概率情况_Java_Unit Testing_Junit_Automated Tests - Fatal编程技术网

Java 在测试期间假设高概率情况

Java 在测试期间假设高概率情况,java,unit-testing,junit,automated-tests,Java,Unit Testing,Junit,Automated Tests,最近,我开始在我所有的旧项目中添加单元测试,以提高可维护性,当时我遇到了一个有趣的场景,关于在假设案例失败的可能性很小的情况下添加assessment()语句的适用性 其中一个例子是类及其randomUUID()方法。给定一个场景,其中一个特定测试依赖于两个随机生成的UUID是不同的,在这种情况下添加假设检查是否过度/不必要,例如: UUID firstUID = UUID.randomUUID(); UUID secondUID = UUID.randomUUID(); // Is this

最近,我开始在我所有的旧项目中添加单元测试,以提高可维护性,当时我遇到了一个有趣的场景,关于在假设案例失败的可能性很小的情况下添加
assessment()
语句的适用性

其中一个例子是类及其
randomUUID()
方法。给定一个场景,其中一个特定测试依赖于两个随机生成的UUID是不同的,在这种情况下添加假设检查是否过度/不必要,例如:

UUID firstUID = UUID.randomUUID();
UUID secondUID = UUID.randomUUID();

// Is this test excessive
assumeFalse(firstUID.equals(secondUID));

// Rest of test here
虽然从很多地方都可以看到UUID冲突实际上是不可能的,但这种方法的javadoc并不声称它是:

用于检索类型4(伪随机生成)UUID的静态工厂。UUID是使用加密强伪随机数生成器生成的

子句
加密强伪随机数生成器
确保了生成的UUID的唯一性,但没有给出明确的声明。这意味着
randomUUID()
的未来实现可能会改变它的实现,从而在不破坏方法声明契约的情况下,冲突变得更可能

虽然这种情况看起来很孤立,但它确实会不时出现,特别是在处理随机数生成(也包括质数生成)时。从我的角度来看,添加假设子句对性能的影响不大,所以我将其保留了下来。但总的来说,在单元测试期间添加高概率(实际上不可能失败)假设是一个好主意吗?还是过度?为了进一步说明这一点,在为给定假设编写实际假设条款之前,是否有关于给定假设失败可能性的指南?我猜
假设错误(世界末日)
会被认为是过分的

注:规范下的实际代码使用第三方UUID生成系统,我不知道该系统,但它保证唯一性。由于本例是对原始API的扩展,我将用一个虚拟的
randomUUID()
替换它们的UUID生成,这样假设只可能用于测试(实际代码为100%)


另一种选择是编写能够保证条件的系统(而不仅仅是假设条件的高概率),尽管我发现这对于小型测试来说太过分了。

好吧,整个过程可能基本上是基于观点的,但我在这里看到的主要问题不是性能受到的影响,这是因为你正在测试一些随机的东西(在最坏的情况下)有时会发生,有时不会。那你怎么办?重新运行测试将提供不同的结果。这对你有什么帮助?您肯定会意识到这是可能发生的,但知道这不应该是实验的结果(单元测试是错误的工具),而应该是阅读文档和代码的结果


因此,我认为您在这里工作的级别是错误的:您应该找出(一次)这是否可能,决定这个案例是否可以接受,如何处理这个案例,然后测试处理这个问题的代码。(如果您需要测试您正在使用的框架,那么您在任何方面都使用了错误的框架。)

我将在while循环中生成secondUID,而不是使用assumeFalse。重新生成secondUID,直到它不再等于firstUID。这样一来,当firstUID等于secondUID时,您就不会在非常遥远的情况下出现测试失败