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





CppUnit - это способ. См. Ссылку ниже:
Майкл Фезерс из ObjectMentor сыграл важную роль в разработке как CppUnit, так и CppUnitLite.
Теперь он рекомендует CppUnitLite
Я пробовал CPPunit, и он не очень удобен для пользователя.
Единственная известная мне альтернатива - использовать C++. NET для обертывания ваших классов C++ и писать модульные тесты с помощью одной из сред модульного тестирования .NET (NUnit, MBUnit и т. д.)
UnitTest ++, маленький и простой.
Google недавно выпустил собственную библиотеку для модульного тестирования приложений C++, которая называется Google Test.
можно ли использовать это с VC++
Кажется, это нормально, особенно то, как они должны добавлять описание к каждому утверждению. С другой стороны, я лично предпочитаю иметь класс Unit Test вместо макросов, которые действительно не похожи на классы.
еще один приятный момент - насмешливые возможности: code.google.com/p/googlemock
Я считаю, что это НАМНОГО лучше, чем CPPUNIT, который требует множества макросов и волшебных файлов, чтобы тесты работали.
CxxTest - это легкий, простой в использовании и кроссплатформенный JUnit / CppUnit / xUnit-подобный фреймворк для C++.
Boost имеет Библиотека тестирования, который содержит поддержку модульного тестирования. Возможно, стоит проверить.
Я могу порекомендовать этот отличный инструментарий.
Да, ускорение - это то, что вам нужно. Никаких накладных расходов, просто протестируйте и вперед! На самом деле я в отчаянии работал над собственным фреймворком, когда мне на помощь пришел boost. Спасибо Boost (за все!)
Вы можете ознакомиться со статьей, которую я написал, введение в Boost Unit Testing beroux.com/english/articles/boost_unit_testing
Применение модульных тестов к унаследованному коду было написано очень причинаЭффективная работа с устаревшим кодом было написано. Майкл Фезерс является автором - как упоминалось в других ответах, он участвовал в создании как CppUnit, так и CppUnitLite.

