13

如何跳过 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 单元测试?

4

4 回答 4

9

BOOST_AUTO_TEST_CASE(a_test_name,*boost::unit_test::disabled())

{
   ...
}
于 2017-11-24T16:12:08.633 回答
8

使用 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))
{...}

先决条件在运行时评估,enable, enable_if 在编译时评估。

请参阅: http: //www.boost.org/doc/libs/1_61_0/libs/test/doc/html/boost_test/tests_organization/enabling.html

于 2016-07-08T11:06:32.107 回答
4

手动注册测试用例是乏味、乏味且容易出错的。如果您只需要按平台区分测试用例,那么我根本不会通过配置我的构建系统在无关紧要的平台上编译不相关的测试用例。或者,您可以使用Boost.Predef为您可能想了解的有关操作系统、编译器等的所有内容定义必要的预处理器符号,这将允许您进行#ifdef某些测试。

最后,如果这个标准只能在运行时知道并且独立于您正在运行的平台,那么我会将依赖于特定标准的测试分组到套件中,并调整构建使用的命令行以仅运行那些基于运行时标准的套件。

于 2014-08-08T21:47:49.553 回答
3

您可以阻止注册它们,而不是跳过它们。为此,您可以使用 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;
}

有关更多信息,请参见http://www.boost.org/doc/libs/1_53_0/libs/test/doc/html/utf/user-guide/test-organization/manual-nullary-test-case.html

另一种可能性是将#ifdef ... #endif 与BOOST_AUTO_TEST_CASE 一起使用。因此,如果您在目标平台上编译代码,您需要一个定义。

#ifdef PLATFORM_IS_LINUX

BOOST_AUTO_TEST_CASE(onlyLinux)
{
    ...
}
#endif

例如,此定义可以由您的构建环境设置。

于 2013-06-05T09:44:26.743 回答