Должны ли каждый тестовый случай отменять свою работу в конце? - PullRequest
1 голос
/ 21 июля 2009

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

//start test-case for CreateObject function
{
// initialization of parameters
MyObject *obj = CreateObject();
// test results
}
//end test-case for CreateObject function

Необходимо ли в этом случае также освобождать память, вызывая функцию "DestroyObject"? [это частный случай, который породил этот вопрос]

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

Что ты думаешь? В этом случае, а также в общем случае.

Спасибо

Юлиан

Ответы [ 4 ]

8 голосов
/ 21 июля 2009

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

Что касается более общей ситуации, тесты должны очистить то, что они сделали. Большинство структур модульного тестирования позволяют вам реализовать метод tearDown () для этого. Таким образом, если один тест не пройден, вы будете знать, что это проблема с этим тестом, а не взаимодействие с другим тестом.

4 голосов
/ 21 июля 2009

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

3 голосов
/ 21 июля 2009

Не напрямую связано с тестированием, но если у вас есть код C ++, который выполняет такие вещи, как:

MyObject *obj = CreateObject();

где "obj" не является умным указателем или не управляется классом, тогда у вас проблемы. Если бы я писал тест, я бы сказал:

MyObject obj;
// tests on obj here

Независимо от результатов ваших тестов, объект будет корректно уничтожен. Никогда не создавайте объект динамически в C ++, если вы можете избежать этого.

1 голос
/ 21 июля 2009

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

Однако вы обнаружите, что довольно часто встречаются методы настройки и разборки до и после установки, которые настраивают целую среду тестирования (такую ​​как база данных или что-то еще), что целая куча модульных тестов можно выполнить против.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...