如何跳过 BOOST 单元测试?我想以编程方式跳过一些单元测试,具体取决于(例如)我执行它们的平台。我目前的解决方案是:
#define REQUIRE_LINUX char * os_cpu = getenv("OS_CPU"); if ( os_cpu != "Linux-x86_64" ) return;
BOOST_AUTO_TEST_CASE(onlylinux) {
REQUIRE_LINUX
...
the rest of the test code.
}
(请注意,我们的构建环境设置了变量 OS_CPU)。这看起来丑陋且容易出错,而且无声跳过可能会导致用户在不知情的情况下跳过测试。
如何干净地跳过基于任意逻辑的 boost 单元测试?
使用enable_if/enable/precondition装饰器。
boost::test_tools::assertion_result is_linux(boost::unit_test::test_unit_id)
{
return isLinux;
}
BOOST_AUTO_TEST_SUITE(MyTestSuite)
BOOST_AUTO_TEST_CASE(MyTestCase,
* boost::unit_test::precondition(is_linux))
{...}
precondition 在运行时评估,enable、enable_if 在编译时评估。
参见:http://www.boost.org/doc/libs/1_61_0/libs/test/doc/html/boost_test/tests_organization/enabling.html
手动注册测试用例是乏味、无聊且容易出错的。如果您只需要通过平台来区分测试用例,那么我就不会通过配置我的构建系统在无关紧要的平台上编译不相关的测试用例。或者,您可以使用 Boost.Predef 为您可能想了解的有关操作系统、编译器等的所有内容定义必要的预处理器符号,这将允许您
#ifdef
进行某些测试。
最后,如果这个标准只能在运行时知道并且独立于您运行的平台,那么我会将依赖于特定标准的测试分组到套件中,并将构建使用的命令行调整为仅运行这些套件基于运行时标准。
您可以阻止注册它们,而不是跳过它们。 为此,您可以使用 boost.test 的手动测试注册:
#include <boost/test/included/unit_test.hpp>
using namespace boost::unit_test;
//____________________________________________________________________________//
void only_linux_test()
{
...
}
//____________________________________________________________________________//
test_suite*
init_unit_test_suite( int argc, char* argv[] )
{
if(/* is linux */)
framework::master_test_suite().
add( BOOST_TEST_CASE( &only_linux_test ) );
return 0;
}
另一种可能性是将 #ifdef ... #endif 与 BOOST_AUTO_TEST_CASE 一起使用。 因此,您需要一个在目标平台上编译代码时定义的定义。
#ifdef PLATFORM_IS_LINUX
BOOST_AUTO_TEST_CASE(onlyLinux)
{
...
}
#endif
此定义可以由您的构建环境设置。
以下是我要禁用的方法,例如,禁用不适合在某些情况下运行的交互式测试单元。
我将其放入我的预编译头中:
// preconditions for running some tests
#define PRECOND_ALLOWED_TO_TAKE_FOCUS \
*boost::unit_test::precondition([](boost::unit_test::test_unit_id) { return std::getenv("CI_NOFOCUS") == NULL; })
并更改目标测试,例如:
BOOST_AUTO_TEST_CASE(MyTestCase, PRECOND_ALLOWED_TO_TAKE_FOCUS)
{ ...