【问题标题】:Using ASSERT and EXPECT in GoogleTest在 GoogleTest 中使用 ASSERT 和 EXPECT
【发布时间】:2011-02-03 15:37:13
【问题描述】:

虽然 ASSERT_* 宏会导致测试用例终止,但 EXPECT_* 宏会继续其评估。 我想知道哪个是决定是否使用其中一个的标准。

【问题讨论】:

  • ASSERT_* 宏(必须)终止测试用例,详情请参阅Martin's answer

标签: c++ unit-testing googletest


【解决方案1】:

当条件必须成立时使用ASSERT - 如果不成立,测试就停在那里。当测试的其余部分在没有此条件的情况下没有语义时,请使用此条件。

当条件应该成立时使用EXPECT,但在不成立的情况下,我们仍然可以从继续测试中获得价值。 (不过,测试最终还是会失败。)

经验法则是:默认使用EXPECT,除非您要求为其余的测试保留一些东西,在这种情况下,您应该使用ASSERT 来处理该特定条件。


这在primer中得到了回应:

通常首选EXPECT_*,因为它们允许在测试中报告多个故障。但是,如果在相关断言失败时继续没有意义,您应该使用ASSERT_*

【讨论】:

  • 标准示例:在检查容器的内容之前,您断言它的大小,因为检查甚至可能不存在的项目的期望是没有意义的(此外,如果您尝试,您的测试很可能会崩溃获取空容器的第 n 个元素)。
  • 这与您是否希望您的程序 运行无关,而是您是否希望测试套件 继续运行。预期失败应该意味着您正在测试的代码有缺陷。 ASSERT 失败应该意味着测试套件本身有缺陷,或者您正在测试的代码非常混乱,以至于没有必要继续尝试测试它。
  • @SolomonSlow 的区别是关键。
【解决方案2】:

当你使用EXPECT_

  • 想要在测试中报告不止一次失败

当使用ASSERT_

  • 断言失败时继续没有意义

由于ASSERT_ 会在您的函数失败时立即中止您的函数,因此可能会跳过可能的清理代码。 首选 EXPECT_ 作为您的默认值。

【讨论】:

    【解决方案3】:

    除了之前的答案...

    ASSERT_ 不会终止测试用例的执行。它从使用的任何函数返回。除了测试用例失败之外,它的计算结果为return;,这意味着它不能在返回void 以外的函数中使用。除非您对编译器警告感到满意,否则就是这样。

    EXPECT_ 未通过测试用例,但 return; 未通过,因此它可以在任何返回类型的函数中使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-19
      • 2013-08-16
      • 1970-01-01
      • 2015-11-13
      • 1970-01-01
      • 2017-09-08
      • 2014-05-04
      • 1970-01-01
      相关资源
      最近更新 更多