Как проверить утверждения?

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

Например. в классе Table я хочу убедиться, что проходы строк и столбцов не превышают количество строк и столбцов в таблице. Предположим, я забыл проверить наличие столбцов. Я хотел бы, чтобы мои модульные тесты выполняли тест, при котором утверждение должно срабатывать, а в противном случае - провалить тест. Это возможно?


person Samaursa    schedule 12.06.2011    source источник
comment
Вы должны указать, какую среду модульного тестирования вы используете, поскольку ответ зависит от этого.   -  person David Rodríguez - dribeas    schedule 13.06.2011
comment
Круто, -1 без объяснения причин :) @David: Я использую фреймворк для тестирования CATCH. Я воспользуюсь предложением пшеницы и конвертирую утверждения в исключения только для библиотеки модульного тестирования и тестирую без броска.   -  person Samaursa    schedule 13.06.2011


Ответы (3)


Тогда возникает вопрос: планируете ли вы рефакторинг своего кода, чтобы в случае возникновения этого условия вы генерировали исключение вместо того, чтобы полагаться на <cassert> функциональность, которая укажет вам на проблему? Если это так, вы можете просто проверить, что исключение было сгенерировано. В противном случае будет сложнее протестировать оператор assert из <cassert>. Фреймворки модульного тестирования, такие как CUTE, имеют макрос ASSERT_THROWS только для тестирования исключений. Я бы проверил ваш фреймворк.

Кроме того, в магазинах, где я работал, они недовольны assert и предпочитаю исключения. Вызов abort не помогает автоматическому тестированию. Собственно, он это и запрещает. Всего два цента.

person wheaties    schedule 12.06.2011
comment
Я компилирую без исключений, поэтому могу использовать только утверждения. Я рассмотрю преобразование макросов assert в утверждения только для проекта модульного тестирования. - person Samaursa; 13.06.2011

Есть три возможных пути:

  • преобразование утверждений в исключения, или

  • запускать каждый тест отдельной программой, код выхода которой вы (вернее, тестовая среда) проверяете, или

  • пусть срабатывающее утверждение напишет информацию о себе, которую затем сможет обработать тестовая среда.

Насколько мне известно, ни одна коммерческая или широко используемая среда модульного тестирования не поддерживает последние два способа. Я использовал проверку кода выхода из процесса для программирования хобби, но только с небольшой персональной структурой модульного тестирования, реализованной на Python и C ++ («хобби-программирование»: это означает, что у меня нет надежных данных о том, насколько хорошо он масштабируется для крупномасштабного программирования). Основной случай тестирования кода выхода из процесса - это когда код имеет статические утверждения, которые вы хотите быть уверены, что они запускаются тогда, когда они должны быть.

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

Ура & hth.

person Cheers and hth. - Alf    schedule 12.06.2011
comment
Спасибо, преобразовать их в исключения - вот что я сделаю (+1) - person Samaursa; 13.06.2011

Ответ зависит от конкретной тестовой среды, которую вы используете, и, вероятно, будет найден при очень небольшом поиске в Google.

Первое попадание в запрос «boost unittest test assert» указывает на этот вопрос в StackOverflow: Проверка утверждения в среде Boost Test

Второе обращение «cppunit test assert» указывает на эту страницу документации: Создание утверждений

Попробуйте поискать в Интернете свой конкретный фреймворк.

person David Rodríguez - dribeas    schedule 12.06.2011
comment
Я пробовал полагаться на поиск SO, но полагаю, что это была плохая идея (часто также вводятся неверные условия поиска) - person Samaursa; 13.06.2011