C++ 获取所有boost测试套件/测试用例
正如标题所说,我希望从测试应用程序中获取所有测试套件或测试用例(名称),无论是在控制台中还是作为xml输出。 测试框架是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
有没有办法实现这一目标?我在文档中没有发现任何有用的东西。如果不实际运行测试,恐怕没有简单的方法可以做到这一点 即使在那时,我脑海中唯一不涉及代码的东西是
--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
只有命令行选项,正是出于此目的。在中介绍(即记录在案)。