Boost测试框架是否支持测试依赖性?

时间:2013-07-11 21:49:09

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

我最喜欢的单元测试框架之一是PHPUnit,因为它支持测试依赖性(即能够将测试标记为依赖于其他测试,有条件地依赖于其依赖项运行依赖测试)。我最近一直在使用Boost testing framework来测试我的C ++代码,虽然它适合我的大多数单元测试需求,但它似乎不支持测试依赖性。

我已经搜索了Boost测试框架的文档,并找到了Boost支持此功能的various hints,但我还没有找到文档页面或测试依赖的任何具体示例支持Boost。先前给定的页面是红色的鲱鱼,还是Boost测试框架实际上是否支持测试依赖性?

2 个答案:

答案 0 :(得分:4)

嗯,你已经发现自己的功能就在那里,根据链接,最终用户可以使用它。 它不是偶然记录的,“应尽快添加”(根据链接)。

现在,我发现这是一个使用功能的帖子: http://boost.2283326.n4.nabble.com/Unit-Test-Framework-strange-behaviour-of-test-unit-depends-on-td2653654.html

来自那里的样本(不幸的是,看起来没有BOOST_AUTO_TEST_CASE在那里工作)。 另请注意代码不正确,因为永远不会调用Dependency(),因此依赖测试也不会运行。

#include <boost/test/included/unit_test.hpp>

using boost::unit_test::test_suite;

void Dependency()
{
  BOOST_MESSAGE( "Dependency!" );
  BOOST_CHECK( 1 );
}

void TC_TestCase()
{
  BOOST_MESSAGE( "A test case!" );
  BOOST_CHECK( 1 );
}

test_suite*
init_unit_test_suite( int argc, char* argv[] )
{
  test_suite* ts = BOOST_TEST_SUITE( "Test_Test" );

  ts->add( BOOST_TEST_CASE( &TC_TestCase ) );

/*1*/  ts->depends_on( BOOST_TEST_CASE( &Dependency ) );

  return ts;
} 

<强>更新

进行了一些实验,这是一个自动测试/套装和依赖项的例子。 关于代码的一些注意事项:

  1. 此处提升为1.42,新版本可能略有差异。
  2. 如果将test_suite2放在test_suite1后面的cpp文件中,保持依赖关系相同,将始终跳过test_suite1,因为test_suite2之前没有运行。
  3. 我让test_case4失败,以便跳过test_suite1,但如果test_case4成功,则test_suite1会执行。
  4. 我很确定你能够让依赖注册更漂亮更短。
  5. 代码:

    #include <boost/test/included/unit_test.hpp>
    using namespace boost::unit_test;
    
    BOOST_AUTO_TEST_SUITE(test_suite2)
    BOOST_AUTO_TEST_CASE(test_case4)
    {
        BOOST_CHECK(false);
    }
    
    BOOST_AUTO_TEST_SUITE_END()
    
    BOOST_AUTO_TEST_SUITE(test_suite1)
    BOOST_AUTO_TEST_CASE(test_case1) 
    { 
        BOOST_CHECK(true);
    }
    
    BOOST_AUTO_TEST_CASE(test_case2) 
    {
        BOOST_CHECK(true);
    }
    
    BOOST_AUTO_TEST_SUITE_END()
    
    
    //____________________________________________________________________________//
    
    test_suite*
    init_unit_test_suite( int argc, char* argv[] )
    {
        const auto testSuite1Id = framework::master_test_suite().get("test_suite1");
    
        if( testSuite1Id != INV_TEST_UNIT_ID ) {
            auto test_suite1 = &framework::get<test_suite>( testSuite1Id );
    
            const auto testSuite2Id = framework::master_test_suite().get("test_suite2");
            if (testSuite2Id != INV_TEST_UNIT_ID) {
                auto testSuite2 = &framework::get<test_suite>( testSuite2Id );
    
                const auto testCase4Id = testSuite2->get("test_case4");
                if (testCase4Id != INV_TEST_UNIT_ID) {
                    // test_suite1 depends on test_suite2/test_case4 
                    test_suite1->depends_on( &framework::get<test_case>( testCase4Id ));
                }
            }
        }
    
        return 0;
    }
    

    输出:

    Running 3 test cases...
    Entering test suite "Master Test Suite"
    Entering test suite "test_suite2"
    Entering test case "test_case4"
    <blahblahblah>/consoleapplication5/consoleapplication5.cpp(10): error in "test_case4": check false failed
    Leaving test case "test_case4"; testing time: 14ms
    Leaving test suite "test_suite2"
    Test suite "test_suite1"is skipped
    Leaving test suite "Master Test Suite"
    
    *** 1 failure detected in test suite "Master Test Suite"
    

答案 1 :(得分:1)

从Boost 1.59开始,您可以使用更好的工具:depends_onhttp://www.boost.org/doc/libs/1_59_0/libs/test/doc/html/boost_test/utf_reference/test_org_reference/decorator_depends_on.html

用法非常简单(来自Boost纪录片):

namespace utf = boost::unit_test;

BOOST_AUTO_TEST_CASE(test3, * utf::depends_on("s1/test1"))
{
  BOOST_TEST(false);
}

BOOST_AUTO_TEST_CASE(test4, * utf::depends_on("test3"))
{
  BOOST_TEST(false);
}

BOOST_AUTO_TEST_SUITE(s1)

  BOOST_AUTO_TEST_CASE(test1)
  {
    BOOST_TEST(true);
  }

BOOST_AUTO_TEST_SUITE_END()