2009-07-13 3 views
6

Как вы тестируете ошибки, вызванные ошибками компилятора в модульном тестировании?Тестирование модулей для ошибок компилятора

Рассмотрим код:

class ErrorTest 
{ 
    OtherClass& read_write() { 
     return other; 
    } 

    const OtherClass& read_only() const { 
     return other; 
    } 

    private: 
     OtherClass other; 
}; 

Как я могу проверить для READ_ONLY() задание? Это очень важно и должно быть надежно проверено, чтобы правильно генерировать ошибки компилятора:

ErrorTest test; 
OtherClass other = test.read_only(); 
test.read_write() = other.modify(); 
test.read_only() = other.modify(); /* This should error */ 
+0

Хороший вопрос. Я уже задавался вопросом об этом раньше. Тем не менее, я действительно не нашел хороших ответов.Конечно, вы можете написать сценарий, который пытается скомпилировать файл, и проверяет код ошибки или что-то в этом роде, но вряд ли это изящное решение. – jalf

ответ

1

Я думаю, главный вопрос сейчас, вы тестирование, что ваш код или компилятор в данный момент?

Тестирование компилятора не обязательно является плохим ... У меня в прошлом были ошибки маскировки компилятора, поэтому было бы неплохо убедиться, что вы получаете тот же набор проверок безопасности, которые вы ожидаете.

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

Менее легкий подход может заключаться в том, чтобы сохранить каталог с неправильным кодом и иметь скрипт для каждого файла по одному за раз. У вас есть флаг #ifdef MAKEFAIL, который включает точное условие, которое должно завершиться неудачей. Убедитесь, что компилятор возвращает 0, когда вы не устанавливаете этот флаг, и при отсутствии ненулевого значения. Это предполагает, что компилятор возвращает ненулевое значение при ошибке ... Я не знаю, следует ли MSVC следовать этому правилу.

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

+6

Он тестирует, что его код является const-правильным. Поэтому я думаю, что он все еще тестирует свой код, он просто проверяет его свойства, которые очевидны только во время компиляции. –

+0

Я читал, что, пытаясь обеспечить, чтобы компилятор генерировал предупреждения, а не что нет предупреждений. Кажется немного лишним, чтобы провести единичный тест, сообщив, что ваша компиляция жаловалась, но, возможно, если у вас есть хороший unit-test-output-parser, это имеет смысл. –

+1

Он пытается убедиться, что компилятор создает ошибку, а не предупреждение. В C++ есть много случаев, когда это имеет смысл. Корректность - это один пример, но если вы играете с шаблонами, это также часто встречается. – jalf

1

Это похоже на автоматическое обнаружение, которое происходит, когда вы «./configure» для сборки из источника на машине * nix. Скрипты autoconf строят небольшие программы и пытаются скомпилировать их, чтобы определить, что доступно и поддерживается вашим компилятором.

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

0

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

Но для этого случая то, что вы действительно хотите, это инструмент статического анализа, который проверяет, чтобы код, который ваши разработчики пишут, соответствует соглашениям, таким как этот. Это, безусловно, действительный инструмент построения. Однако поиск инструмента статического анализа для поиска того, что вы здесь указываете, может быть затруднительным. Я начну с статьи Википедии List of tools for static code analysis, в разделе C/C++.

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

+0

К сожалению, cppcheck не работает для такого типа ошибок: «$ cppcheck main.cpp Проверка main.cpp: ... Не найдено ошибок» – LiraNuna

+0

Есть ли способ настроить cppcheck? Это не похоже на это. Это то, что вам нужно сделать, чтобы обеспечить соблюдение вашего соглашения. –

Смежные вопросы