Тестируем legacy c++

Preview:

DESCRIPTION

Небольшое обозрение Google Test Framework и Google C++ Mocking Framework, а также того, как их начать использовать

Citation preview

Главное начать

Как тестировать legacy C++ проект?

Шульга Максим, @maxbeard12

Что мы имеем

- взрослый продукт

- отсутствие тестов

- боязнь изменений

Что хочетсяполучить

- возможность развития

- ускорение разработки

- улучшение качества

Вариантов развития несколько

Самый простой

Вариантов развития несколько

Самый простой, но только на первый взгляд

Вариантов развития несколько

Уже лучше

Вариантов развития несколько

Тоже неплохо

Главное, чтобы не так

Все уже изобретено. Почти

boost, Visual Studio 8, 10 (минусы)boost

• последнее изменение 2006/07 год

• нет своего mock

• имхо - проблемы с документацией

Студия

• через .Net

• тормоза

• только asserts

• + можно запустить 1 тест

• + улучшения в VS2012

Google Test Framework

Основная страница http://code.google.com/p/googletest/

Документация для v1.6http://code.google.com/p/googletest/wiki/V1_6_Documentation

Google C++ Mocking Frameworkhttp://code.google.com/p/googlemock/

Дальше минимум подробностей обычного использования

Интересная статья: Why Are There So Many C++ Testing Frameworks?

Особенности GTF

• Portable: Windows, Linux, Mac

• Fatal & non-fatal assertions - возможность делать несколько проверок в одном тесте, без ущерба информативности результатам (стандартная проблема студии например: вылетает сразу и не проверяет дальше)

• Можно писать информативные ассерты: ASSERT_EQ(5, Foo(i)) << " where i = " << i;

Особенности GTF

• Google Test находит ваши тесты "автоматически"

• Возможность писать свои ассерты

• Death tests - тест кода завершения приложения, например при вызове функции с определенным параметром.

Особенности GTF

• SCOPED_TRACE для локализации проблем, при использовании функции с ассертами в нескольких местах

Особенности GTF

• Возможность фильтрации при запуске тестов

--gtest_filter=VMXprocessTest.*

• XML test report generation

--gtest_output=xml xml:$(TargetDir)

Protected functions

Protected functions

Protected functions

просто наследуемся

Protected functions

просто наследуемся

Еще особенности

• namespace - должен совпадать с SUT (system under test)

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

• обращение "мимо" вектора - завершение тестов сразу и без фейлов :(

Еще особенности

• На каждый тест используется новый SUT: SetUpTestCase+TearDownTestCase, глобальный SetUp & Tear-Down (::testing::Environment)

• Получение информации о текущем тесте (TestInfo) (например для подключения нужных файлов в SetUp)

• Есть listener API, для обработки событий в процессе запуска тестов

Еще особенности

• Запуск тестов заданное кол-во раз (до бесконечности - пока не упадет)

• Есть возможность тестировать исключения: по типу, просто что "было" или "не было"

• Не использовать "_подчеркивание" в именах тестовых классов и методов

Google C++ Mocking Framework

Mock vs Stubhttp://maxshulga-ru.blogspot.com/2012/03/mock-vs-stub.html

Проверка аргументов? используем ‘_’ - один из matcher’ов (есть много разных и можно делать свои)

Google C++ Mocking Framework

Google C++ Mocking Framework

Google C++ Mocking Framework

Google C++ Mocking Framework

Google C++ Mocking Framework

мокируются public, protected, private virtual методы

non-virtual только через dependency injection (можно сгенерировать класс-mock, но надо самим его “подставить” в production код, например через шаблоны)

возможность делегировать к методам реального класса

А что же в итоге про legacy код?

Аккуратный рефакторинг

"Working Effectively with Legacy Code"

Метод Микадо

Используем С++!

Возможности С++

• разрываем зависимости через hpp

в тестах подставляем "свои" хедеры

• разрываем зависимости через шаблоны

выносим то, от чего зависим в параметры шаблона

• дробим функции на части, одна из которых и требует тестов

• макросы

Как добраться до production кода

• прямое подключение исходников

(*. h, *.hpp, *.cpp)

• library (*.lib)

• export dll

• export классов

Как добраться до production кода

Как добраться до production кода

Как добраться до production кода

Как обустроить проект

Как обустроить проект

Как обустроить проект

Дорогу осилит идущий...

Дорогу осилит идущий...

Ваши каска, бронежилет и миноискатель

http://xunitpatterns.com/index.html

http://maxshulga-ru.blogspot.com/2012/03/blog-post_04.html

Спасибо

Теперь вопросы

@maxbeard12

Recommended