单元测试中是否应该至少有一个断言?如果是这样,为什么?

Should there be at least one assert in a unit test? If so, why?

如果我们以 gtest 为例,我们可以选择使用像 ASSERT_NE 这样的断言或像 EXPECT_NE 这样的检查。我的一位同事指出,我应该在我的测试中至少有一个断言,最好是检查主要 objective 的条件。 所以,到目前为止,我习惯于在继续测试无用的地方使用 ASSERT,而在可以继续测试的地方使用 EXPECT。 使用 ASSERT 和 EXPECT 的正确方法是什么?

EXPECT_*ASSERT_* 宏之间的主要区别在于断言在测试失败时立即停止测试,而期望允许它继续。

这是 GoogleTest Primer 对此的评价:

Usually EXPECT_* are preferred, as they allow more than one failures to be reported in a test. However, you should use ASSERT_* if it doesn't make sense to continue when the assertion in question fails.

因此,为了说明这一点:

TEST_F(myTest, test1)
{
    uut.doSomething();
    ASSERT_EQ(uut.field1, expectedvalue1);
    ASSERT_EQ(uut.field2, expectedvalue2);
}

如果 field1 与断言不匹配,则测试失败,您不知道 field2 是否正确。这使得调试变得更加困难。

这些选项之间的选择主要是 你们团队中的协议,但我会坚持使用 EXPECT_* 作为 backbone 的 GTest 提议所有检查和 ASSERT_* 仅当您测试某些重要的东西以继续时,否则测试的进一步部分没有任何意义(例如,如果您的被测单元未正确创建)。