С++ модульная система тестирования

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

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

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

Ответ 1

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

Ответ 2

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

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

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

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

[обновление]

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

Ответ 4

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

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

Boost.Test НЕОБХОДИМО использовать в качестве библиотеки. Он имеет один вариант заголовка.

Ответ 5

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

Ответ 6

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

Тем не менее, я упорствовал и закончил работу cxxtest.

С веб-сайта:

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

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

Ответ 7

Попробуйте WinUnit. Это звучит превосходно и рекомендуется John Robbins.

Ответ 9

Мне нравится структура Boost unit test, в основном потому, что она очень легкая.

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

  • Сторонник Test Driven Development, вероятно, скажет, что фундаментально, что вы запускаете весь тестовый пакет каждый раз, чтобы убедиться, что вы не ввели регрессию. Если запуск всех тестов занимает слишком много времени, возможно, ваши тесты слишком велики или слишком много вызовов для интенсивных функций ЦП, которые следует издеваться? Если это остается проблемой, тонкая обертка вокруг тестов unit-tests должна позволить вам выбрать ваши тесты и, вероятно, будет быстрее, чем изучить другую структуру и портировать все ваши тесты.

Ответ 11

Aeryn - это еще одна рамка, заслуживающая внимания

Ответ 12

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

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

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

Ответ 13

CppUnit был оригинальным почтением к JUnit.

Ответ 14

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

Ответ 15

Я тоже являюсь поклонником UnitTest ++.

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

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

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

Ответ 16

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

Ответ 17

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

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

Ответ 18

Я пробовал Igloo, а также только тестовый набор С++ для заголовков, даже если он включал в себя только два заголовка.

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