Фреймворк модульного тестирования C++

Я использую среду Boost Test для своего кода C++, но с ней связаны две проблемы, которые, вероятно, являются общими для всех сред тестирования C++:

  • Невозможно создать автоматические тестовые заглушки (например, извлекая общедоступные функции из выбранных классов).
  • Вы не можете запустить один тест - вам нужно запустить весь «набор» тестов (если, как я полагаю, вы не создадите много разных тестовых проектов).

Кто-нибудь знает о лучшей среде тестирования, или я всегда буду завидовать инструментам тестирования, доступным для разработчиков Java / .NET?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
61
0
52 935
18
Перейти к ответу Данный вопрос помечен как решенный

Ответы 18

Попробуйте WinUnit. Звучит отлично и рекомендуется Джон Роббинс.

Я использую его, довольно легкий и легкий в использовании. Наборы тестов организованы в библиотеки DLL, которые затем загружаются командой winunit exec. Возможность запуска одиночного теста, см. winunit.codeplex.com/…

fduff 23.05.2012 20:18

http://groups.google.com/group/googletestframework, но он довольно новый

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

Ссылка на UnitTest ++ больше не работает. :(

Itanex 30.08.2015 02:46

Он переехал из sourceforge в github.

DarenW 01.09.2015 23:24

Eclipse / JUnit - надежный пакет для java, и для обоих есть расширения / эквиваленты C++. Он может делать то, о чем вы говорите. Конечно, вам придется менять IDE ...

Отличный вопрос! Несколько лет назад я вечно искал что-то стоящее, но у меня ничего не вышло. Я искал что-то очень легкое и не требовало от меня компоновки некоторых библиотек ... вы знаете что-то, что я мог бы запустить за считанные минуты.

Однако я упорствовал и в итоге наткнулся на cxxtest.

С веб-сайта:

  • Не требует RTTI
  • Не требует функций шаблона члена
  • Не требует обработки исключений
  • Не требует каких-либо внешних библиотек (включая управление памятью, файловый / консольный ввод-вывод, графические библиотеки)
  • Распространяется полностью в виде набора файлов заголовков (и скрипта Python).

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

Может, стоит попробовать CATCH. Я говорю «возможно», потому что для этого требуются исключения и функции шаблонов членов. В остальном такой же, как в вашем списке (без скрипта Python). См. Мой ответ для получения дополнительной информации.

philsquared 28.12.2010 06:33

Эта ссылка уже недействительна, они перекочевали на github. github.com/CxxTest/cxxtest

leetNightshade 21.02.2014 00:25

@leetNightshade Обновлено. Спасибо. :)

Scott Saad 21.02.2014 03:06

Я тоже фанат UnitTest ++.

Загвоздка в том, что исходный дистрибутив содержит почти 40 отдельных файлов. Это абсурд. Управление исходным кодом и задачи сборки для простого проекта основаны на отслеживании всех этих файлов модульного тестирования.

Я изменил UnitTest ++, чтобы его можно было интегрировать с проектом, добавив по одному файлу .h и .cpp. Это я окрестил "милейшим". Подробности на http://ravenspoint.com/blog/index.php?entry=entry080704-063557

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

Мне нравится среда модульного тестирования Boost, главным образом потому, что она очень легкая.

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

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

Создание заглушек - единственный способ сократить накладные расходы на написание тестов до нескольких нажатий клавиш.

user239558 18.03.2013 16:47

Я бы предположил, что автоматическое отключение тестовых функций было бы скорее функцией (сценариев для фреймворка или) рассматриваемой среды разработки. Предположительно, приложения CodeGear C++ Builder будут быстро генерировать тестовый код для пользовательских функций.

Взгляните на Google C++ Testing Framework.

Он используется Google для всех своих собственных проектов на C++, так что, должно быть, он неплохой.

http://googletesting.blogspot.com/2008/07/announcing-new-google-c-testing.html

http://code.google.com/p/googletest

Ответ принят как подходящий

Я только что ответил на очень похожий вопрос. В итоге я использовал UnitTest ++ Ноэля Ллописа. Мне он понравился больше, чем boost :: test, потому что он не настаивал на реализации основной программы тестовой системы с помощью макроса - он может подключаться к любому исполняемому файлу, который вы создаете. Он действительно страдает от того же препятствия, что и boost :: test, поскольку требует, чтобы библиотека была подключена. Я использовал CxxTest, и он подходит ближе, чем что-либо еще в C++, для автоматической генерации тестов (хотя для этого требуется Perl быть частью вашей системы сборки для этого). C++ просто не предоставляет перехватчиков отражения, которые есть в языках .NET и Java. Инструменты MsTest в Visual Studio Team System - Developer's Edition будут автоматически генерировать тестовые заглушки неуправляемого C++, но для этого методы должны быть экспортированы из DLL, поэтому он не работает со статическими библиотеками. Другие тестовые среды в мире .NET тоже могут обладать этой способностью, но я не знаком ни с одной из них. Итак, прямо сейчас мы используем UnitTest ++ для неуправляемого C++, и в настоящее время я выбираю между MsTest и NUnit для управляемых библиотек.

