有时我发现非常brittle test是一件好事,因为当我改变测试代码的意图时,我想确保我的单元测试中断,以便我被迫重构...在构建一大套回归测试时,不推荐这种方法吗?
答案 0 :(得分:13)
单元测试必须变脆 - 必须很容易打破它们。如果它们没有破坏,那么它们根本就不是单元测试;他们是代码评论。
...
还是我错过了问题的重点?
编辑:我应该澄清我之前的回答。
我对这门语言有点迂腐。 “脆弱”只是意味着“容易打破”。单元测试应易于破解。术语“脆弱测试”应该是“过度 - 脆弱测试”;他们不应该打破的测试。即便如此,修复一个过于脆弱的测试比修复一个漏洞通过脆弱性测试的错误要容易得多,所以继续写下你的脆弱测试!
答案 1 :(得分:8)
劝告脆弱单位测试的一般声明主要适用于尚未完全接受单元测试的商店。例如,当试图从没有测试转换为完整的单元测试套件,或者当您的项目是单元测试试点项目时。在这些情况下,开发人员习惯于单元测试中的误报,并开始忽略它们。然后单元测试落后于生产代码,要么落后,要么需要付出巨大努力才能更新。
我会说你应该始终瞄准那些能够完全测试你的功能/模块的最简单的测试,但是如果你有1或2个很脆弱,你应该在大多数情况下都没问题。
答案 2 :(得分:6)
IMO,只要您的测试确保您的应用程序代码能够执行它应该执行的操作,并且如果更改,测试将失败,那么您的测试就可以了。你能用“脆弱”来定义你的意思吗?
确保您的测试真正涵盖了应用代码的各个方面。 (在合理范围内)。
答案 3 :(得分:5)
正如营养不良者指出的那样,单元测试应该是脆弱的,因为它们容易破碎。但是,我想补充一点,他们不应该因为随机传递或失败而变脆。
在涉及线程和套接字的测试中会发生很多这种情况。测试应该使用互斥锁和其他“等待”设备,以避免测试在无法控制的情况下失败,例如高处理器负载。
随机脆弱测试的明确“气味”是在测试中使用sleep()函数。
答案 4 :(得分:3)
是的,测试的脆弱性总是一件坏事。但它似乎是我们必须要接受的事情之一,以便完全测试我们的课程。很多类都不能像黑盒一样进行测试,它们需要一些输入并返回一些输出,就像你可能会看到Math.cos()一样。它们中的大多数对系统中的其他类或实体都有副作用,您必须测试这些实体是否被类正确操作。这意味着测试必须知道正在测试的类的实现细节,这会产生脆弱的类。
脆弱的测试就像是直肠检查。它们绝对是坏事,不愉快的事情,但我们必须忍受它们,因为我们没有更好的选择。
答案 5 :(得分:3)
当代码更改意味着对类的“内部”(即不更改API)时,导致测试失败,有两种可能性:
尝试减少#2。那些是“脆弱”的测试。
答案 6 :(得分:1)
单位测试根据定义是脆弱的。当相关代码(被测系统)发生变化时,它们会中断。这是设计的。那就是单元测试如何提供价值。
我们想要避免的是在代码更改但逻辑没有时会中断的测试。例如,在添加新需求时,大多数现有测试都会中断。
不幸的是,避免这种脆弱并不容易。除了最简单的情况之外,单元测试将具有关于被测系统的实现的一些知识(例如,模拟对象)。只要这是真的,测试将是脆弱的。
避免该问题的最佳方法是避免编写需要更改的类。这实际上比遵守SOLID原则时听起来更容易。