我刚刚从我的catch2测试框架转移到Microsofts原生代码C++单元测试框架,以便更好地集成到IDE中。
但是我的编码风格是在代码中使用大量的断言语句,我不能用宏调用代替它们。我不能用像AssertIfTrue这样的宏调用来代替它们,否则就会因为对框架的依赖而使整个代码库中毒。
但是如果一个断言失败,单元测试运行器就会停止并弹出消息框,当我按下中止按钮时,测试将被报告为跳过而不是失败。这对于任何自动化的持续集成生命周期来说都是不可能的行为。
我已经尝试通过 signal(SIGABRT, SignalHandler);
但该处理程序从未被调用。使用_set_abort_behavior来禁用消息框,并使用 _set_abort_behavior( 0, _WRITE_ABORT_MSG);
也没有结果。
好吧,我在浏览了源代码后找到了解决方案,这个片段必须在运行代码前放在一些初始化例程中。
#include "CppUnitTest.h"
static void my_abort_function(int signo) {
Microsoft::VisualStudio::CppUnitTestFramework::Assert::IsTrue(false);
}
void initialize() noexcept {
_set_error_mode(_OUT_TO_STDERR);
_set_abort_behavior(0, _WRITE_ABORT_MSG);
signal(SIGABRT, my_abort_function);
}