单元测试中是否应该至少有一个断言?如果是这样,为什么?
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_*
仅当您测试某些重要的东西以继续时,否则测试的进一步部分没有任何意义(例如,如果您的被测单元未正确创建)。
如果我们以 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 useASSERT_*
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_*
仅当您测试某些重要的东西以继续时,否则测试的进一步部分没有任何意义(例如,如果您的被测单元未正确创建)。