【问题标题】:Does the Boost testing framework support test dependencies?Boost 测试框架是否支持测试依赖项?
【发布时间】:2013-07-10 08:36:14
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    嗯,您已经发现该功能已经存在,并且根据链接,它可供最终用户使用。 它不是偶然记录的,并且“应该尽快添加”(根据链接)。

    现在,这是我发现的另一个使用功能的帖子: 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. 如果在 cpp 文件中将 test_suite2 放在 test_suite1 之后,保持依赖关系相同,将始终跳过 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"
    

    【讨论】:

    • 感谢您提供具体的语法。我认为自从大约 3 年前提出这个问题以来,文档现在应该已经修复了,但似乎情况并非如此。您在回答中提到了“BOOST_AUTO_TEST_CASE”,所以我想问一下:有没有办法从通过 Boost 中的自动注册提交的测试用例中调用“depends_on”功能?如果没有,我找到了一个名为 NCBI 的库,它支持可能支持测试依赖项的宏语法。
    • 更新了自动测试用例和套件注册的答案。
    • 请注意,尽管如此,测试不会按依赖顺序执行。如果您首先声明了 test_suite1,它将被跳过,因为 test_case4 “失败”,因为它还没有运行。
    【解决方案2】:

    从 Boost 1.59 开始,您有更好的工具:depends_on:http://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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      • 2011-06-14
      • 1970-01-01
      相关资源
      最近更新 更多