Как выполнить модульное тестирование преднамеренных ошибок компиляции кода шаблона - PullRequest
39 голосов
/ 02 сентября 2011

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

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

Поскольку тест даже не должен компилироваться, вы не можете полагаться на такие вещи, как , так что, я думаю, он должен быть интегрирован в систему сборки?Как обычно решаются эти проблемы?

Ответы [ 3 ]

11 голосов
/ 02 сентября 2011

Сделайте это аналогично тому, как написаны тесты компилятора.У вас будет немного кода для тестирования на каком-либо языке сценариев (shell, perl, tcl и т. Д.), Который будет запускать компилятор с заданными фрагментами кода и проверять, скомпилированы ли правильные, а правильные нет.

  • gcc использует DejaGnu , который построен поверх ожидают , который сам построен поверх Tcl.
  • Если вы используете скрипт оболочки (возможно, проще, DejaGnu, вероятно, излишне), вы можете захотеть взглянуть на shUnit2 .
  • Система Perl Test::Harness должна быть в основном проста в использовании как есть.
  • В конце концов,не так много работы для запуска процесса из C ++, поэтому написание функции, которая пытается вызвать компилятор для заданной строки и проверить, выводит ли она ошибку для строки, где вы ожидаете, что это будет не так сложно, и чем вы можете интегрировать ее вдругие тесты на основе boost.test.
4 голосов
/ 06 октября 2011
3 голосов
/ 02 сентября 2011

Вы должны полагаться на внешнюю среду для запуска набора тестов компиляции, например, make-файлов или заданий hudson, и проверять выходные данные компилятора или артефакты компилятора.Если предполагается, что компиляция не удалась, то не должно быть объектного файла для компилируемого файла.Я предполагаю, что вы могли бы написать плагин для Hudson, чтобы сделать это, или простой пакетный скрипт, который запускает make-файл, который компилирует все тестовые файлы, которые должны быть неудачными или успешными, и соответственно отмечать успехи или неудачи.

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

Переход на один уровень глубже, вероятно, будет означать написание расширения компилятора для этого (LLVM может справиться с тем, что вы просите)

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