Я использую Тут-фреймворк

Айрин - еще один фреймворк, на который стоит обратить внимание

Ссылка мертва. Это тот же проект? sourceforge.net/projects/aeryn

leetNightshade 21.02.2014 00:26

@leetNightshade Да. Ссылку обновил, спасибо

David Sykes 21.02.2014 12:37

Boost.Test позволяет запускать тестовый пример по имени. Или набор тестов. Или их несколько.

Boost.Test НЕ настаивает на реализации main, хотя делает это легко.

Boost.Test НЕ ОБЯЗАТЕЛЬНО использовать в качестве библиотеки. Имеет вариант с одним заголовком.

CppUnit был оригинальной данью уважения JUnit.

Поскольку я фанат JUnit, мне кажется, это сработает.

Patricia 22.12.2014 19:27

Многие другие ответы в этой ветке получали чаще, чем мои. Вы окажете себе услугу, изучив некоторые другие рекомендации. Моему сообщению 6 лет, и он основан на моем опыте работы с CppUnit, которому сейчас 13 лет.

duffymo 22.12.2014 20:01

Правильный! Здесь есть множество отличных вариантов. Однако я поискал CppUnit, и мне показалось, что он подходит для того, что я хотел. :-)

Patricia 22.12.2014 23:40

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

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

не создает заглушки, но это довольно специализированная область. Я думаю, что Изолятор ++ - первый инструмент, который действительно справится с этим. Обратите внимание, что фреймворки Mocking / stubbing обычно не зависят от фреймворков модульного тестирования. CATCH особенно хорошо работает с фиктивными объектами, поскольку состояние теста не передается контекстом.

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

[Обновить]

Просто произошло это с моим ответом несколько лет назад. Спасибо за отличные комментарии! Очевидно, что Catch за это время сильно развился. Теперь он поддерживает тестирование стиля BDD (задано / когда / тогда), теги, теперь в заголовке Один, и множество внутренних улучшений и уточнений (например, более богатая командная строка, четкий и выразительный вывод и т. д.). Более свежая запись в блоге находится здесь.

Отличный набор тестов.

MajesticRa 26.09.2011 20:44

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

Samaursa 08.12.2011 23:36

+1. Один заголовок включает == круто.

Rob Lachlan 19.04.2012 03:00

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

marton78 14.03.2013 14:28

Может ли он проводить параметризованные тесты? Также было бы неплохо утверждение приблизительного равенства с плавающей запятой.

Dylan 02.04.2013 18:56

Абсолютно здорово! Есть ли способ ускорить процесс сборки? Значит, я могу получить более быстрые циклы рефакторинга «красный-зеленый»? На сборку уходит 15 секунд ... Я знаю, что абсолютное время не так уж и много, но кажется, что это много. В любом случае СПАСИБО !!!

Andrei 03.05.2013 20:21

Я не использовал его, но мне кажется, что это единственная лучшая среда модульного тестирования С ++. Жалко, что он не интегрирован в что-то вроде буста, которым обычно пользуются.

Germán Diago 29.11.2013 20:34
доктест is my reimplementation of Catch with a huge focus on compilation speed - checkout the Часто задаваемые вопросы to see whats different between them
onqtam 10.10.2016 23:00

@philsquared - как имитировать или заглушить объекты C++ с помощью catch? Я не могу найти никакой документации по этому поводу. Я пытаюсь использовать catch, чтобы проверить, где объекты Obj-C вызываются в интерфейс C++, и я хотел бы утверждать, что определенные вызовы произошли в объекте C++.

system 21.02.2017 12:41

Вау, это старый пост ТАК. @ Helium3 в Catch нет встроенного средства имитации, но HippoMocks и Trompeloeil являются отличными фреймворками для фиксации, которые хорошо работают с Catch.

philsquared 21.02.2017 17:04

Спасибо, Фил, посмотрю.

system 21.02.2017 18:21

Стоит проверить библиотеку фруктозы Эндрю Марлоу ... http://fructose.sourceforge.net/

Я вспоминаю его документы, содержащие довольно подробный анализ и сравнение других предложений на момент написания «Фруктозы», но не могу найти URL-адрес, непосредственно ведущий к этому документу.

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

Итак, это довольно просто и понятно. Помимо включенного примера на github, есть примеры и более подробная информация на главном сайте igloo-testing.org. Я обновлю это позже, когда у меня будет больше опыта работы с ним и другими фреймворками.

Visual Studio имеет встроенную среду модульного тестирования, это отличная ссылка для настройки тестового проекта для консольного приложения win32:

http://codeketchup.blogspot.ie/2012/12/unit-test-for-unmanaged-c-in-visual.html

Если вы работаете над статическим проектом DLL, его намного проще настроить, поскольку другие отмечали, что внешние фреймворки для тестирования, такие как GTest и Boost, имеют дополнительные функции.

Другие вопросы по теме