Юнит-тестирование C ++ шаблонов - PullRequest
16 голосов
/ 23 декабря 2008

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

Недавно я планировал добавить некоторые шаблоны также в библиотечные API. Хороший интерфейс, конечно, самое главное, шаблон или нет. С хорошо разработанными и реализованными шаблонами вы можете, если не полностью предотвратить, по крайней мере, сделать так, чтобы пользователю было труднее выстрелить себе в ногу. В любом случае я считаю, что публичные шаблоны юнит-тестирования должны быть немного более строгими, по сравнению с чисто внутренними шаблонами.

Итак, как вы тестировали свои шаблоны C ++? Вы придумали какие-нибудь элегантные решения, особенно для шаблонов в API публичной библиотеки?

Ответы [ 4 ]

6 голосов
/ 23 декабря 2008

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

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

5 голосов
/ 24 декабря 2008

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

Например: скажем, что вы тестируете свои шаблоны только с использованием аргументов типа "string" и "char". У вас нет доказательств того, что другие аргументы типа будут проблематичными для этого конкретного шаблона, но по той или иной причине вы «подозреваете», что другие непроверенные аргументы типа будут проблемными.

В таком случае, как в приведенном выше примере, это не обязательно означает, что вы должны тщательно проверить аргументы других типов. Вместо этого у вас есть случай, который может подразумевать, что вы должны использовать некоторые методы метапрограммирования шаблонов времени компиляции, чтобы гарантировать, что ваш шаблон никогда не используется с другими аргументами, кроме «string» и «char».

Один ресурс:

Современный дизайн C ++ - Андрей Александреску

Очень рано в этой книге автор приводит такие примеры:

  • как создать шаблон, который будет самодействовать, чтобы его первый тип arg был меньшего типа, чем второй тип arg

  • как определить конвертируемость и наследование во время компиляции

«Современный дизайн C ++» (несмотря на его довольно широкое / расплывчатое название) - это довольно продвинутое исследование методов программирования шаблонов.

3 голосов
/ 26 декабря 2008

Boost.Test имеет компонент, облегчающий тестирование шаблонов по набору параметров шаблона.

0 голосов
/ 23 декабря 2008

Создание шаблона в модульном тесте - это проверка класса шаблона.

Каковы риски? Они зависят от того, что ваша библиотека делает с параметром шаблона; подумайте о том, какие проблемы могут возникнуть в зависимости от класса, используемого для создания экземпляра вашего шаблона, и написания новых тестов.

По крайней мере, у вас будет готовая среда модульного тестирования для воспроизведения любой проблемы, о которой будет сообщено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...