Сравнение структур модульных тестов C ++ [закрыто]

300

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

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

housemaister
источник
2
возможный дубликат
модульного
У меня есть своя собственная основанная на IOC инфраструктура тестирования, которая мне нравится больше, потому что это не просто клон того, что делают все остальные, а то, что я считаю всеми проблемами других. Вы пишете тестовые случаи, производные от класса, а не с помощью макросов. Макросы используются только для утверждений, поскольку они дают вам отражение. Индивидуальный вывод статистики тестирования. Запустите из сценариев IOC, чтобы выбрать, что вы тестируете, как часто и с какими параметрами.
CashCow
и это замечательно с точки зрения разработки, так как, когда я добавляю свой собственный тест, я могу его запустить, не запуская при этом всех остальных одновременно. Так что я знаю, что мой код работает.
CashCow

Ответы:

99

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

Они рекомендуют статьи: Изучение инфраструктуры джунглей модульного тестирования C ++ , Ноэль Ллопис. И последнее: C ++ Test Unit Frameworks

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

Сэм Шафран
источник
Как я уже писал: все ответы просто рекомендуют одну из структур, но не сравнивают структуру с другой.
горничная
Ты тоже не доволен этой статьей?
Гишу
7
Одна критика: статья, хотя и хорошая, написана в 2004 году и не содержит Google Test.
Ричк
2
В первой ссылке вы увидите два сравнения. За исключением нового фреймворка от Google, большая часть информации все еще актуальна. (И CppUnit не самый интересный, он слишком неуклюжий для использования)
Люк Эрмитт
1
исправил ссылки и расширил ответ более свежим сравнением
Сэм Саффрон
120

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

#include <gtest/gtest.h>

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
  • Светильники / Макет / Шаблоны ...
Wernight
источник
3
Мне действительно нравится использовать тест Google над некоторыми другими фреймворками, особенно с его возможностями насмешки, которые можно найти в фреймворке googlemock.
Майк
8
Я предоставляю все эти функции (хотя некоторые еще не опубликованы) и многое другое в моей новой тестовой среде CATCH. Смотрите мой ответ для ссылки.
philsquared
2
объединение его с Google C ++ Mocking Framework делает его действительно мощным тестовым фреймворком xUnit для модульного тестирования кода C ++.
Раткок
5
@CashCow Запуск со сборкой отличается от обнаружения тестов. Запуск со сборкой зависит от вашей системы сборки. Обнаружение тестов означает, что вам не нужно перечислять все тесты в другом классе, просто создайте методы тестов и все.
Ночь
Мне не нравится их чрезмерное использование макросов и тот факт, что используются общие слова, такие как TEST, которые могут что-то конфликтовать. ГТЭСТ будет лучше, с меньшей вероятностью столкновения.
CashCow
112

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

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

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

philsquared
источник
Пожалуйста, рассмотрите добавление CHECK_FLASEи REQUIRE_FLASEмакросы.
Эмиль Кормиер
6
Лучшие рамки на мой взгляд.
CoffeDeveloper
3
doctest - это моя новая реализация Catch с огромным акцентом на скорость компиляции - ознакомьтесь с FAQ, чтобы увидеть, чем они отличаются
onqtam 10.10.16
@einpoklum Catch не заброшен - создатель работает над версией 2 библиотеки. doctest является своего рода повторной реализацией Catch 1 с некоторыми бонусными дизайнерскими решениями
onqtam
2
Я действительно в растерянности, сравнивая все рамки тестирования (одну из которых мне сейчас нужно выбрать). Не могли бы вы написать свой ответ, сравнивая и сравнивая doctest с Catch и другими предложениями?
einpoklum
53

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

// TODO: Include your class to test here.
#define BOOST_TEST_MODULE MyTest
#include <boost/test/unit_test.hpp>

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: Учебное пособие по тестированию

Wernight
источник
Я использовал тест Boost, и он мне понравился, за исключением того, что он значительно изменился между выпусками. Было довольно сложно продавать модульное тестирование моему клиенту, не тратя больше моего времени (и их денег) на исправление тестов при изменении API, чем на исправление кода, который он должен был тестировать. В конце концов я бросил это и написал свой - хотя это было около 5 лет назад.
Компонент 10
5
Ссылка на учебник не работает
mloskot
2
@mloskot Это снова работает.
Крис Шут-Янг
@mloskot Извините за это, пожалуйста, пришлите мне по электронной почте, если вы видите, что он сломан. Это легко найти, чем комментарий. :)
Wernight
@ Weernight Да, снова работает. Thx
mloskot
16

Недавно я выпустил 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 ++)
  • Сравнивает коллекции изначально.
  • Утверждения бывают трех уровней:
    • фатальные ошибки
    • несмертельные ошибки
    • предупреждения
  • Простая регистрация утверждений :Assert.Equal(-1, foo(i)) << "Failed with i = " << i;
  • Тестовая регистрация:Log.Debug << "Starting test"; Log.Warn << "Here's a warning";
  • арматура
  • Управляемые данными тесты (Теории)
  • Выберите, какие тесты запустить на основе:
    • Соответствие атрибута
    • Имя подстроки соответствия
    • Test Suites
moswald
источник
2
Вопрос спрашивает для сравнения. ИМО, жизненно важно представить разницу между вашей платформой и, по крайней мере, двумя популярными: googletest и Boost. Особенно, если вы рекламируете xUnit ++ как альтернативу этим двум. Будет +1, если обновится :)
mloskot
Справедливо. :) У меня уже есть таблица сравнения в вики , но я постараюсь обобщить некоторые из различий непосредственно в своем ответе.
Мосвальд
1
Я решил просто связать таблицу вики напрямую, она загромождала сводку, чтобы перечислить все это.
Мосвальд
ссылка работает для меня, спасибо! +1
mloskot
1
Ваш проект был прекращен? Последний коммит датируется 09/2015 ... В любом случае, отличный ответ. Спасибо.
Zertyz
5

CppUTest - очень приятный, легкий фреймворк с фиктивными библиотеками. Стоит присмотреться.

ratkok
источник
4

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

#include <cpunit>

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. Очень хорошо!

Роджер
источник
2

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

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

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

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

  • Автоматическая генерация тестовых данных и входных аргументов (даже для сложных типов данных)
  • Современные и многократно используемые специализированные типы вместо шаблонов и шаблонов
linuxbuild
источник