当ASSERT_* 宏导致测试用例终止时,EXPECT_* 宏继续其评估。我想知道哪个是决定使用其中一个或另一个的标准。
8qgya5xd1#
当条件必须成立时使用ASSERT-如果不成立,测试就停止。当测试的其余部分没有语义意义而没有这个条件成立时使用这个。当条件 * 应该 * 成立时,使用EXPECT,但如果不成立,我们仍然可以从继续测试中获得价值(尽管测试最终还是会失败)。经验法则是:默认情况下使用EXPECT,除非您 * 需要 * 一些东西来保持测试的剩余部分,在这种情况下,您应该为特定条件使用ASSERT。这在primer中得到回应:通常首选EXPECT_*,因为它们允许在一个测试中报告多个失败,但是,如果当有问题的Assert失败时继续没有意义,则应该使用ASSERT_*。
ASSERT
EXPECT
EXPECT_*
ASSERT_*
sd2nnvve2#
在以下情况下使用EXPECT_
EXPECT_
在以下情况下使用ASSERT_
ASSERT_
由于ASSERT_会在函数失败时立即中止,因此可能的清理代码将被跳过。首选EXPECT_作为默认值。
hgqdbh6s3#
除了之前的答案...ASSERT_不会终止测试用例的执行。它从使用它的任何函数返回。除了测试用例失败之外,它的计算结果为return;,这意味着它不能用于返回void以外的函数。除非您对编译器警告没有意见。EXPECT_未通过测试用例,但return;未通过测试用例,因此它可以在任何返回类型的函数中使用。
return;
void
fzsnzjdm4#
Google C++测试框架支持两个具有相同接口的Assert家族:
C++
EXPECT通常更合适,因为它:在一次运行中显示更多的故障,并允许在一个编辑/编译/运行测试周期中修复更多的故障。示例:
TEST(WordStemmerTest, StemsPluralSuffixes) { EXPECT_STREQ("jump", stemmer->Stem("jumps")); EXPECT_STREQ("pixi", stemmer->Stem("pixies")); EXPECT_STREQ("prioriti", stemmer->Stem("priorities")); // etc ... }
如果继续没有意义,请使用ASSERT。示例:
TEST(FileGeneratorTest, CreatesFileContainingSequenceOfChars) { ASSERT_TRUE(fp = fopen(path, "r")) << "Failed to open " << path; ASSERT_EQ(10, fread(buffer, 1, 10, fp)) << "File " << path << " is too small"; buffer[10] = '\0'; EXPECT_STREQ("123456789", buffer) << "File " << path << " is corrupted"; }
4条答案
按热度按时间8qgya5xd1#
当条件必须成立时使用
ASSERT
-如果不成立,测试就停止。当测试的其余部分没有语义意义而没有这个条件成立时使用这个。当条件 * 应该 * 成立时,使用
EXPECT
,但如果不成立,我们仍然可以从继续测试中获得价值(尽管测试最终还是会失败)。经验法则是:默认情况下使用
EXPECT
,除非您 * 需要 * 一些东西来保持测试的剩余部分,在这种情况下,您应该为特定条件使用ASSERT
。这在primer中得到回应:
通常首选
EXPECT_*
,因为它们允许在一个测试中报告多个失败,但是,如果当有问题的Assert失败时继续没有意义,则应该使用ASSERT_*
。sd2nnvve2#
在以下情况下使用
EXPECT_
在以下情况下使用
ASSERT_
由于
ASSERT_
会在函数失败时立即中止,因此可能的清理代码将被跳过。首选EXPECT_
作为默认值。hgqdbh6s3#
除了之前的答案...
ASSERT_
不会终止测试用例的执行。它从使用它的任何函数返回。除了测试用例失败之外,它的计算结果为return;
,这意味着它不能用于返回void
以外的函数。除非您对编译器警告没有意见。EXPECT_
未通过测试用例,但return;
未通过测试用例,因此它可以在任何返回类型的函数中使用。fzsnzjdm4#
Google
C++
测试框架支持两个具有相同接口的Assert家族:ASSERT
:快速失败,中止当前函数。EXPECT
:失败后继续。EXPECT
通常更合适,因为它:在一次运行中显示更多的故障,并允许在一个编辑/编译/运行测试周期中修复更多的故障。示例:
如果继续没有意义,请使用
ASSERT
。示例: