【发布时间】:2015-11-01 09:05:59
【问题描述】:
当我遇到一个有趣的场景时,我最近开始向我所有的旧项目添加单元测试以提高可维护性
一个这样的例子是UUID 类,它是randomUUID() 方法。给定特定测试依赖于两个随机生成的 UUID 不同的场景,为这种情况添加假设检查是否过度/不必要,例如:
UUID firstUID = UUID.randomUUID();
UUID secondUID = UUID.randomUUID();
// Is this test excessive
assumeFalse(firstUID.equals(secondUID));
// Rest of test here
虽然从包括here 在内的许多地方都可以看出,UUID 冲突实际上是不可能的,但这种方法的 javadoc 并未声称它是:
用于检索类型 4(伪随机生成)UUID 的静态工厂。 UUID 是使用强加密伪随机数生成器生成的。
子句cryptographically strong pseudo random number generator 是有保证的,但没有明确声明生成的 UUID 的唯一性。这意味着 randomUUID() 的潜在未来实现可能会改变它的实现,从而在不破坏方法声明的合同的情况下更有可能发生冲突。
虽然这种情况似乎很孤立,但它确实会不时出现,尤其是在处理随机数生成(也包括质数生成)时。从我的角度来看,添加假设子句对性能影响不大,所以我把它留在了。但总的来说,在单元测试期间添加高概率(实际上几乎不可能失败)假设是一个好主意吗?还是他们过分了?为了更进一步,在为它们编写实际假设条款之前,是否有关于给定假设必须失败的可能性的指南?我猜assumeFalse(the world is ending) 会被认为是过度的。
P.S:规范下的实际代码使用我不知道但保证唯一性的第三方 UUID 生成系统。由于这种情况是对原始 API 的扩展,因此我将其 UUID 生成替换为虚拟 randomUUID(),这样该假设仅适用于测试(实际代码为 100%)。
另一种方法是编写能够保证条件的系统(而不仅仅是假设它们的高概率),尽管我发现这对于小型测试来说太过分了。
【问题讨论】:
标签: java unit-testing junit automated-tests