Подтвердить что ты не робот

Препятствует ли запуск unit test с Valgrind?

Несколько дней назад я начал изучать структуру unit test под названием check, и я намерен запустить тест на c-код под Linux.

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

Но позвольте сказать, что я хочу протестировать динамическую структуру памяти с большим количеством malloc и бесплатно, и оказывается, что я могу поместить данные и получить правильные данные обратно. Но это не доказывает, что я не нарушил некоторую память в процессе, скажем, я забыл освободить половину памяти и потерял указатели (классический memleak). Этот код, вероятно, пройдет большую часть модульного тестирования.

Итак, теперь на вопрос: это хорошая идея, чтобы запустить весь код unit test, например, Valgrind и позволить ему обнаруживать любые проблемы с malloc/free? (Или, может быть, скомпилируйте что-нибудь вроде Electric Fence?)

Это похоже на хорошую идею, но я не уверен, что я здесь делаю.....

Спасибо Johan


Обновление: Спасибо Дугласу и Джонатану, кажется, что это хорошая идея, и я должен продолжить: -)

Обновление: Valgrind - забавный инструмент, однако первые memleaks, которые я нашел, делают это был в тестовой структуре, а не мой собственный код (довольно забавно, хотя). Поэтому всем остальным следует убедиться, что используемая вами инфраструктура unit test не протекает, прежде чем перевернуть свой собственный код вверх ногами. Пустым тестовым случаем было все, что было необходимо в моем случае, с тех пор работает только инфраструктура unit test.

4b9b3361

Ответ 1

Мы, безусловно, делаем - гораздо проще выполнять valgrind против модульных тестов, чем с полной программой.

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

Плюс проверять, что вы исправили это проще, потому что вы используете unit test не более сложный тест против вашей полной программы.

Если вы запускаете valgrind в автоматическом режиме, вы, вероятно, хотите --error-exitcode=<number> [default: 0]

Указывает альтернативный код возврата для возврата, если Valgrind сообщил о любых ошибки в запуске. Когда установлено значение значение по умолчанию (ноль), возвращаемое значение от Valgrind всегда будет возвращаемое значение процесса, являющегося смоделированы. Если задано ненулевое значение значение, это значение возвращается вместо этого, если Valgrind обнаружит ошибки. Эта полезно использовать Valgrind как часть автоматизированного набора тестов, поскольку он позволяет легко обнаруживать тестовые который Valgrind сообщил об ошибках, просто проверяя коды возврата.

http://valgrind.org/docs/manual/manual-core.html#manual-core.erropts

Ответ 2

Как сказал Дуглас Лидер, хорошо провести тесты на единицу с помощью любого диагностического программного обеспечения, которое вы можете возложить на руки, что обеспечит его работу, как вы ожидаете. Это включает в себя не злоупотребление памятью, поэтому использование valgrind - хорошая идея.

Вы действительно хотите, чтобы ваши модульные тесты доказывали, что ваш код работает.

Вам не нужно постоянно запускать их под valgrind - но это должно быть настолько тривиально, насколько это возможно, и вы должны делать это периодически (скажем, после больших изменений).