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