Добавил миниатюру - проголосовал. Книга помогает больше, чем любой инструмент.
Я думаю, что CPPUnit может упростить написание тестов. Мы используем CPPUnit, но меня это не устраивает. Мне нужно обновить два файла для каждого теста, и, на мой взгляд, тест должен быть таким же простым, как: 'TEST ("testname") {ASSERT (1 == 1);}' С другой стороны, книга Обязательно для всех, не только для тех, кто работает с устаревшим кодом, но и для тех, кто его создает;)
Я читаю книгу. Очень хорошее чтение
С каких это пор С ++ унаследовал ?!
Дело не в том, что C++ унаследован - если я правильно помню, в этой книге устаревший проект определяется как проект, для которого нет или очень мало модульных тестов. В таких проектах, как правило, / сложно / писать модульные тесты, потому что разработка, управляемая тестами, никогда не влияла на кодовую базу, так что писать их тривиально.
@Nils: Как упоминает один из рецензентов книги Amazon, «устаревший код - это код без модульных тестов», именно об этом и идет речь.
Ноэль Лопис из Игры изнутри является автором Изучение джунглей фреймворка модульного тестирования C++, исчерпывающей (но уже устаревшей) оценки различных фреймворков модульного тестирования C++, а также книги по программированию игр.
Некоторое время он использовал CppUnitLite, исправляя различные вещи, но в конце концов объединил усилия с другим автором библиотеки модульных тестов и создал UnitTest ++. Здесь мы используем UnitTest ++, и пока он мне очень нравится. Он имеет (для меня) точный баланс мощности при небольшой площади основания.
Я использовал собственные решения, CxxTest (для которого требуется Perl) и boost :: test. Когда я реализовал здесь модульное тестирование на моей текущей работе, он в значительной степени свелся к UnitTest ++ vs boost :: test.
Мне действительно нравятся большинство используемых мною библиотек boost, но IMHO, boost :: test - это слишком тяжеловесно. Мне особенно не понравилось, что это требует от вас (AFAIK) реализации основной программы тестовой системы с использованием макроса boost :: test. Я знаю, что это не «чистый» TDD, но иногда нам нужен способ запускать тесты из приложения с графическим интерфейсом, например, когда в командной строке передается специальный флаг тестирования, а boost :: test не может поддерживать этот тип. сценария.
UnitTest ++ был самой простой в настройке и использовании тестовой средой, с которой я столкнулся в моем (ограниченном) опыте.
Обратите внимание на фруктозу: http://sourceforge.net/projects/fructose/
Это очень простой фреймворк, содержащий только файлы заголовков, и поэтому его легко переносить.
См. Также ответы на тесно связанный вопрос «Выбор инструмента / фреймворка для модульного тестирования C++», здесь
Оцените отличный сравнение между несколькими доступными наборами. Позднее автор этой статьи разработал UnitTest ++.
Что мне особенно нравится в нем (помимо того, что он хорошо обрабатывает исключения и т. д.), Так это то, что существует очень ограниченное количество «администрирования» вокруг тестовых примеров и определения тестовых приспособлений.
Разве это не наша основная ошибка? Он хорошо разбирается в доступных проектах, но вместо того, чтобы совершенствоваться, он начинает свой собственный.
@peterchen: да; но тогда UnitTest ++ настолько мал и легок, что имеет ценность как отдельный проект - его очень легко запустить и запустить.
Также существует ВПИС, Template-Unit-Test, фреймворк на основе шаблонов. Его синтаксис неудобен (некоторые называют его злоупотреблением шаблонами), но его главное преимущество в том, что все это содержится в файл с одним заголовком.
Здесь вы найдете пример unit-теста, написанного на TUT.
Я разместил библиотеку только для заголовков, содержащую макросы, обертывающие функцию обеспечения и тестовый код TUT, чтобы упростить ее и предоставить информацию о номерах файлов и строк в случае сбоев. Вот ссылка на сообщение с примерами разницы в выводе и коде, а также ссылка на проект на github: codecrafter.wordpress.com/2012/12/19/tutadapter1
Взгляните на CUnitWin32. Он написан для MS Visual C. Он включает пример.
Взгляните на cfix (http://www.cfix-testing.org), он специализируется на разработке для Windows C / C++ и поддерживает модульное тестирование как в пользовательском режиме, так и в режиме ядра.
Спасибо, что поделился. Недавно я начал использовать cfix для тестирования. Я искал способ просмотреть стек вызовов как в случае пройденных, так и в случае неудачных тестов. Есть ли способ добиться этого в cfix?
Если вы используете Visual Studio 2008 SP1, я настоятельно рекомендую использовать MSTest для написания модульных тестов. Затем я использую макет Google для написания макетов. Интеграция с IDE идеальна и позволяет и не несет накладных расходов CPPunit с точки зрения редактирования трех мест для добавления одного теста.
Я думаю, что VisualAssert отлично справляется с интеграцией VS. Он позволяет запускать и отлаживать тесты из VS, и вам не нужно создавать исполняемый файл для запуска тестов.
Я использую отличную библиотеку Boost.Test в сочетании с гораздо менее известной, но очень классной библиотекой Черепаха: библиотекой имитирующих объектов, основанной на ускорении.
Поскольку пример кода говорит лучше, чем слова, представьте, что вы хотите протестировать объект calculator, который работает с интерфейсом view (это вводный пример Turtle):
// 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 );
}
Видите, как легко и многословно объявить ожидание в фиктивном объекте? Очевидно, что тест будет провален, если ожидания не оправдаются.
Я только что выпустил свой собственный фреймворк ЛОВИТЬ. Он все еще находится в разработке, но я считаю, что он уже превосходит большинство других фреймворков. У разных людей разные критерии, но я попытался охватить большую часть вопросов без особых компромиссов. Взгляните на мою связанную запись в блоге для дегустатора. Мои пять основных функций:
Он также имеет привязки Objective-C.
CppUTest - отличный, легкий фреймворк для модульного тестирования C и C++.
В настоящее время я ищу модульный тест и макет фреймворка, который можно использовать в нашей компании для создания долгоживущей базы кода. Как вы знаете, список фреймворков модульного тестирования для C++ длинный, поэтому я применил несколько фильтров, чтобы уменьшить его до полного, чтобы его можно было рассмотреть более внимательно. Первым критерием фильтрации было то, что это должно быть бесплатно. Второй критерий - проектная активность. Я также искал фреймворки для имитации, потому что он вам понадобится, если вы хотите писать юнит-тесты.
Я составил следующий список (приблизительно), отсортированный по активности, самая высокая активность вверху:
GoogleTest / GoogleMock: Многие соавторы и сам Google. Вероятно, он будет здесь какое-то время и будет получать обновления. Для моей частной кодовой базы я перейду на эту комбинацию в надежде прыгнуть на самый быстрый поезд.
BoostTest + Черепаха: Обновляется не так часто, но среда тестирования является частью повышения, поэтому ее следует поддерживать. Черепаху, с другой стороны, обслуживает в основном один парень, но у нее есть возмущение, поэтому она не мертва. Я провел почти весь свой опыт тестирования с этой комбинацией, потому что мы уже использовали библиотеку boost на моей предыдущей работе, и в настоящее время я использую ее для своего личного кода.
CppUTest: Обеспечивает тестирование и насмешку. Этот проект был активен с 2008 по 2015 год, и в последнее время он активно активизировался. Эта находка была немного неожиданной, потому что многие проекты со значительно меньшей активностью обнаруживаются чаще при поиске в Интернете (например, CppUnit, последнее обновление которого было выполнено в 2013 году). Я не углублялся в это, поэтому ничего не могу сказать о деталях. Изменить (16.12.2015): Я недавно попробовал это и нашел этот фреймворк немного неуклюжим и "C-стильным", особенно при использовании имитационных классов. Кроме того, в нем было меньше утверждений, чем в других фреймворках. Я думаю, что его главная сила в том, что его можно использовать с проектами на чистом C.
QTest: Тестовая библиотека, поставляемая с фреймворком Qt. Обслуживание должно быть гарантировано в течение некоторого времени, но я использую его скорее как вспомогательную библиотеку, потому что тестовая регистрация IMO более неуклюжая, чем в других фреймворках. Насколько я понимаю, это заставляет вас иметь один test-exe на каждое устройство. Но вспомогательные функции тестирования могут быть полезны при тестировании кода Qt-Gui. В нем нет насмешек.
Ловить: Он имеет недавнюю активность, но в основном разработан одним парнем. Хорошая вещь в этой структуре - это альтернативный подход к фиксации, который позволяет вам писать повторно используемый код фикстуры в самом тесте. Он также позволяет вам задавать имена тестов в виде строк, что удобно, когда вы склонны писать целые предложения в виде имен тестов. Я бы хотел, чтобы этот стиль был сорван и помещен в googleTest ;-)
Количество ложных фреймворков намного меньше, чем количество тестовых фреймворков, но вот те, которые, как я обнаружил, активно использовались в последнее время.
Гиппомок: Активен с 2008 года, но только с низкой интенсивностью.
Притворяться: Активен с 2013 года, но более или менее разработан одним парнем.
Если ваша кодовая база рассчитана на долгое время, выберите между BoostTest + Черепаха и GoogleTest + GoogleMock. Я думаю, что эти двое нуждаются в длительном обслуживании. Если у вас только недолговечная кодовая база, вы можете попробовать Ловить, который имеет хороший синтаксис. Тогда вам нужно будет дополнительно выбрать фреймворк для фиксации. Если вы работаете с Visual Studio, вы можете загрузить адаптеры запуска тестов для BoostTest и GoogleTest, что позволит вам запускать тесты с графическим интерфейсом запуска тестов, интегрированным в VS.
Я использую MS Test с Изолятор Typemock ++. Попробуйте!
Проверьте этот вопрос: stackoverflow.com/questions/3150/…