Модульное тестирование кода на C++ - инструменты и методология [закрыто]



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



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



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

805   22  

22 ответов:

применение модульных тестов к устаревшему коду было причинаэффективная работа с устаревшим кодом была написана. Майкл перья является автором - как упоминалось в других ответах, он участвовал в создании обоих CppUnit и CppUnitLite.

alt текст http://ecx.images-amazon.com/images/I/51RCXGPXQ8L._SL160_AA115_.jpg

Google недавно выпустила свою собственную библиотеку для модульного тестирования приложений C++, называемую Google Test.

проект на Google Code

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

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

Boost имеет тестирование библиотека который содержит поддержку для модульного тестирования. Это может быть стоит проверить.

Ноэль Ллопис из Игры Внутри автор изучение C++ Unit Testing Framework Jungle, всесторонняя (но теперь датированная) оценка различных фреймворков модульного тестирования C++, а также книга по программированию игр.

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

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

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

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

Я использую отлично импульс.Тест библиотека в сочетании с гораздо менее известных, но ох-как-круто Черепаха библиотека: макет библиотеки объектов на основе 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 );
}

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

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

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

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

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

CppUnit-это путь. Смотрите ссылку ниже:

http://cppunit.sourceforge.net/cppunit-wiki

http://en.wikipedia.org/wiki/CppUnit

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

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

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

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

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

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

  • это связано с: тестовая библиотека, которая поставляется с Qt framework. Поддержка должна быть гарантирована в течение некоторого времени, но я использую ее скорее как вспомогательную библиотеку, потому что тест-Регистрация IMO более неуклюжа, чем в других фреймворках. Насколько я понимаю, это заставляет вас иметь один тест-exe на тест-приспособление. Но вспомогательные функции теста могут полезно использовать при тестировании Qt-Gui кода. У него нет насмешек.

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

Макет Рамки

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

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

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

вывод

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

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

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

вы можете найти пример модульного теста, написанного с помощью TUT здесь.

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

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

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

Майкл перья ObjectMentor сыграл важную роль в развитии как CppUnit и CppUnitLite.

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

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

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

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

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

Проверьте фруктозу:http://sourceforge.net/projects/fructose/

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

Я использую MS Test с Typemock Isolator++. Дайте ему попробовать!

Comments

    Ничего не найдено.