Сравнение c ++ единичных тестовых фреймворков

Я знаю, что уже есть несколько вопросов относительно рекомендаций для модульных тестовых фреймворков c ++, но все ответы не помогли, поскольку они просто рекомендуют одну из фреймворков, но не предоставляют никакой информации о (функциональном) сравнении.

Я думаю, что наиболее интересными структурами являются CppUnit, Boost и новая платформа тестирования Google. Кто-нибудь еще делал сравнение?

См. Этот вопрос для обсуждения.

Они рекомендуют статьи: Изучение C ++ Unit Testing Framework Jungle , Noel Llopis. И последнее: C ++ Test Unit Frameworks

Я еще не нашел статью, которая сравнивает googletest с другими фреймворками.

Новым игроком является Google Test (также известный как Google C ++ Testing Framework ), который довольно хорош.

#include  TEST(MyTestSuitName, MyTestCaseName) { int actual = 1; EXPECT_GT(actual, 0); EXPECT_EQ(1, actual) << "Should be equal to one"; } 

Основные возможности:

  • портативный
  • Фатальные и нефатальные утверждения
  • Легкие утверждения информативные сообщения : ASSERT_EQ(5, Foo(i)) << " where i = " << i;
  • Google Test автоматически обнаруживает ваши тесты и не требует, чтобы вы перечисляли их для их запуска
  • Упростите расширение словарного запаса
  • Испытания на смерть (см. Расширенный справочник)
  • SCOPED_TRACE для подпрограмм
  • Вы можете решить, какие тесты будут выполняться
  • Генерация отчета XML- теста
  • Светильники / Макет / Шаблоны ...

Я просто подтолкнул свои собственные frameworks, CATCH , там. Он все еще находится в разработке, но я считаю, что он уже превосходит большинство других структур. У разных людей разные критерии, но я пытался охватить большинство из них без слишком большого количества компромиссов. Взгляните на мою связанную запись в блоге для дегустатора. Мои пять лучших функций:

  • Только заголовок
  • Автоматическая регистрация тестов на основе функций и методов
  • Разлагает стандартные выражения C ++ в LHS и RHS (так что вам не нужен целый семейство макросов assert).
  • Поддержка вложенных разделов в функциональном устройстве
  • Идентификационные тесты с использованием естественного языка – генерируются имена функций / методов

Он также имеет привязки Objective-C. Проект размещен на Github

Boost Test Library – очень хороший выбор, особенно если вы уже используете Boost.

 // TODO: Include your class to test here. #define BOOST_TEST_MODULE MyTest #include  BOOST_AUTO_TEST_CASE(MyTestCase) { // To simplify this example test, let's suppose we'll test 'float'. // Some test are stupid, but all should pass. float x = 9.5f; BOOST_CHECK(x != 0.0f); BOOST_CHECK_EQUAL((int)x, 9); BOOST_CHECK_CLOSE(x, 9.5f, 0.0001f); // Checks differ no more then 0.0001% } 

Он поддерживает:

  • Автоматическая или ручная регистрация тестов
  • Многие утверждения
  • Автоматическое сравнение коллекций
  • Различные форматы вывода (включая XML )
  • Светильники / Шаблоны

PS: Я написал статью об этом, которая может помочь вам начать работу: C ++ Unit Testing Framework: Учебное пособие по повышению эффективности

В Википедии имеется полный список инфраструктур модульного тестирования с таблицами, которые идентифицируют поддерживаемые функции.

Недавно я выпустил xUnit ++ , в качестве альтернативы Google Test и Boost Test Library (просмотрите сравнения ). Если вы знакомы с xUnit.Net, вы готовы к xUnit ++.

 #include "xUnit++/xUnit++.h" FACT("Foo and Blah should always return the same value") { Check.Equal("0", Foo()) << "Calling Foo() with no parameters should always return \"0\"."; Assert.Equal(Foo(), Blah()); } THEORY("Foo should return the same value it was given, converted to string", (int input, std::string expected), std::make_tuple(0, "0"), std::make_tuple(1, "1"), std::make_tuple(2, "2")) { Assert.Equal(expected, Foo(input)); } 

Основные возможности:

  • Невероятно быстро: тесты запускаются одновременно .
  • портативный
  • Автоматическая регистрация теста
  • Многие типы утверждений (Boost ничего не имеет на xUnit ++)
  • Сравнивает коллекции изначально.
  • Утверждения бывают трех уровней:
    • фатальные ошибки
    • нефатальные ошибки
    • предупреждения
  • Easy assert logging: Assert.Equal(-1, foo(i)) << "Failed with i = " << i;
  • Тестирование : Log.Debug << "Starting test"; Log.Warn << "Here's a warning"; Log.Debug << "Starting test"; Log.Warn << "Here's a warning";
  • арматура
  • Проверки, основанные на данных (теории)
  • Выберите, какие тесты следует запускать на основе:
    • Соответствие атрибутов
    • Название подстроки matchin
    • Тест-classы

CppUTest – очень приятная, легкая структура с макетными библиотеками. Стоит присмотреться.

CPUnit ( http://cpunit.sourceforge.net ) – это структура, которая похожа на Google Test, но которая опирается на меньшее количество макросов (утверждает функции) и где macros префиксны, чтобы избежать обычной макроповерхности. Тесты выглядят так:

 #include  namespace MyAssetTest { using namespace cpunit; CPUNIT_FUNC(MyAssetTest, test_stuff) { int some_value = 42; assert_equals("Wrong value!", 666, some_value); } // Fixtures go as follows: CPUNIT_SET_UP(MyAssetTest) { // Setting up suite here... // And the same goes for tear-down. } } 

Они автоматически регистрируются, поэтому вам нужно не больше этого. Затем он просто компилируется и запускается. Я считаю, что использование этой структуры очень похоже на использование JUnit, для тех, кому пришлось потратить некоторое время на программирование Java. Очень хорошо!

На сайте http://www.progweap.com/resources.html есть некоторые релевантные ресурсы тестирования модhive C ++

API Sanity Checker – тестовая среда для библиотек C / C ++:

Автоматический генератор базовых модульных тестов для общей библиотеки C / C ++. Он способен генерировать разумные (в большинстве, но, к сожалению, не во всех случаях) входные данные для параметров, и составлять простые («здравомыслящие» или «мелкие» -качества) тестовые примеры для каждой функции в API посредством анализа объявлений в заголовке файлы.

Качество сгенерированных тестов позволяет проверить отсутствие критических ошибок в простых случаях использования. Инструмент способен создавать и выполнять сгенерированные тесты и обнаруживать сбои (segfaults), прерывания, все виды излучаемых сигналов, ненулевой код возврата программы и зависание программы.

Уникальные возможности по сравнению с CppUnit, Boost и Google Test:

  • Автоматическая генерация тестовых данных и входных аргументов (даже для сложных типов данных)
  • Современные и многоразовые специализированные типы вместо светильников и шаблонов
  • Logging, Aspect Oriented Programming и Injection Dependency Injection - Попытка понять все это
  • Как запустить NUnit в режиме отладки из Visual Studio?
  • Очистка после всех тестов junit
  • Есть ли хорошие инструменты или ресурсы TDD для VB6?
  • Чтобы проверить настраиваемую директиву angularjs validation
  • Xml-SelectNodes с пространством имен по умолчанию через XmlNamespaceManager не работает как ожидалось
  • Mocking $ modal в модульных тестах AngularJS
  • Как сравнить два объекта в модульном тесте?
  • Как я могу проверить события в угловом?
  • Как протестировать веб-сервис Джерси REST?
  • Издевательские статические методы с Mockito
  • Давайте будем гением компьютера.