TL; DR
Написание хороших, полезных тестов сложно и дорого обходится в C ++. Можете ли вы опытные разработчики поделиться своим обоснованием того, что и когда тестировать?
Длинная история
Раньше я занимался разработкой на основе тестов, фактически, всей моей командой, но у нас это не получалось. У нас есть много тестов, но они, кажется, никогда не охватывают случаи, когда у нас есть реальные ошибки и регрессии - которые обычно происходят, когда юниты взаимодействуют, а не из-за их изолированного поведения.
Это часто настолько сложно протестировать на уровне модулей, что мы перестали использовать TDD (за исключением компонентов, где это действительно ускоряет разработку), и вместо этого потратили больше времени на расширение охвата интеграционных тестов. Несмотря на то, что небольшие модульные тесты никогда не выявляли реальных ошибок и были в основном просто накладными расходами на обслуживание, интеграционные тесты действительно стоили усилий.
Теперь я унаследовал новый проект, и мне интересно, как его протестировать. Это родное приложение C ++ / OpenGL, поэтому интеграционные тесты на самом деле не подходят. Но модульное тестирование в C ++ немного сложнее, чем в Java (вы должны явно делать вещи virtual
), и программа не сильно объектно-ориентирована, поэтому я не могу издеваться над некоторыми вещами.
Я не хочу разрывать и разбирать все это, просто чтобы написать несколько тестов ради написания тестов. Поэтому я спрашиваю вас: для чего мне писать тесты? например:
- Функции / Классы, которые я ожидаю часто менять?
- Функции / классы, которые сложнее проверить вручную?
- Функции / классы, которые уже легко проверить?
Я начал исследовать некоторые уважительные базы кода C ++, чтобы увидеть, как они идут на тестирование. Прямо сейчас я изучаю исходный код Chromium, но мне трудно извлечь обоснование их тестирования из кода. Если у кого-нибудь есть хороший пример или пост о том, как к этому подходят популярные пользователи C ++ (ребята из комитета, авторы книг, Google, Facebook, Microsoft, ...), это было бы очень полезно.
Обновить
Я искал свой путь вокруг этого сайта и в Интернете с момента написания этого. Найдены хорошие вещи:
- Когда уместно не проводить модульное тестирование?
- /programming/109432/what-not-to-test-when-it-comes-to-unit-testing
- http://junit.sourceforge.net/doc/faq/faq.htm#best
К сожалению, все они скорее ориентированы на Java / C #. Написание большого количества тестов на Java / C # не является большой проблемой, поэтому выгода обычно перевешивает затраты.
Но, как я уже писал выше, в C ++ это сложнее. Особенно, если ваша кодовая база не так уж и хороша, вам придется серьезно испортить ситуацию, чтобы получить хороший охват модульных тестов. Например: у приложения, которое я унаследовал, есть Graphics
пространство имен, которое является тонким слоем над OpenGL. Чтобы протестировать любую из сущностей - которые все используют ее функции напрямую - мне нужно было бы превратить это в интерфейс и класс и внедрить его во все сущности. Это только один пример.
Поэтому, отвечая на этот вопрос, имейте в виду, что я должен сделать довольно большие инвестиции для написания тестов.