我赞成随机测试,我写了它们。但是,它们是否适用于特定的构建环境以及它们应该包含在哪些测试套件中是一个更细微的问题。
在本地运行(例如,在您的开发盒上过夜)随机测试发现了明显和模糊的错误。那些晦涩难懂的东西太神秘了,以至于我认为随机测试确实是唯一能将它们淘汰的现实测试。作为测试,我通过随机测试发现了一个难以发现的错误,并让六名破解开发人员审查了它发生的功能(大约十几行代码)。没有人能够检测到它。
您反对随机数据的许多论点都是“测试不可重现”的味道。但是,编写良好的随机测试将捕获用于启动随机种子的种子并在失败时将其输出。除了允许您手动重复测试之外,这还允许您通过硬编码该测试的种子来轻松创建新测试来测试特定问题。当然,手动编写一个覆盖该案例的显式测试可能会更好,但是懒惰有其优点,这甚至允许您从失败的种子中自动生成新的测试用例。
但是,您提出的一点我无法争论的是,它破坏了构建系统。大多数构建和持续集成测试都希望测试每次都做同样的事情。因此,随机失败的测试会造成混乱,随机失败并指责无害的变化。
那么,一个解决方案是仍然将您的随机测试作为构建和 CI 测试的一部分运行,但使用固定的种子运行它,以进行固定数量的迭代。因此测试总是做同样的事情,但仍然探索一堆输入空间(如果你运行它进行多次迭代)。
在本地,例如,当更改相关类时,您可以自由地运行它以进行更多迭代或使用其他种子。如果随机测试变得越来越流行,您甚至可以想象一组特定的随机测试,它们可以使用不同的种子运行(因此随着时间的推移覆盖率越来越高),并且失败并不意味着同样的事情作为确定性 CI 系统(即,运行不会与代码更改 1:1 相关联,因此当事情失败时您不会指责特定的更改)。
随机测试有很多话要说,尤其是写得好的测试,所以不要太快放弃它们!