2

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

我搜索了 Boost 测试框架的文档,发现了 Boost 支持此功能的各种 提示,但我还没有找到文档页面或 Boost 中测试依赖支持的任何具体示例。之前给出的页面是红鲱鱼,还是 Boost 测试框架实际上支持测试依赖项?

4

2 回答 2

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. 这里的 Boost 是 1.42,新版本可能会有细微差别。
  2. 如果你把test_suite2aftertest_suite1在 cpp 文件中,保持依赖关系相同,test_suite1 将始终被跳过,因为test_suite2它之前没有运行。
  3. test_case4失败了,所以test_suite1跳过了,但如果test_case4成功,test_suite1则执行。
  4. 我很确定您将能够使依赖项注册更漂亮和更短。

编码:

#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"
于 2013-07-11T22:46:54.033 回答
2

从 Boost 1.59 开始,您有更好的工具:http depends_on: //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()
于 2016-06-07T08:30:41.057 回答