Порівняння тестових рамок одиниць С ++ [закрито]


299

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

Я думаю, що найцікавіші рамки - це CppUnit, Boost та нова тестова основа Google. Хтось ще робив якесь порівняння?



У мене є власна система тестування на основі МОК, яка мені більше подобається, тому що це не просто клон того, що роблять всі інші, а вирішує те, що я вважаю всіма проблемами інших. Ви пишете тестові випадки, виходячи з класу, а не використовуючи макроси. Макроси використовуються лише для тверджень, оскільки вони дають вам рефлексію. Індивідуальний вихід статистики тестування. Запустіть сценарій МОК, щоб ви обирали тестування, як часто та з якими параметрами.
CashCow

і це блискуче з точки зору розвитку, тому що коли я додаю власний тест, я можу запустити його, не запускаючи всіх інших одночасно. Тож я знаю, що мій код працює.
CashCow

Відповіді:


99

Дивіться це питання для деякого обговорення.

Вони рекомендують статті: Дослідження рамкових тестувань рамкових джунглів C ++ , Ноель Льопис. І новіші: рамки тестового блоку C ++

Я ще не знайшов статті, яка б порівнювала googletest з іншими рамками.


Як я вже писав: усі відповіді просто рекомендують один із рамок, але не порівнюють рамки з іншими.
домогосподарка

Ви також не задоволені статтею?
Gishu

7
Одна критика: стаття, хоча і хороша, є з 2004 року і не включає Google Test.
richq

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 автоматично визначає ваші тести і не вимагає від вас їх перерахувати, щоб запустити їх
  • Зручте розширити свій словниковий запас
  • Тести на смерть (див. Розширений посібник)
  • SCOPED_TRACE для циклів підпрограми
  • Ви можете вирішити, які тести потрібно запустити
  • Генерація звіту про тест XML
  • Світильники / макети / шаблони ...

3
Мені дуже подобається використовувати тест google для деяких інших фреймворків, особливо з його глузливими можливостями, які можна знайти в рамках googlemock.
Майк

8
Я надаю всі ці функції (хоча деякі ще не є загальнодоступними) та інше в моїй новій тестовій структурі CATCH. Дивіться мою відповідь за посиланням.
фільтрований

2
поєднуючи його разом з Google C ++ Mocking Framework, це робить дійсно потужну тестову рамку xUnit для одиничного тестування коду C ++.
ratkok

5
@CashCow Запуск зі збіркою дещо відрізняється від тестового виявлення. Запуск з збіркою залежить від вашої системи збирання. Визначення тесту означає, що вам не доведеться перераховувати всі тести в іншому класі, просто створіть методи тестів і все.
Wernight

Мені не подобається їхнє надмірне використання макросів, а також те, що вони використовують такі слова, як TEST, які можуть зіткнутися з чимось. GTEST було б краще, менше шансів зіткнутись.
CashCow

112

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

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

Він також має прив'язки Objective-C. Проект проводиться на Github


Зверніть увагу на додавання CHECK_FLASEта REQUIRE_FLASEмакроси.
Еміль Корм'є

6
Найкраща рамка на мій погляд.
CoffeDeveloper

3
doctest - це моє повторне реалізація Catch з величезним акцентом на швидкості компіляції
перевірте

@einpoklum Catch не відмовився - творець працює над версією 2 бібліотеки. doctest - це щось на зразок повторного втілення Catch 1 з деякими бонусними дизайнерськими рішеннями
onqtam

2
Я справді втрачаю, коли порівнюю всі тестувальні рамки (одну з яких мені зараз потрібно вибрати). Ви б написали власну відповідь, порівнюючи та протиставляючи doctest із програмою Catch та іншими пропозиціями?
einpoklum

53

Тест-бібліотека Boost - дуже хороший вибір, особливо якщо ви вже використовуєте 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 ++: Підручник з підвищення тесту


Раніше я використовував тест Boost, який мені сподобався, за винятком того, що він, схоже, значно змінився між релізами. Для мого клієнта було досить складно продати тестування одиниць, не витрачаючи більше часу (і їх грошей) на виправлення тестів, коли API змінювався, ніж на виправлення коду, який він мав на увазі тестувати. Врешті-решт я викинув це і написав своє - це було близько 5 років тому.
Компонент 10

5
Посилання на підручник розірвано
mloskot

2
@mloskot Це працює знову.
Кріс Єстер-Янг

@mloskot Вибачте за це, будь ласка, надішліть мені електронний лист, якщо ви побачите, що він зламаний. Це легко знайти, ніж коментар. :)
Wernight

@Wernight Yup, працює знову. Thx
mloskot


16

Нещодавно я випустив xUnit ++ , зокрема як альтернативу Google Test та тестовій бібліотеці Boost (переглянути порівняння ). Якщо ви знайомі з 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";
  • Світильники
  • Тести, керовані даними (Теорії)
  • Виберіть тести, які потрібно запускати, ґрунтуючись на:
    • Збіг атрибутів
    • Назвіть підрядок matchin
    • Тестові набори

2
Питання - це запитання для порівняння. IMO, важливо представити, які відмінності між вашими рамками і, принаймні, двома популярними: googletest та Boost. Тим більше, якщо ви рекламуєте xUnit ++ як альтернативу цим двом. Буде +1, якщо оновлено :)
mloskot

Справедливо. :) У мене вже є таблиця порівняння у вікі , але я спробую підсумувати декілька відмінностей безпосередньо у своїй відповіді.
moswald

1
Я вирішив просто зв’язати таблицю вікі безпосередньо, вона захаращувала резюме, щоб перерахувати все це.
moswald

посилання працює для мене, дякую! +1
mloskot

1
ваш проект припинено? Остання фіксація припадає на 09/2015 ... У будь-якому випадку, чудова відповідь. Дякую.
zertyz

5

CppUTest - дуже приємний, легкий фреймворк з макетними бібліотеками. Варто придивитись уважніше.


4

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

#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:

  • Автоматичне генерування тестових даних та вхідних аргументів (навіть для складних типів даних)
  • Сучасні та багаторазові спеціалізовані типи замість світильників та шаблонів
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.