Google test framework как установить

Обновлено: 05.07.2024

Как и любой уважающий себя язык программирования, C++ имеет фреймворки для написания модульных тестов, и даже не один, а очень много. В рамках этой заметки мы познакомимся с основами использования фреймворка Google Test. Это довольно легковесный, однако не в ущерб удобству и функциональности фреймворк, используемый в Chromium, LLVM, Protobuf, OpenCV, и других проектах. Кроме того, из IDE с ним умеет интегрироваться как минимум CLion.

Fun fact! Если вас интересует написание системных тестов, их намного удобнее писать на высокоуровневом языке вроде Python. В частности, для Python есть хороший тестовый фреймворк PyTest.

Если вы используете CMake, то тесты, использующие Google Test, добавляются в проект очень просто:

cmake_minimum_required ( VERSION 3.6 )

find_package ( GTest REQUIRED )
find_package ( Threads REQUIRED )

set ( CMAKE_CXX_STANDARD 11 )
set ( CMAKE_CXX_STANDARD_REQUIRED on )

add_executable (
TestSerialization ./TestSerialization.cpp
../src/User.cpp ../src/Date.cpp )

target_link_libraries (
TestSerialization $ Threads::Threads )

enable_testing ()
add_test ( TestSerialization "./TestSerialization" )

В качестве примера напишем тесты на сериализацию и десериализацию объектов Date и User из статьи Работа с JSON на C++ при помощи библиотеки RapidJSON:

Заметьте, что, хотя здесь эта возможность и не используется, в общем случае Google Test позволяет заводить глобальное состояние, используемое разными тестами. Это может быть целесообразным, как минимум, для ускорения тестов. В остальном же приведенный код крайне прост, поэтому разбирать его более подробно я не вижу смысла.

Пример вывода программы:

[----------] Global test environment tear-down
[==========] 2 tests from 1 test case ran. (0 ms total)
[ PASSED ] 2 tests.

[ RUN ] TestSerialization.DateJson
../tests/TestSerialization.cpp:26: Failure
Expected: d1
Which is: Date(year = 1988, month = 8, day = 5)
To be equal to: d2
Which is: Date(year = 1988, month = 8, day = 6)
[ FAILED ] TestSerialization.DateJson (0 ms)

Кроме того, Google Test позволяет запускать заданное подмножество тестов:

./TestSerialization --gtest_repeat=10 --gtest_shuffle \
--gtest_random_seed=42

Если генерировать входные данные каждого теста псевдослучайным образом, получится что-то очень похожее на property-based тесты.

Наконец, Google Test умеет генерировать отчеты в формате XML, чтобы его было легче интегрировать с системами непрерывной интеграции (простите за тавтологию), интерактивными средами разработки, и так далее:

Резюмируя вышесказанное, Google Test делает всю рутину, позволяя вам сосредоточиться непосредственно на написании тестов. То есть, с ним вам придется писать намного меньше кода, чем без него.

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

А какими тестовыми фреймворками для C++ в это время суток пользуетесь вы?



Google Test — это фреймворк от Google для юнит-тестирования кода на С++. Общей архитектурой он слегка напоминает общепринятые boost::test и CppUnit, хотя слегка отличается в деталях (как по мне — в лучшую сторону). Большая обзорная статья этого фреймворка уже как-то пробегала на Хабре, но нынче она в каком-то побитом состоянии (код не отображается), да и кажется мне слишком сложной для начала работы. Поэтому я коротко опишу «Hello world» на Google Test, указав на несколько потенциальных проблем, с которыми вы можете столкнуться, используя Google Test при разработке под Visual Studio.

Сборка

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


Hello world

  1. Открываем Solution, который вы собираетесь тестировать. Добавляем в него новый проект (консольное С++ приложение).
  2. В этот проект добавляем зависимость от скомпиленных на втором шаге библиотек gtestd.lib\gtest.lib, путь к include-папке Google Test, зависимости к тем проектам в вашем решении, которые вы собираетесь тестировать.




Здесь мы тестируем некий класс прямоугольника на правильность вычисления периметра. Вы заметили, как удобненько — не нужно ни регистрировать каждый тест в main-функции, ни даже писать объявления тестовых методов в заголовочных файлах.

Грабли

Номер один

Не ошибитесь с выбором компилируемого решения на втором шаге. Если ошибетесь и забудете — выяснить в чём ошибка позже будет фактически не реально.

Номер два

Если вы планируете разнести основное тестовое приложение и сами тесты по разным проектам, вы столкнётесь с одной хитрой проблемой. Дело в том, что гугловские юнит-тесы по сути являются статическими классами и компилятор Visual C++ из-за имеющегося нём бага попросту выкинет эти классы по ходу компиляции. Для избежания этого бага нужно выкрутиться способом, описанным вот тут.

Номер три

Не забывайте, что тестируемые статические библиотеки нужно не достаточно добавить в зависимости (Dependencies) тестового проекта, их нужно добавить в ссылки (References), иначе получим ошибки линковки.

В Visual Studio 2017 и более поздних версиях решение Google Test интегрировано в среду Visual Studio как компонент рабочей нагрузки Разработка классических приложений на C++. Чтобы проверить, установлен ли этот компонент на компьютере, откройте Visual Studio Installer и найдите Google Test в списке компонентов рабочей нагрузки.

Установка Google Test

