Модули тестирования С++ шаблонов

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

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

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

Ответы

Ответ 1

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

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

Ответ 2

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

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

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

Один ресурс:

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

В начале этой книги автор показывает такие примеры, как:

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

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

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

Ответ 3

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

Ответ 4

Установление шаблона в unit test - это проверка класса шаблона.

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

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