考虑对字典对象进行单元测试。您可能编写的第一个单元测试只是将项目添加到字典并检查异常。下一个测试可能类似于测试计数是否准确,或者字典是否返回正确的键或值列表。
然而,后面的每种情况都要求字典首先能够可靠地添加项目。如果添加项目的测试失败,我们不知道后面的测试失败是因为他们正在测试的内容实施不正确,还是因为我们可以可靠地添加项目的假设不正确。
我是否可以声明一组单元测试,如果其中任何一个失败,则导致给定的单元测试不确定?如果不是,我应该如何最好地解决这个问题?我是否设置了错误的单元测试,导致我陷入了这种困境?
这并不像看起来那么难。让我们稍微改一下这个问题:
如果我测试我的代码片段需要System.Collections.Generic.List<T>.Add
工作,当有一天微软决定破产时我该怎么办.Add
on List<T>
?我是否会根据此进行测试以获得不确定的结果?
上述问题的答案是显而易见的;你不。你让他们失败的原因很简单——你的假设失败了,并测试should失败。这里也是一样。一旦你的添加测试开始工作,从那时起你假设添加作品。您不应以与第三方测试代码不同的方式对待您的测试代码。一旦它被证明有效,你就会认为它确实有效。
另一方面,您可以利用称为守卫断言。在删除测试中,在排列阶段之后,您引入了额外的断言阶段,该阶段验证您的初始假设(在本例中 - 添加正在工作)。有关此技术的更多信息可以找到here https://stackoverflow.com/q/1021007/343266.
添加一个示例,NUnit 使用上面伪装在名称下的概念。这正是您所提议的(但它似乎与数据驱动测试而不是通用实用程序更相关):
该理论本身负责确保提供的所有数据都满足其假设。它通过使用 Assume.That(...) 构造来完成此操作,其工作方式与 Assert.That(...) 类似,但是不会导致失败。如果特定测试用例不满足假设,则该用例返回不确定的结果,而不是成功或失败。
然而,我认为马克·西曼在回答中指出 https://stackoverflow.com/a/1021037/343266我链接的问题最有意义:
对于给定的测试用例,可能需要满足许多先决条件,因此您可能需要多个 Guard Assertion。不必在所有测试中重复这些测试,而是为每个先决条件进行一个(且仅一个)测试,可以使您的测试代码更易于维护,因为这样可以减少重复。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)