我最喜欢的单元测试框架之一是PHPUnit,因为它支持测试依赖项(即能够将测试标记为依赖于其他测试,根据依赖项的成功有条件地运行依赖测试)。我最近一直在使用Boost 测试框架来测试我的 C++ 代码,虽然它适合我的大多数单元测试需求,但它似乎不支持测试依赖项。
我搜索了 Boost 测试框架的文档,发现了 Boost 支持此功能的各种 提示,但我还没有找到文档页面或 Boost 中测试依赖支持的任何具体示例。之前给出的页面是红鲱鱼,还是 Boost 测试框架实际上支持测试依赖项?
我最喜欢的单元测试框架之一是PHPUnit,因为它支持测试依赖项(即能够将测试标记为依赖于其他测试,根据依赖项的成功有条件地运行依赖测试)。我最近一直在使用Boost 测试框架来测试我的 C++ 代码,虽然它适合我的大多数单元测试需求,但它似乎不支持测试依赖项。
我搜索了 Boost 测试框架的文档,发现了 Boost 支持此功能的各种 提示,但我还没有找到文档页面或 Boost 中测试依赖支持的任何具体示例。之前给出的页面是红鲱鱼,还是 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;
}
更新
进行了一些实验,这是一个带有自动测试/套装和依赖项的示例。关于代码的一些注释:
test_suite2
aftertest_suite1
在 cpp 文件中,保持依赖关系相同,test_suite1 将始终被跳过,因为test_suite2
它之前没有运行。test_case4
失败了,所以test_suite1
跳过了,但如果test_case4
成功,test_suite1
则执行。编码:
#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"
从 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()