Добавление проекта Google Test в Visual Studio 2019

  1. В обозревателе решений щелкните узел решения правой кнопкой мыши и выберите пункты Добавить > Новый проект.
  2. Задайте Язык как C++ и введите тест в поле поиска. Выберите в списке результатов Проект Google Test.
  3. Укажите имя тестового проекта и нажмите кнопку ОК.

Новый проект Google Test

Создание проекта Google Test в Visual Studio 2017

  1. В обозревателе решений щелкните узел решения правой кнопкой мыши и выберите пункты Добавить > Новый проект.
  2. В левой области выберите Visual C++ > Тест, а в центральной области — Проект Google Test.
  3. Укажите имя тестового проекта и нажмите кнопку ОК.

Новый проект Google Test

Настройка тестового проекта

В открывшемся диалоговом окне Конфигурация тестового проекта можно выбрать проект, который необходимо тестировать. При выборе проекта Visual Studio добавляет ссылку на него. Если проект не выбран, необходимо вручную добавить ссылки на проекты, которые следует тестировать. При выборе статического или динамического связывания с двоичными файлами Google Test следует учитывать те же факторы, что и в случае с любой другой программой C++. Дополнительные сведения см. в статье DLL в Visual C++.

Настройка проекта Google Test

Настройка дополнительных параметров

Чтобы настроить дополнительные параметры, в главном меню выберите Сервис > Параметры > Адаптер тестов для Google Test. Дополнительные сведения об этих параметрах см. в документации по Google Test.

Параметры проекта Google Test

Добавление директив include

Написание и запуск тестов

Все готово к написанию и выполнению тестов Google Test. Сведения о макросах тестов см. в учебнике по началу работы с Google Test. Сведения об обнаружении, выполнении и группировании тестов с помощью обозревателя тестов см. в статье Выполнение модульных тестов с помощью обозревателя тестов.

Это не документировано на веб-сайте, и у людей, похоже, возникли проблемы с настройкой фреймворка. Может кто-то, пожалуйста, показать шаг за шагом введение в образец настройки проекта.

то, что сказал Арлахарен, было в основном правильно, за исключением того, что он опустил часть, которая объясняет ваши ошибки компоновщика. Прежде всего, вам нужно создать свое приложение без CRT как библиотека времени выполнения. Вы всегда должны делать это в любом случае, так как это действительно упрощает распространение вашего приложения. Если вы этого не сделаете, то все ваши пользователи должны установить библиотеку времени выполнения Visual C++, а те, кто этого не сделает, будут жаловаться на отсутствие таинственной DLL в их системе. для дополнительные несколько сотен килобайт, которые стоит связать в CRT статически, вы экономите много головной боли позже в поддержке (поверьте мне на этом - я узнал это на собственном горьком опыте!).

в любом случае, чтобы сделать это, вы переходите к свойствам цели -> C/C++ -> генерация кода -> библиотека времени выполнения, и она должна быть установлена как "многопоточная" для вашей сборки выпуска и "многопоточная отладка" для вашей сборки отладки.

поскольку библиотека gtest построена таким же образом, вы должны убедитесь, что вы ссылаетесь на правильную версию это, или иначе компоновщик вытащит другую копию библиотеки времени выполнения, которая является ошибкой, которую вы видели (кстати, это не должно иметь значения, используете ли вы MFC или нет). Вам нужно построить gtest как обоих Debug и Release режим и сохранить обе копии. Затем вы связываетесь с gtest.lib / gtest_main.lib в вашей версии сборки и gtestd.lib / gtest_maind.lib в вашей отладочной сборке.

(эти инструкции заставляют платформу тестирования работать для конфигурации отладки. Должно быть довольно тривиально применить тот же процесс к конфигурации выпуска.)

Получить Google C++ Тестирование Framework

  1. скачать последнюю gtest framework
  2. распакуйте в C:\gtest

создайте библиотеки фреймворков

  1. открыть C:\gtest\msvc\gtest.sln в Visual Студия
  2. настройка конфигурации на "Debug"
  3. Построить Решение

создание и настройка тестового проекта

Проверка Все Работает

Если вы не хотите писать свой собственный main () для тестов, вы можете использовать функцию main (), определенную в gtest_main.lib, но затем вы получаете ошибки компоновщика "точка входа должна быть определена" в VS2012. В вашем тестовом проекте установите ProjectProperties - >Linker->System - >SubSystem на "консоль", так как это заставит VS2012 искать точку входа под названием "main()" и найдет ее в gtest_main.lib (при условии, что вы связали его должным образом).

построив gtest, это то, что я сделал:

  1. добавить \mypath\gtest-1.0.1\Debug (или Release) в общие свойства->Компоновщик->общие->дополнительные каталоги библиотеки
  2. добавить gtest.lib и gtest_main.lib для общих свойств - >Компоновщик - >ввод - >дополнительные зависимости

после этого я просто пишу свои тесты с помощью TEST или TEST_F и компилирую их вместе с моей основной функцией:

в Microsoft Visual Studio неверно настроенный тип библиотеки времени выполнения вызывает ошибки ссылок.

VS 2005 (и 2008) использует многопоточную DLL или многопоточную отладочную DLL по умолчанию. Но тестовая библиотека Google использует mulithreaded или mulithreaded debug runtime по умолчанию.

Итак, выберите подходящий тип библиотеки времени выполнения для тестовой библиотеки google. (в свойствах конфигурации - > генерация кода - > библиотека времени выполнения).

Читайте также: