获得所有升级测试套件/测试用例

时间:2014-08-19 13:43:11

标签: c++ unit-testing boost boost-test

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

有没有选择来实现这一目标?我没有在文档中找到任何有用的东西。

3 个答案:

答案 0 :(得分:3)

只有--list_content命令行选项,完全是出于此目的。

答案 1 :(得分:2)

使用global fixture可以在没有太多入侵的情况下完成此操作。假设您有一个显式或自动生成的包含main的转换单元(cpp文件),您可以在提供某个命令行参数时拦截测试执行。然后,您可以使用自定义访问者遍历测试树,该访问者列出了所有可用的测试。这是一个小工作示例,它通过编译和链接文件main_test.cppa.cppb.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 )

<强> 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

<强> 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

调用没有任何参数的跑步者会导致

./somelib_testrunner1 
Running 4 test cases...

*** No errors detected

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

Suite: MyTestSuite
.Suite: TestA
..TestFoo
..TestBar
.Suite: TestB
..TestFoo
..TestBar

答案 2 :(得分:1)

我担心没有实际运行测试就没有简单的方法。

即便如此,在没有触及代码的情况下我唯一想到的就是--log_level=test_suite和某种解析脚本,它会找到&#34;进入测试套件&#34;,&#34;离开测试套件&#34;和&#34;进入测试用例&#34;消息(或解析当你放置--log_format=XML时给出的xml,如果你手头有一个xml解析器)。

但即使这会使用您添加的BOOST_TEST_MESSAGE来破坏日志,当然也会遇到错误和警告。

看看boost测试框架如何不仅仅是标头中定义的一堆宏,你当然可以自己添加功能,可能最简单的方法是添加另一种日志格式,只列出套件和测试,假设你是找到列表时运行测试很好。