Модульное тестирование кода С++ - Инструменты и методология
Я работаю над большой системой С++, которая находится в разработке уже несколько лет. В рамках усилий по улучшению качества существующего кода мы участвовали в большом долгосрочном проекте рефакторинга.
Знаете ли вы хороший инструмент, который может помочь мне написать модульные тесты на С++? Может быть, что-то похожее на Junit или Nunit?
Может ли кто-нибудь дать хороший совет по методологии написания модульных тестов для модулей, которые были написаны без модульного тестирования?
Ответы
Ответ 1
Применяя модульные тесты к устаревшему коду, была написана очень разумная Эффективная работа с устаревшим кодом. Майкл Перс - автор, как упоминалось в других ответах, он участвовал в создании CppUnit и CppUnitLite.
alt text http://ecx.images-amazon.com/images/I/51RCXGPXQ8L._SL160_AA115_.jpg
Ответ 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 для С++.
Ответ 9
CppUnit - это путь. См. Ссылку ниже:
http://cppunit.sourceforge.net/cppunit-wiki
http://en.wikipedia.org/wiki/CppUnit
Ответ 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/
Это очень простая структура, содержащая только заголовочные файлы и, следовательно, легко переносимая.
Ответ 22
Я использую MS Test с Typemock Isolator ++. Попробуйте!