获取所有 boost 测试套件/测试用例

Fel*_*lix 5 c++ boost unit-testing boost-test

正如标题所说,我想从测试应用程序、控制台中的以太或 xml 输出中获取所有测试套件或测试用例(名称)。测试框架是 boost 测试库。

有没有办法实现这一目标?我在文档中没有发现任何有用的东西。

Raf*_*ffi 6

只有--list_content命令行选项,正是为此目的。


Ton*_*Big 4

使用全局固定装置可以在不造成太多干扰的情况下完成此操作。假设您有一个包含main显式或自动生成的翻译单元(cpp 文件),则可以在提供特定命令行参数时拦截测试执行。然后,您可以使用自定义访问者遍历测试树,其中列出了所有可用的测试。main_test.cpp这是一个小型工作示例,它通过编译和链接文件、a.cpp和 来创建测试运行器b.cpp

main_test.cpp

#include <string>
#include <iostream>

// --- Boost Includes ---
#define BOOST_TEST_MODULE MyTestSuite
#define BOOST_TEST_DYN_LINK
#include <boost/test/unit_test.hpp>

using namespace boost::unit_test;

struct Visitor : test_tree_visitor
{
  size_t level = 0;

  void visit( test_case const& test )
  {
    std::string indentation( level, '.' );

    std::cout << indentation << test.p_name << std::endl;
  }

  bool test_suite_start( test_suite const& suite )
  {
    std::string indentation( level, '.' );
    level++;

    std::cout << indentation << "Suite: " << suite.p_name << std::endl;
    return true;
  }

  void test_suite_finish( test_suite const& suite )
  {
    level--;
  }
};

struct GlobalFixture
{
  GlobalFixture( )
  {
    int argc = framework::master_test_suite( ).argc;
    for ( int i = 0; i < argc; i++ )
    {
      std::string argument( framework::master_test_suite( ).argv[i] );

      if ( argument == "list" )
      {
        Visitor visitor;

        traverse_test_tree( framework::master_test_suite( ), visitor );

        exit( EXIT_SUCCESS );
      }
    }
  }

};

BOOST_GLOBAL_FIXTURE( GlobalFixture )
Run Code Online (Sandbox Code Playgroud)

a.cpp

#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_SUITE ( TestA )

BOOST_AUTO_TEST_CASE ( TestFoo )
{
  BOOST_CHECK(true);
}

BOOST_AUTO_TEST_CASE ( TestBar )
{
  BOOST_CHECK(true);
}

BOOST_AUTO_TEST_SUITE_END() // TestA
Run Code Online (Sandbox Code Playgroud)

b.cpp

#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_SUITE ( TestB )

BOOST_AUTO_TEST_CASE ( TestFoo )
{
  BOOST_CHECK(true);
}

BOOST_AUTO_TEST_CASE ( TestBar )
{
  BOOST_CHECK(true);
}

BOOST_AUTO_TEST_SUITE_END() // TestA
Run Code Online (Sandbox Code Playgroud)

调用不带任何参数的运行程序会导致

./somelib_testrunner1 
Running 4 test cases...

*** No errors detected
Run Code Online (Sandbox Code Playgroud)

list传递上面定义的固定装置中使用的参数会导致

Suite: MyTestSuite
.Suite: TestA
..TestFoo
..TestBar
.Suite: TestB
..TestFoo
..TestBar
Run Code Online (Sandbox Code Playgroud)