Fel*_*lix 5 c++ boost unit-testing boost-test
正如标题所说,我想从测试应用程序、控制台中的以太或 xml 输出中获取所有测试套件或测试用例(名称)。测试框架是 boost 测试库。
有没有办法实现这一目标?我在文档中没有发现任何有用的东西。
使用全局固定装置可以在不造成太多干扰的情况下完成此操作。假设您有一个包含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)