Как бороться с утечками памяти при следовании TDD - PullRequest
6 голосов
/ 18 февраля 2011

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

Скажем, в моем приложении есть утечка памяти.Я могу воспроизвести его - запуск определенного метода 1 000 000 000 раз вызывает исключение OutOfMemoryException.Этот тест длится 10 секунд.

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

Так как исправить эту ошибку TDD-way?

Ответы [ 2 ]

7 голосов
/ 18 февраля 2011

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

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

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

Вместо этого я бы попытался написать функциональные или интеграционные тесты, которые запускают более полный фрагмент тестируемого приложения и используют любые инструменты, которые есть.доступны в вашей среде разработки, чтобы попытаться поймать утечки памяти.Некоторые языки позволят вам выполнить код, принудительно выполнить сборку мусора или выполнить другую очистку, а затем подтвердить, что использование памяти или количество выделенных объектов вернулись к своим предыдущим значениям.В других средах, которые могут оказаться неосуществимыми, поэтому вам может потребоваться выполнить более широкие измерения, возможно, наблюдая за использованием памяти приложением с течением времени в развертывании тестирования производительности.) и сфокусированы, чтобы им было удобно, когда они имеют смысл, но в конечном итоге вы можете рассматривать все виды тестовых или аналитических данных, которые вы можете собрать о своем коде, как часть вашего процесса TDD.Если вы в состоянии сделать утверждения о том, как должно работать ваше приложение, даже такие широкие утверждения, как «использование памяти должно оставаться стабильным в течение определенного времени», разработать автоматизированные средства тестирования этих утверждений и использовать эти тесты для управления вашим проектом, то я думаю, что выпрактикующий TDD.Напишите тесты, которые имеют смысл.

6 голосов
/ 18 февраля 2011

Напишите тест, который показывает, что используемая память не превысила некоторый порог, а не то, что у вас фактически не хватило памяти.

...