Модульное тестирование кода С++ - Инструменты и методология

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

Знаете ли вы хороший инструмент, который может помочь мне написать модульные тесты на С++? Может быть, что-то похожее на Junit или Nunit?

Может ли кто-нибудь дать хороший совет по методологии написания модульных тестов для модулей, которые были написаны без модульного тестирования?

Ответ 2

Недавно Google выпустила свою собственную библиотеку для тестирования модулей на С++, называемых Google Test.

Проект в Google Code

Ответ 3

Отметьте отличное сравнение между несколькими доступными наборами. Автор этой статьи позже разработал UnitTest ++.

Что мне особенно нравится в этом (кроме того, что он отлично справляется с исключениями и т.д.), существует очень ограниченное количество "администрирования" вокруг тестовых примеров и определения тестовых приборов.

Ответ 4

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

Ответ 5

Noel Llopis of Games From Within является автором Изучение Jungle Framework Unit Testing Framework Jungle, всеобъемлющей (но теперь устаревшей) оценки различные С++ Unit Testing framework, а также книгу по программированию игр.

Он долгое время использовал CppUnitLite, фиксируя разные вещи, но в конечном итоге объединил усилия с другим автором библиотеки unit test и выпустил UnitTest ++. Мы используем UnitTest ++ здесь, и мне это очень нравится, до сих пор. У этого есть (для меня) точный правильный баланс сил с небольшой площадью.

Я использовал домашние решения, CxxTest (для чего требуется Perl) и boost:: test. Когда я реализовал модульное тестирование здесь на моем текущем задании, он в значительной степени спустился к UnitTest ++ vs boost:: test.

Мне очень нравятся самые мощные библиотеки, которые я использовал, но IMHO, boost:: test - слишком тяжело. Мне особенно не понравилось, что он требует от вас (AFAIK) реализовать основную программу тестового жгута с помощью макроса boost:: test. Я знаю, что это не "чистый" TDD, но иногда нам нужен способ запуска тестов с помощью приложения GUI, например, когда в командной строке передается специальный тестовый флаг, а boost:: test не может поддерживать этот тип сценария.

UnitTest ++ был самой простой тестовой средой для настройки и использования, с которыми я столкнулся в моем (ограниченном) опыте.

Ответ 6

Я использую отличную библиотеку Boost.Test в сочетании с гораздо менее известным, но о-так-удивительным Turtle библиотека: библиотека фальшивых объектов, основанная на boost.

Как пример кода говорит лучше, чем слова, представьте, что вы хотели бы протестировать объект calculator, который работает на интерфейсе view (это вводный пример Черепахи):

// declares a 'mock_view' class implementing 'view'
MOCK_BASE_CLASS( mock_view, view )
{
    // implements the 'display' method from 'view' (taking 1 argument)
    MOCK_METHOD( display, 1 )                   
};

BOOST_AUTO_TEST_CASE( zero_plus_zero_is_zero )
{
    mock_view v;
    calculator c( v );

    // expects the 'display' method to be called once with a parameter value equal to 0
    MOCK_EXPECT( v, display ).once().with( 0 ); 

    c.add( 0, 0 );
}

Посмотрите, как легко и многословно это объявлять ожидание на макет-объекте? Очевидно, тест не выполняется, если ожидания не выполняются.

Ответ 7

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

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

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

Ответ 8

CxxTest - легкая, простая в использовании и кросс-платформенная платформа JUnit/CppUnit/xUnit для С++.

Ответ 10

UnitTest ++, маленький и простой.

Ответ 11

В настоящее время я ищу структуру unit test и mock, которая может использоваться в нашей компании для долгой кодовой базы. Как вы знаете, список структурных модулей тестирования для С++ длинный, поэтому я применил некоторые фильтры, чтобы уменьшить его до полного заполнения, которое можно посмотреть более подробно. Первый критерий фильтра заключался в том, что он должен быть бесплатным. Второй критерий - деятельность по проекту. Я также искал насмешливые рамки, потому что вам нужно это, если вы хотите написать модульные тесты.

