Среда модульного тестирования C99, совместимая с Visual Studio 2015+

Существует ли среда модульного тестирования для «простого C», которую можно легко интегрировать с обозревателем тестов Visual Studio?

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

Я знаю о Microsoft Unit Testing Framework для C++ , но, поскольку у команды нет опыта работы с C++, я не уверен, что все пройдет гладко. По словам автора Criterion в этой ветке HN :

Поскольку C не был подмножеством C++ со времен C99, существует множество случаев, когда попытка сделать C в C++ неудобна или просто невозможна со стандартным C++:

  • Во-первых, вам нужно было бы обернуть включения заголовков, extern "C"чтобы отключить искажение, затем вам нужно было бы убедиться, что вы static_cast все ваши указатели, где обычно void*преобразования выполняли бы свою работу.

  • Кроме того, все интерфейсы, основанные на назначенных инициализаторах и составных литералах, не работают, если вы не решите компилировать в нестандартном GNU C++.

  • И есть еще несовместимости, такие как использование staticили constв объявлениях параметров массива или использование VLA в макросах, которые не распознаются C++.

Вторая проблема связана с интеграцией с нашим CI-сервером (Bamboo), но я не ожидаю никаких проблем, когда он заработает.

Ответы (2)

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

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

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

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

cmocka поддерживает несколько различных форматов вывода сообщений, таких как Test Anything Protocol, Subunit, xUnit XML или исходный формат вывода cmockery.

Итак, у вас есть хорошие шансы. В частности, я ожидаю, что проводник TGE будет поддерживать формат xUnit.

Я бы посоветовал потратить несколько часов на простой тест «привет, мир».

Работа Test Explorer заключается в том, что он передает несколько разных типов аргументов встроенному исполняемому файлу (например, «дайте мне список тестов», «выполните конкретный тест», «выполните все тесты»), поэтому я предполагаю, что он не должен будет проблемой написать адаптер. Но есть ли преимущества в использовании Cmocka по сравнению с GoogleTest/GoogleMock? Тем более, что у GoogleTest уже есть расширение?
Ну, вы указали «обычный C», поэтому я выбрал простую систему модульного тестирования C. Я не уверен, что вы могли бы использовать Google Test (который я считаю лучшим), поскольку для него потребуются объекты C++ в качестве макетов; надо будет попробовать и посмотреть
ну, вы правы, чтобы использовать Google Test, нам нужно поместить все externs и C inludes внутрь extern "C"блоков, чтобы получить связь C, но кроме этого у нас не было никаких серьезных проблем. Тем не менее, вы ответили на вопрос, поэтому я приму его.
Сердечное спасибо вам, если бы я знал это или хотя бы потратил время, чтобы попробовать, я бы не бросился в cmocka. Вы только что притворились, что ваши функции и структуры C, которые нужно имитировать, были классами C++?
Поскольку MSVC не поддерживает --wrapслабое связывание, такое как GCC (которое, я считаю, необходимо для cmocka), мы использовали HippoMocks для имитации и GoogleTest для тестирования. HippoMocks переписывает таблицу переходов функций, чтобы имитировать функции, это единственный заголовочный файл, который вам нужно включить, и, похоже, он переносим на разные платформы. Критерий, похоже, работает так же). Таким образом, мы просто используем gtest для тестов, а затем имитируем, когда это необходимо, используя HippoMocks, и получаем полную поддержку VS Test Explorer, можем отлаживать отдельные тесты и тому подобное.

Мы начали проводить некоторые тесты с помощью Google Test (который включает в себя Google Mock), чтобы понять, какие проблемы возникнут на практике. Это по-прежнему среда тестирования C++, поэтому проблемы из моего вопроса все еще актуальны, но ее было легко интегрировать, поэтому нам просто нужно было попробовать:

  • Очень легко написать тест (не так много сантехники по сравнению с некоторыми другими фреймворками C++)
  • Библиотеку тестов Google необходимо создать один раз, а затем включить в проект, но процедура довольно проста.
  • Расширение для VS2015 позволяет интегрировать VS (просмотр тестов в обозревателе тестов, отладку отдельных тестов и т. д.)
  • Создает XML-отчеты jUnit, обеспечивая простую интеграцию с Bamboo.

(обновление 2017 г.)

Просто для обновления: в конце концов мы продолжили использовать Google Test, поскольку расширение Visual Studio работает нормально, и было быстрее просто использовать extern "C"компоновку, а не использовать какую-либо другую среду тестирования C, которая потребовала бы от нас написания расширения для VS.

Тем не менее, мы решили использовать hippomocks для имитации, так как это единственная структура для имитации заголовков, которая имитирует функции C и работает с компилятором MSVC. Люди, использующие GCC, могут использовать CMocka, но он не работает с MSVC (но опять же, «люди GCC», вероятно, в первую очередь не будут использовать Visual Studio).