41
Главное начать Как тестировать legacy C++ проект? Шульга Максим, @maxbeard12

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

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: Тестируем legacy c++

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

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

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

Page 2: Тестируем legacy c++

Что мы имеем

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

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

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

Page 3: Тестируем legacy c++

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

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

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

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

Page 4: Тестируем legacy c++

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

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

Page 5: Тестируем legacy c++

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

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

Page 6: Тестируем legacy c++

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

Уже лучше

Page 7: Тестируем legacy c++

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

Тоже неплохо

Page 8: Тестируем legacy c++

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

Page 9: Тестируем legacy c++

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

Page 10: Тестируем legacy c++

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

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

• нет своего mock

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

Студия

• через .Net

• тормоза

• только asserts

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

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

Page 11: Тестируем legacy c++

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?

Page 12: Тестируем legacy c++

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

• Portable: Windows, Linux, Mac

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

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

Page 13: Тестируем legacy c++

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

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

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

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

Page 14: Тестируем legacy c++

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

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

Page 15: Тестируем legacy c++

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

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

--gtest_filter=VMXprocessTest.*

• XML test report generation

--gtest_output=xml xml:$(TargetDir)

Page 16: Тестируем legacy c++

Protected functions

Page 17: Тестируем legacy c++

Protected functions

Page 18: Тестируем legacy c++

Protected functions

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

Page 19: Тестируем legacy c++

Protected functions

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

Page 20: Тестируем legacy c++

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

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

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

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

Page 21: Тестируем legacy c++

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

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

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

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

Page 22: Тестируем legacy c++

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

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

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

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

Page 23: Тестируем legacy c++

Google C++ Mocking Framework

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

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

Page 24: Тестируем legacy c++

Google C++ Mocking Framework

Page 25: Тестируем legacy c++

Google C++ Mocking Framework

Page 26: Тестируем legacy c++

Google C++ Mocking Framework

Page 27: Тестируем legacy c++

Google C++ Mocking Framework

Page 28: Тестируем legacy c++

Google C++ Mocking Framework

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

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

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

Page 29: Тестируем legacy c++

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

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

"Working Effectively with Legacy Code"

Метод Микадо

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

Page 30: Тестируем legacy c++

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

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

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

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

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

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

• макросы

Page 31: Тестируем legacy c++

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

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

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

• library (*.lib)

• export dll

• export классов

Page 32: Тестируем legacy c++

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

Page 33: Тестируем legacy c++

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

Page 34: Тестируем legacy c++

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

Page 35: Тестируем legacy c++

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

Page 36: Тестируем legacy c++

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

Page 37: Тестируем legacy c++

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

Page 38: Тестируем legacy c++

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

Page 39: Тестируем legacy c++

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

Page 40: Тестируем legacy c++

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

http://xunitpatterns.com/index.html

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

Page 41: Тестируем legacy c++

Спасибо

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

@maxbeard12