C++ 在GoogleTest中使用ASSERT和EXPECT

C++ 在GoogleTest中使用ASSERT和EXPECT,c++,unit-testing,googletest,C++,Unit Testing,Googletest,当ASSERT_*宏导致测试用例终止时,EXPECT_*宏继续其计算。 我想知道决定是否使用其中一个的标准是什么。使用ASSERT当条件必须保持时-如果条件不能保持,测试将立即停止。当测试的其余部分没有语义含义且没有此条件时,使用此选项 当条件应保持时,使用EXPECT,但如果条件不保持,我们仍然可以从继续测试中获得价值。(不过,测试最终还是会失败。) 经验法则是:默认情况下使用EXPECT,除非您需要在剩余的测试中保留某些内容,在这种情况下,您应该为该特定条件使用ASSERT 这在以下方面得

当ASSERT_*宏导致测试用例终止时,EXPECT_*宏继续其计算。
我想知道决定是否使用其中一个的标准是什么。

使用
ASSERT
当条件必须保持时-如果条件不能保持,测试将立即停止。当测试的其余部分没有语义含义且没有此条件时,使用此选项

当条件应保持时,使用
EXPECT
,但如果条件不保持,我们仍然可以从继续测试中获得价值。(不过,测试最终还是会失败。)

经验法则是:默认情况下使用
EXPECT
,除非您需要在剩余的测试中保留某些内容,在这种情况下,您应该为该特定条件使用
ASSERT


这在以下方面得到了回应:

通常首选
EXPECT.*
,因为它们允许在测试中报告多个故障。但是,如果在所讨论的断言失败时继续下去没有意义,则应该使用
ASSERT.*


使用
EXPECT\uu

  • 要在测试中报告多个失败吗
使用
断言

  • 当断言失败时继续下去是没有意义的
由于
ASSERT.
在函数失败时会立即中止函数,因此跳过可能的清除代码。
首选
EXPECT\u
作为默认答案。

除了前面的答案之外

断言
不会终止测试用例的执行。它从中使用的任何函数返回。除了测试用例失败之外,它的计算结果是
返回
,这意味着它不能用于返回除
void
之外的内容的函数中。除非您对编译器警告没有意见,否则就是这样


EXPECT
使测试用例失败,但不
返回,因此它可以在任何返回类型的函数中使用。

标准示例:在检查容器内容之前,您声明它的大小,因为检查甚至可能不存在的项目的期望值是没有意义的(此外,如果您尝试获取空容器的第n个元素,您的测试很可能会崩溃)。这与您是否希望程序运行无关,而是与您是否希望测试套件继续运行有关。EXPECT失败应该意味着您正在测试的代码有缺陷。断言失败应该意味着测试套件本身有缺陷,或者您正在测试的代码混乱不堪,没有必要继续测试它。@SolomonSlow的区别是关键。断言宏不(一定)终止测试用例,请参阅以获取详细信息。