C++ noexcept、断言处理程序和单元测试
我正在开发一个类似于LEST的测试框架,其中我提供了一个宏来检查给定表达式是否触发来自BOOST_ASSERT宏的运行时断言。这是通过使用BOOST_ASSERT_处理程序将断言转换为assertion_失败异常并让宏捕获它并报告捕获成功来完成的 问题是,我们有一系列的函数被测试为:C++ noexcept、断言处理程序和单元测试,c++,unit-testing,noexcept,C++,Unit Testing,Noexcept,我正在开发一个类似于LEST的测试框架,其中我提供了一个宏来检查给定表达式是否触发来自BOOST_ASSERT宏的运行时断言。这是通过使用BOOST_ASSERT_处理程序将断言转换为assertion_失败异常并让宏捕获它并报告捕获成功来完成的 问题是,我们有一系列的函数被测试为: float foo(int x) noexcept { BOOST_ASSERT(x > 1); return x/(x-1.f); } 这个noexcept规范被正确地设置为——除了在单元测试
float foo(int x) noexcept
{
BOOST_ASSERT(x > 1);
return x/(x-1.f);
}
这个noexcept规范被正确地设置为——除了在单元测试期间,函数实际上是noexcept。当然,在测试过程中,一切都会随着BOOST_ASSERT的抛出而发生变化
解决这个问题的一个想法是让断言填充一个全局唯一的\u ptr,以标记断言被触发。但是,它失败了,因为控制流仍然运行错误代码
对于这个问题,什么样的解决方案最优雅,对测试代码的更改最少?使用exception和set_terminate是有效的解决方案吗?根据我的经验,这是您需要放弃BOOST_测试并使用GOOGLE_测试的时候,因为它可以通过死亡测试功能完美地处理这种情况。你做得越早,痛苦就越小。我不是在使用Boost.Test,而是一个定制的lighteight测试系统。我们来看看Google测试是如何处理的,请看这里:根据我的经验,搜索“死亡测试”此时您需要放弃BOOST_测试并使用Google_测试,因为它通过死亡测试功能完美地处理了这种情况。你做得越早,痛苦就越小。我不是在使用Boost.Test,而是一个定制的lighteight测试系统。我们来看看谷歌测试是如何处理的,看看这里:搜索“死亡测试”