Google Test — это фреймворк от Google для юнит-тестирования кода на С++. Общей архитектурой он слегка напоминает общепринятые boost::test и CppUnit, хотя слегка отличается в деталях (как по мне — в лучшую сторону). Большая обзорная статья этого фреймворка уже как-то пробегала на Хабре, но нынче она в каком-то побитом состоянии (код не отображается), да и кажется мне слишком сложной для начала работы. Поэтому я коротко опишу «Hello world» на Google Test, указав на несколько потенциальных проблем, с которыми вы можете столкнуться, используя Google Test при разработке под Visual Studio.
Сборка
- Загружаем архив с кодом, разархивируем.
- В папке gtest-1.6.0\msvc есть два файла: gtest.sln и gtest-md.sln. Это файлы решений (Solution) Visual Studio. Отличаются они опциями сборки: gtest.sln собирает код с ключем /MT, а gtest-md.sln с ключем /MD. Если вы не знаете, за что отвечают эти ключи — можете почитать, к примеру, тут или тут. Вы должны скомпилировать тот же вариант, с которыми собирается проект, который вы собираетесь тестировать. Это важно, иначе получите кучу невразумительных ошибок линкера. Проверить, с какими ключами собирается ваш проект можно вот тут:
Код Google Test успешно собирается Visual Studio 2008\2010 (другими не пробовал). На выходе вы получите файлы gtestd.lib\gtest.lib (для дебаг и релиз конфигураций). Со сборкой на этом всё.
Hello world
- Открываем Solution, который вы собираетесь тестировать. Добавляем в него новый проект (консольное С++ приложение).
- В этот проект добавляем зависимость от скомпиленных на втором шаге библиотек gtestd.lib\gtest.lib, путь к include-папке Google Test, зависимости к тем проектам в вашем решении, которые вы собираетесь тестировать.
- Пишем в главном файле тестового проекта следующий код:
#include "stdafx.h" #include "gtest/gtest.h" class CRectTest : public ::testing::Test { }; TEST_F(CRectTest, CheckPerimeter) { CSomeRect rect; rect.x = 5; rect.y = 6; ASSERT_TRUE(rect.GetPerimeter() == 22); } int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }
Здесь мы тестируем некий класс прямоугольника на правильность вычисления периметра. Вы заметили, как удобненько — не нужно ни регистрировать каждый тест в main-функции, ни даже писать объявления тестовых методов в заголовочных файлах.
- Запускаем тестовый проект. Видим следующее:
Грабли
Номер один
Не ошибитесь с выбором компилируемого решения на втором шаге. Если ошибетесь и забудете — выяснить в чём ошибка позже будет фактически не реально.
Номер два
Если вы планируете разнести основное тестовое приложение и сами тесты по разным проектам, вы столкнётесь с одной хитрой проблемой. Дело в том, что гугловские юнит-тесы по сути являются статическими классами и компилятор Visual C++ из-за имеющегося нём бага попросту выкинет эти классы по ходу компиляции. Для избежания этого бага нужно выкрутиться способом, описанным вот тут.
Номер три
Не забывайте, что тестируемые статические библиотеки нужно не достаточно добавить в зависимости (Dependencies) тестового проекта, их нужно добавить в ссылки (References), иначе получим ошибки линковки.
Дополнительные материалы
Чуть более глубокая статья на Хабре
Быстрый старт в родной документации
Часто задаваемые вопросы
Продвинутое использование фреймворка
Плагин к Visual Studio для запуска тестов
Успехов в тестировании.
С Новым Годом!