Начало работы с юнит-тестами С++

Рассказывает Дрор Хэлпер — разработчик, архитектор программного обеспечения и консультант, которому нравится помогать программистам совершенствовать их код


С самого начала (моей карьеры) я «жил» в мире C++.  В последнее время я заметил растущий интерес к модульному тестированию на C++ и даже рассказал об этом на NDC Oslo. Я считаю, что C++ — самый передовой язык в плане юнит-тестирования. Поэтому, если вы не являетесь разработчиком C++ (но все еще читаете этот пост), вам стоит ознакомиться с некоторыми нововведениями в модульном тестировании на этом языке.

Опираясь на собственный опыт и предпочтения, я решил составить список ресурсов для программистов, которые хотят узнать больше о разработке через тестирование (англ. test-driven development, TDD) и юнит-тестах.

Книги

Я люблю читать книги и считаю, что в них, в отличие от других ресурсов (включая данный материал), содержатся структурированные знания. В области юнит-тестов на C++ есть две книги, которые я прочел много лет назад, но по-прежнему использую в своей повседневной работе.

Современное программирование на C++ с помощью тестовой разработки (лучше кодишь — лучше спишь)

Прим. перев. Книга не была переведена на русский язык.

Вы точно полюбите эту книгу. У неё отличное название и толковое содержание. Автор книги демонстрирует, как шаг за шагом применять модульное тестирование к вашему коду (именно так его и нужно практиковать). В книге основное внимание уделяется GTest, а в некоторых из последних глав используется CppUnit.

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

Эффективная работа с унаследованным кодом

Эта книга — классика на все времена, и она много раз помогала мне решить трудоемкие, сложные или тормозящие меня проблемы. Как только вы ознакомитесь с  юнит-тестами и разработкой через тестирование, вам, скорее всего, захочется использовать свои новые умения в реальном коде, и тогда вы обязаны прочитать эту книгу.

В ней показано, как модульное тестирование может спасти ваш код от медленной и мучительной смерти, и что делать, когда сталкиваешься с огромным, сложным и запутанным устаревшим кодом.

Фреймворки

Чтобы начать применять свои знания, вам понадобятся хорошие фреймворки для написания юнит-тестов и моков. К счастью, существует много различных программ с большим количеством современных функций, которые превосходят классические реализации фреймворков для написания юнит-тестов. Должен признаться, я не работал со всеми существующими фреймворками для модульного тестирования, но я использовал значительную часть. Следующий список построен на основе только моего (неполного) опыта.

Фреймворки для юнит-тестирования

  1. GTest/Gmock — эта мощная пара фактически является стандартом модульного тестирования в C++. В сущности, на протяжении большого количества времени GMock был единственной производственной силой в мире мок-фреймворков на C++. Его преимущество заключается в том, что если у вас есть GMock, GTest вы получаете в комплекте. Недостатком же являлось и является то, что вам нужно собирать GTest/GMock в одной конфигурации с вашим проектом, что может заставить помучиться.
  2. Catch — это мой новый любимый фреймворк для модульного тестирования (не только на C++). Развёртывание выполняется путем подключения одного заголовочного файла к тестируемому проекту, после чего вы можете приступать к работе. У Catch есть много интересных особенностей: мощный функционал для создания assert’ов, именованные тесты и изумительная фича под названием «sections». Вы можете узнать больше в моём блоге, в статье под названием «Catch — мультипарадигменный автоматизированный фреймворк для тестирования кода на C++». Catch с набором простых, но полезных инструментов оказал сильное влияние на несколько C++ фреймворков, таких как DocTest, и lest, которые адаптировали некоторые функции под себя. С этого момента характеристика «фреймворк для тестирования Catch» стала способом категоризации фреймворков, как когда-то «фреймворк для тестирования xUnit».
  3. Mettle — в этом фреймворке, который немного отличается от других, собрано много хороших идей. Мне нравятся полная настройка assert’ов и различный синтаксис, который добавляется этой возможностью. Я думаю, что это тот фреймворк, который поможет вам лучше понять модульное тестирование и научиться его использовать.
  4. Boost.Test — часть библиотеки boost и некоторых проектов, в которых она используется. У меня было не так много времени для тестов, однако я заметил, что этот фреймворк слишком перегружен. Тем не менее, я дам ему ещё одну попытку, прежде чем приму окончательное решение.

Мок-фреймворки

Долгое время GMock был единственным мок-фреймворком для C++. Это было связано с GTest и большой популярностью Google на тот момент.

Сегодня есть другие варианты. Одни, такие как Trompeloeil, разворачиваются путём подключения одного заголовочного файла и имеют импонирующий мне синтаксис. Другие, подобные FakeIt, представляют собой просто потрясающие библиотеки, помогающие разработчикам писать фиктивные объекты (моки и стабы) используя очень маленькое количество кода и синтаксис, знакомый вам, если вы когда-либо использовали Mockito (Java) или какой-либо .NET-фреймворк для написания моков. Кроме всего прочего, HippoMocks — хотя мне только предстоит опробовать его в клиентской среде — может стать ещё одной альтернативой, на которую разработчики C++ обратят внимание.

Если вы хотите увидеть синтаксис каждого фреймворка — можете посмотреть этот репозиторий на GitHub, а также запись моего выступления на NDC Oslo: «Модульное тестирование на C++ — хорошее, плохое, злое».

Другие ресурсы

Мои лекции по модульному тестированию в C++ / тестированию устаревшего кода на C++ можно найти в разделе «recordings» (записи) этого блога.

Да, это снова Catch — представляет его создатель Фил Нэш (со встречи по C++):

Лекция от создателя фреймворка Trompeloeil:

Онлайн курсы

Существует мало курсов (не видел ни одного) о модульном тестировании на C++, поэтому год назад я решил это исправить и записал два курса для Pluralsight:

Основы модульного тестирования на C++ с использованием Catch — введение в мир юнит-тестов на C++ с использованием платформы Catch.

Продвинутое использование мок на C++ в Google Mock— использование GTest и GMock для проверки реального и обслуживания устаревшего кода.

Я с большим удовольствием создавал эти курсы, и надеюсь, что другие разработчики найдут их полезными.

И это всё?

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

Ну, а пока — счастливого программирования…

Перевод статьи «Getting started with C++ unit testing»

Подобрали два теста для вас:
— А здесь можно применить блокчейн?
Серверы для котиков: выберите лучшее решение для проекта и проверьте себя.