【问题标题】:How to skip a BOOST unit test?如何跳过 BOOST 单元测试?
【发布时间】:2013-05-31 12:11:43
【问题描述】:

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

【问题讨论】:

    标签: c++ unit-testing boost


    【解决方案1】:

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

    {
       ...
    }
    

    【讨论】:

    【解决方案2】:

    使用 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

    【讨论】:

    • 太棒了!这正是我一直在寻找的(过去)。我会用我们的几个测试来检查一下。
    • @Horus,有没有办法在前提条件下使用夹具?
    • @mojo 你可以看看我的代码github.com/precice/precice/blob/develop/src/testing/Testing.hpp。我使用装饰器从测试树中删除测试,它也可能适用于固定装置。请注意,我的代码可能使用非官方的 boost API。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 我不能使用 ifdefs,其中一些标准必须在执行时确定。我可能会使用您的注册建议之类的东西,谢谢。
      猜你喜欢
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多