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

问题描述:

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

我已经冲刷了加速测试框架的文件,并发现varioushints能够提升支持此功能,但我还没有找到一个文档页面或在加速测试的依赖性支持任何具体的例子。以前给出的页面是否会变成鲱鱼,还是Boost测试框架实际上支持测试依赖性?

嗯,你已经发现自己的功能在那里,根据链接,它是在那里供最终用户使用。 它没有记录在案,并且“应该很快加入”(按照链接)。

现在,这里是一个诺特尔后我发现它使用特征:从那里 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. 如果您在cpp文件中将test_suite1放在test_suite2之后,保持相关性相同,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" 
+0

感谢您提供具体的语法。我曾认为,自从3年前提出这个问题以来,文件现在已经得到修复,但事实似乎并非如此。 你在回答中提到了“BOOST_AUTO_TEST_CASE”,所以我想问一下:有什么方法可以通过Boost中的自动注册提交的测试用例调用“depends_on”功能?如果没有,我找到一个名为NCBI的库,它支持可能支持测试依赖性的宏语法。 – churay

+0

更新答案,注册自动测试案例和套件。 – biocomp

+0

请注意,尽管如此,测试不会以依赖性顺序执行。如果你首先声明了test_suite1,它将被跳过,因为test_case4“失败”,因为它还没有运行。 – namezero

开始升压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()