当前位置: 首页 > 知识库问答 >
问题:

编写死亡测试以验证STD::SET_TERMATE行为

颜文昌
2023-03-14

我正在使用gtest为异常处理代码编写一些单元测试。作为一个简单的示例,假设我希望我的程序对任何未处理的异常中止,所以我创建以下测试:

TEST_F(myFixture, myTest)
{
    std::set_terminate([](){std::abort(); });

    EXPECT_DEATH(throw std::runtime_error("terminate"), ".*");
}

我希望这能成功,因为应该在程序上调用abort。然而,我的实际结果是:

我认为GTest的异常处理程序正在碍手碍脚。我尝试使用gtest_catch_exceptions环境变量和高级指南中提到的--gtest_catch_exceptions=0命令行标志禁用它们,但得到了相同的结果。

是我做错了什么,还是“例外死亡”不是gtest可以测试的?

共有1个答案

杨轶
2023-03-14

是我做错了什么,还是“例外死亡”不是gtest可以测试的?

您所做的是错误的,因为“例外死亡”不是gtest可以测试的。

EXPECT_DEATH(statement, regex);

验证语句调用abortexit并导致输出匹配regex。语句throw std::runtime_error(“terminate”)不调用abortexit,这可以从捕捉程序中的任何异常并让其继续运行的可能性中看出。如果未捕获异常,则运行库将调用terminate,以某种方式结束程序。但是这个结果不是由任何throw语句决定的。

和:

注意死亡测试只关心三件事:

  1. 语句是中止还是退出进程?...
#include <iostream>
#include <gtest/gtest.h>
#include <exception>


TEST(the_end, is_nigh)
{
    std::set_terminate([](){std::cout << "Goodbye cruel world\n", std::abort(); });

    EXPECT_DEATH(std::terminate(), ".*");
}
int main(int argc, char **argv) {
  ::testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}

它产生:

[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from the_end
[ RUN      ] the_end.is_nigh
Goodbye cruel world
[       OK ] the_end.is_nigh (172 ms)
[----------] 1 test from the_end (172 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (172 ms total)
[  PASSED  ] 1 test.
 类似资料:
  • 我是java新手,我正在编写一个ATM程序,用户可以输入三次pin码,如果他们输入的pin码不正确,他们的卡就会被阻塞。我曾尝试为以下代码编写Junit测试,但似乎无法理解。我有两门课,分别是AtmPin和AtmTester。AtmTester是主类所在的位置。 AtmPin.java AtmTester.java

  • 在启动AWS ECS Fargate服务时突然收到消息“ResourceInitializationError:failed to validate logger Args::Signal:Kilded”。同样的服务在几天前运行良好。 以下是相关aws任务中的日志驱动程序配置: 日志配置 日志驱动程序:awslogs 键值 awslogs-group/ecs/analytics awslogs-r

  • 参考 testing tutorial,testing tools reference和advanced testing topics。 本文档分为2个主要单元。首先,我们讲解如何利用Django编写测试.之后,我们讲解如何运行测试。 编写测试 Django的单元测试使用的是Python标准库:unittest。该模块是采用基于类的测试。 unittest2 从 1.7 版本开始不推荐使用 Pyt

  • 测试用来验证非测试的代码是否按照期望的方式运行的 Rust 函数。测试函数体通常执行如下三种操作: 设置任何所需的数据或状态 运行需要测试的代码 断言其结果是我们所期望的 让我们看看 Rust 提供的专门用来编写测试的功能:test 属性、一些宏和 should_panic 属性。 作为最简单例子,Rust 中的测试就是一个带有 test 属性注解的函数。属性(attribute)是关于 Rust

  • 我正在为一个解释器编写测试,该解释器需要大量语法上有效的输入。这是我如何做的一个最小的例子: 处理panic的想法来自https://golang.org/doc/entiful_go#recover,但是我不知道在测试中使用它是否像上面的示例中那样是一种好的做法,或者有某种原因,为什么在修复运行时错误之前,最好让测试失败。 这种设置的好处是,我可以看到所有TestCase会发生什么,即使其中一个

  • 在命令行中运行时,会出现以下失败 在肯定的情况下-报告说 null 谢谢你的帮助