都。
确定性和非确定性测试对您的套件具有不同的用例和不同的价值。通常,不确定性不能提供与确定性测试相同的精度,确定性测试已逐渐发展为“不确定性测试没有价值”。这是错误的。它们可能不太精确,但也可以更广泛,这有其自身的优势。
让我们举个例子:编写一个对整数列表进行排序的函数。您会发现有用的一些确定性单元测试是什么?
- 空清单
- 仅包含一个元素的列表
- 具有所有相同元素的列表
- 具有多个唯一元素的列表
- 包含多个元素的列表,其中一些元素是重复的
- 名单用
NaN
,INT_MIN
和INT_MAX
- 已部分排序的列表
- 包含10,000,000个元素的列表
那只是一个排序功能!当然,您可能会争辩说其中一些是不必要的,或者可以通过非正式推理排除其中一些。但是我们是工程师,而且我们已经看到非正式的推理在我们的脸上爆炸。我们知道我们不够聪明,无法完全理解已构建的系统或完全无法掌握复杂性。这就是为什么我们首先编写测试的原因。添加非确定性测试只是说我们可能不一定足够聪明就可以先验地了解所有好的测试。通过将半随机数据放入函数中,您更有可能找到遗漏的边缘情况。
当然,这也不排除确定性测试。非确定性测试有助于发现大量程序中的错误。但是,一旦发现了错误,就需要一种可再现的方式来证明已修复它。所以:
- 使用不确定性测试来查找代码中的错误。
- 使用确定性测试来验证代码中的修复程序。
请注意,这意味着很多有关单元测试的可靠建议不一定适用于不确定性测试。例如,它们必须快。低级属性测试应该很快,但是诸如“模拟用户随机单击您网站上的按钮并确保您永远不会出现500个错误”之类的不确定性测试应该优先考虑全面性而不是速度。只需进行独立于您的构建过程的测试,这样就不会减慢开发速度。例如,在自己的专用登台盒上运行它。