偶尔我会遇到一个没有断言的单元测试.我今天早上遇到的特定示例是测试在满足条件时写入日志文件.假设是如果没有抛出错误,则测试通过.
我个人对此没有任何问题,但是编写单元测试似乎有点"代码味道",没有任何关联它的断言.
只是想知道人们对此的看法是什么?
这只是一个非常小的测试,应该记录下来.它仅验证它在运行时不会爆炸.关于这样的测试最糟糕的部分是它们呈现出一种虚假的安全感.你的代码覆盖率会上升,但这是虚幻的.气味很难闻.
这将是官方的方式:
// Act Exception ex = Record.Exception(() => someCode()); // Assert Assert.Null(ex);
如果没有断言,则不是测试.
退出懒惰 - 可能需要一点时间来弄清楚如何在那里得到断言,但值得知道它做了你期望它做的事情.
这样的测试闻起来.应检查文件是否已写入,至少修改后的时间可能已更新.
我已经看过很多以这种方式编写的测试,最终没有测试任何东西,即代码不起作用,但它也没有爆炸.
如果您有一些明确的要求,即测试中的代码不会抛出异常并且您想明确地调用这个事实(测试作为需求文档),那么我会做这样的事情:
try { unitUnderTest.DoWork() } catch { Assert.Fail("code should never throw exceptions but failed with ...") }
......但这对我来说仍然有点味道,可能是因为它试图证明是消极的.
这些被称为烟雾测试并且很常见.他们是基本的健全检查.但它们不应该是你拥有的唯一一种测试.你还需要在另一个测试中进行某种验证.