Поддерживает ли среда тестирования Boost тестовые зависимости?

Одна из моих любимых платформ модульного тестирования - PHPUnit, потому что она поддерживает тестовые зависимости (то есть возможность помечать тесты как зависимые от других тестов, выполняя зависимые тесты при условии успешности их зависимостей). Я недавно использовал платформу Boost-тестирования для тестирования своего кода C++, и, хотя он удовлетворяет большинству моих потребностей в модульном тестировании, он не поддерживает тестовые зависимости.

Я изучил документацию для среды тестирования Boost и обнаружил различные подсказки, что Boost поддерживает эту функцию, но мне еще предстоит найти страницу документации или какие-либо конкретные примеры поддержки тестовых зависимостей в Boost. Являются ли ранее предоставленные страницы красными сельдями или среда тестирования Boost действительно поддерживает тестовые зависимости?

2 ответа

Решение

Ну, вы обнаружили, что эта функция есть, и по ссылкам она доступна для конечного пользователя. Это не задокументировано случайно и "должно быть добавлено в ближайшее время" (по ссылкам).

Вот еще один пост, который я нашел и который использует функцию: 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. Я уверен, что вы сможете сделать регистрацию зависимостей намного красивее и короче.

Код:

#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 у вас есть лучшие инструменты для этого: 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()
Другие вопросы по тегам