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

C++ 获取所有boost测试套件/测试用例,c++,unit-testing,boost,boost-test,C++,Unit Testing,Boost,Boost Test,正如标题所说,我希望从测试应用程序中获取所有测试套件或测试用例(名称),无论是在控制台中还是作为xml输出。 测试框架是boost测试库 有没有办法实现这一目标?我在文档中没有发现任何有用的东西。如果不实际运行测试,恐怕没有简单的方法可以做到这一点 即使在那时,我脑海中唯一不涉及代码的东西是--log\u level=test\u suite和某种解析脚本,它可以找到“进入测试套件”、“离开测试套件”和“进入测试用例”消息(或者,如果您手头有xml解析器,则在同时放置--log_format=x

正如标题所说,我希望从测试应用程序中获取所有测试套件或测试用例(名称),无论是在控制台中还是作为xml输出。 测试框架是boost测试库


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

如果不实际运行测试,恐怕没有简单的方法可以做到这一点

即使在那时,我脑海中唯一不涉及代码的东西是
--log\u level=test\u suite
和某种解析脚本,它可以找到“进入测试套件”、“离开测试套件”和“进入测试用例”消息(或者,如果您手头有xml解析器,则在同时放置
--log_format=xml
时解析给定的xml)

但即使这样,添加的
BOOST\u TEST\u消息也会破坏日志,当然还会遇到错误和警告


看到boost测试框架只不过是标题中定义的一堆宏,您当然可以自己添加功能,如果您能够在查找列表的同时运行测试,那么添加另一种日志格式(仅列出套件和测试)可能是最简单的n使用。假设您有翻译单位(cpp文件)包含显式或自动生成的
main
,您可以在提供某个命令行参数时拦截测试执行。然后,您可以使用自定义的访问者遍历测试树,该访问者列出所有可用的测试。下面是一个小的工作示例,它通过编译和链接文件
main\t来创建测试运行程序t、 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 )
#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
#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
传递在上面定义的装置中使用的参数
list
,将导致

./somelib_testrunner1 
Running 4 test cases...

*** No errors detected
Suite: MyTestSuite
.Suite: TestA
..TestFoo
..TestBar
.Suite: TestB
..TestFoo
..TestBar
只有命令行选项,正是出于此目的。

在中介绍(即记录在案)。