Как написать тест для шаблонов C ++? - PullRequest
6 голосов
/ 03 февраля 2011

Предположим, я пишу шаблон библиотеку, состоящую из шаблона функции

template<T> void f(T);

с требованием, чтобы он работал с предопределенным набором классов A, B, C и D, например, должно компилироваться следующее:

template<> void f(A);
template<> void f(B);
template<> void f(C);
template<> void f(D);

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

Я знаю, что могу вообще отказаться от тестирования фреймворков и просто написать простой cc-файл, содержащий 4 строки выше. Но я надеялся, что смогу включить это требование в обычные стандартные тестовые наборы для генерации отчетов о состоянии тестов. Например,

test f works with A: passed.
test f works with B: passed.
test f works with C: failed!  Cannot cast type C!
test f works with D: passed.

3 of 4 tests passed.
1 of 4 tests failed.

Ответы [ 4 ]

5 голосов
/ 03 февраля 2011

Напишите тестовый пример, который порождает компилятор ... вот как, например, autoconf тесты на наличие функций.

2 голосов
/ 03 февраля 2011

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

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

2 голосов
/ 03 февраля 2011

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

1 голос
/ 03 февраля 2011

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

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

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