Использование CppUnit для обнаружения утечек памяти - PullRequest
5 голосов
/ 16 июня 2009

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

т.е. CPPUNIT_ASSERT_NO_LEAKS ()

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

Ответы [ 8 ]

4 голосов
/ 16 июня 2009

Если вы работаете в Linux, вы можете запустить свои тесты с помощью memcheck .

В разделе Client Requests руководства описано несколько полезных макросов, один из которых отмечен как полезный для тестирования:

VALGRIND_COUNT_LEAKS: заполняет четыре аргумента количеством байтов памяти, обнаруженных предыдущей проверкой на утечку как утечка, сомнительная, достижимая и подавленная. Опять же, полезно в тестовом коде, после вызова VALGRIND_DO_LEAK_CHECK.

Макрос определен в memcheck.h (вероятно, в /usr/include/valgrind), и требуемая последовательность будет напоминать

unsigned long base_definite, base_dubious, base_reachable, base_suppressed;
VALGRIND_DO_LEAK_CHECK;
VALGRIND_COUNT_LEAKS(base_definite, base_dubious, base_reachable, base_suppressed);
// maybe assert that they're zero!

// call test

unsigned long leaked, dubious, reachable, suppressed;
VALGRIND_DO_LEAK_CHECK;
VALGRIND_COUNT_LEAKS(leaked, dubious, reachable, suppressed);
CPPUNIT_ASSERT_EQUAL(base_leaked, leaked);
// etc.

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

3 голосов
/ 16 июня 2009

CPPUNIT по умолчанию не поддерживает проверку утечек памяти.

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

Если вы ищете платформу для модульных тестов с поддержкой обнаружения утечек памяти, попробуйте посмотреть CppUTest . Это проект, используемый Мартином Фаулером и Бобом Мартином на некоторых курсах TDD. Это очень хорошо.

2 голосов
/ 16 июня 2009

В Windows было бы довольно просто использовать несколько вызовов кучи отладки, чтобы заставить CppUnit воздействовать на эту информацию, используя _CrtMemCheckpoint() и _CrtMemDifference():

Есть недостатки:

  • вам нужно будет что-то поместить вручную в начале теста, чтобы получить контрольную точку (возможно, есть способ как-то интегрировать это в CppUnit)
  • это только Windows (возможно, что-то похожее на других платформах)
  • это будет работать только для сборок с Debug CRT
1 голос
/ 09 июля 2012

Я знаю, что уже слишком поздно, чтобы ответить на этот вопрос. Но вот отличный инструмент от Microsoft. Я сейчас пользователь Linux, но я использовал это, когда писал код в Windows (Visual C ++ и Qt) http://www.microsoft.com/en-us/download/details.aspx?id=20028

1 голос
/ 18 июня 2009

Там, где я работаю, мы создаем наши модульные тесты с очисткой. Затем наша платформа непрерывной интеграции извлекает как количество тестовых случаев, которые прошли успешно / не удалось, так и количество пропущенных байтов (+ результаты lint и coverity) и отображает их на веб-странице. Я настоятельно рекомендую сделать это таким образом.

Извините, что не предоставили решение, которое вы хотели.

0 голосов
/ 17 июня 2009

Я знаю, что это не CppUnit, но boost :: test может обнаружить утечку памяти.

С http://www.boost.org/doc/libs/1_39_0/libs/test/doc/html/execution-monitor/user-guide.html:

void detect_memory_leaks( bool on_off );

void break_memory_alloc( long mem_alloc_order_num );

0 голосов
/ 16 июня 2009

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

0 голосов
/ 16 июня 2009

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

...