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

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

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

Ответ 2

Новый игрок Google Test (также известный как Google С++ 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 автоматически обнаруживает ваши тесты и не требует, чтобы вы перечисляли их для их запуска.
  • Упростите расширить словарь словаря утверждения
  • Тесты смерти (см. расширенное руководство)
  • SCOPED_TRACE для подпрограммных циклов
  • Вы можете выбрать , который тестирует для запуска
  • XML генерация отчета об испытаниях
  • Светильники/ Шаблоны/ Шаблоны...

Ответ 3

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

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

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

Ответ 4

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 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: Я написал статью об этом, которая может помочь вам начать работу: С++ Unit Testing Framework: Учебное пособие по повышению эффективности

Ответ 6

Недавно я выпустил 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: Assert.Equal(-1, foo(i)) << "Failed with i = " << i;
  • Тестирование: Log.Debug << "Starting test"; Log.Warn << "Here a warning";
  • Светильники
  • Проверки, основанные на данных (теории)
  • Выберите, какие тесты следует запускать на основе:
    • Соответствие атрибутов
    • Имя подстроки matchin
    • Test Suites

Ответ 7

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

Ответ 8

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. Очень приятно!

Ответ 10

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

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

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

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

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