Я придумал следующий список (приблизительно), отсортированный по активности, наивысшая активность вверху:

  • GoogleTest/GoogleMock: Многие вкладчики и используются самим Google. Вероятно, это будет в течение некоторого времени и получать обновления. Для моей частной кодовой базы я переключусь на эту комбинацию в надежде на прыжок на самый быстрый поезд.

  • BoostTest + Turtle: Не часто обновляется, но среда тестирования является частью повышения, поэтому ее следует поддерживать. Черепаха, с другой стороны, поддерживается главным образом одним парнем, но она возмущена деятельностью, поэтому она не мертва. Я использовал почти весь опыт тестирования с этой комбинацией, потому что мы уже использовали библиотеку boost на моей предыдущей задаче, и теперь я использую ее для своего личного кода.

  • CppUTest: Обеспечивает тестирование и издевательство. Этот проект был активным с 2008 по 2015 год и имеет довольно много недавней деятельности. Эта находка была немного удивителен, потому что многие проекты со значительно меньшей активностью появляются чаще при поиске в Интернете (например, CppUnit, который имел последнее обновление в 2013 году). Я не смотрел глубже в это, поэтому я ничего не могу сказать о деталях. Изменить (16.12.2015): Недавно я попробовал это и нашел эту структуру немного неуклюжей и "C-стильной", особенно при использовании макетных классов. Кроме того, у него, казалось, было меньшее разнообразие утверждений, чем другие рамки. Я считаю, что его основная сила заключается в том, что его можно использовать с чистыми проектами C.

  • QTest: тестовая библиотека, которая поставляется с картой Qt. Удержание должно быть гарантировано в течение некоторого времени, но я использую его скорее как вспомогательную библиотеку, потому что регистрация теста является ИМО более неуклюжей, чем в других рамках. Насколько я понимаю, это заставляет вас иметь один тест-экзамен на испытательный стенд. Но тестовые вспомогательные функции могут быть полезны при тестировании кода Qt-Gui. У него нет издевательств.

  • Catch:. Это недавняя активность, но в основном разработана одним парнем. Самое приятное в этой структуре - альтернативный подход, который позволяет вам писать код повторного использования в самом тесте. Он также позволяет вам устанавливать имена тестов как строки, которые хороши, когда вы склонны записывать целые предложения в качестве имен тестов. Я хочу, чтобы этот стиль был разорван и помещен в googleTest; -)

Макетные рамки

Число фреймовых фреймворков намного меньше, чем количество тестовых фреймворков, но вот те, которые, как я обнаружил, имеют недавнюю активность.

  • Hippomock: теперь активен с 2008 года, но только с низкой интенсивностью.

  • FakeIt: активен с 2013 года, теперь, но более или менее разработан одним парнем.

Заключение

Если ваша кодовая база находится в долгосрочной перспективе, выберите между BoostTest + Turtle и GoogleTest + GoogleMock. Я думаю, что эти два будут иметь долгосрочное обслуживание. Если у вас есть только короткая кодовая база, вы можете попробовать Catch, которая имеет хороший синтаксис. Тогда вам нужно будет дополнительно выбрать насмешливую структуру. Если вы работаете с Visual Studio, вы можете загрузить адаптеры test-runner для BoostTest и GoogleTest, которые позволят вам запускать тесты с графическим интерфейсом тестового бегуна, который интегрирован в VS.

Ответ 12

См. также ответы на близкий вопрос "выбор инструмента/модуля для тестирования единиц С++", здесь

Ответ 13

Также существует TUT, Template-Unit-Test, основанная на шаблонах инфраструктура. Этот синтаксис неудобен (некоторые называют его шаблоном-злоупотреблением), но его основным преимуществом является то, что все это содержится в одном файле заголовка.

Здесь вы найдете пример unit-теста, написанного с TUT.

Ответ 14

Я пробовал CPPunit, и он не очень удобен для пользователя.

Единственная альтернатива, которую я знаю, - это использовать С++. NET, чтобы обернуть ваши классы С++ и написать единичные тесты с помощью единой платформы тестирования .NET(NUnit, MBUnit и т.д.).

Ответ 15

CppUTest - отличная, легкая структура для модульного тестирования C и С++.

Ответ 16

Michael Feathers of ObjectMentor сыграл важную роль в разработке как CppUnit, так и CppUnitLite.

Теперь он рекомендует CppUnitLite

Ответ 17

Посмотрите CUnitWin32. Он написан для MS Visual C. Он включает в себя пример.

Ответ 18

Посмотрите на cfix (http://www.cfix-testing.org), он специализируется на разработке Windows C/С++ и поддерживает как пользовательский режим, так и режим ядра модульное тестирование.

Ответ 19

Если вы работаете в Visual Studio 2008 SP1, я настоятельно рекомендую использовать MSTest для написания модульных тестов. Затем я использую Google mock для написания mocks. Интеграция с IDE идеальна и позволяет и не несет накладные расходы CPPunit с точки зрения редактирования трех мест для добавления одного теста.

Ответ 20

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

Ответ 21

Отъезд фруктозы: http://sourceforge.net/projects/fructose/

Это очень простая структура, содержащая только заголовочные файлы и, следовательно, легко переносимая.