Является ли хорошей практикой измерять время выполнения метода в модульном тесте, чтобы генерировать исключение, если оно выполняется слишком медленно? - PullRequest
4 голосов
/ 12 марта 2012

Все в названии, и мне интересно, хорошая ли это практика или нет:

[TestMethod]
public void Compute_Array_In_Less_1_Second()
{
    Stopwatch watcher = new Stopwatch();

    int[] A = Enumerable.Range(0, 50000).Select(i => GetRandomNumber(MIN_INT, MAX_INT)).ToArray();

    watcher.Start();
    int[] R = Program.MethodThatReturnsAnArray(A);
    watcher.Stop();

    if (watcher.ElapsedMilliseconds > 1000)
        Assert.Fail("The method runs in more 1 second");
}

Спасибо

Ответы [ 5 ]

9 голосов
/ 12 марта 2012

Нет, это не так.

Юнит-тесты не проводятся в «нормальных» условиях, поэтому результаты будут бесполезными.

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

Настройте тест производительности (обычно сквозной) в условиях, близких к производственной среде.

3 голосов
/ 12 марта 2012

Вы должны использовать соответствующие механизмы, предоставляемые вашей средой тестирования, такие как: http://nunit.org/index.php?p=timeout&r=2.5

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

2 голосов
/ 12 марта 2012

Нет.Он связывает неудачу / успех тестирования вашего устройства с машиной / средой.Вы не хотите, чтобы кто-то с более медленной машиной провалил этот модульный тест из-за ... ну, более медленной машины?

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

0 голосов
/ 12 марта 2012

Это зависит от приложения.

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

Но вывсе равно придется с этим справиться.Почему бы просто не справиться с этим там, где это происходит?

0 голосов
/ 12 марта 2012

Я думаю, что это будет частично зависеть от того, что тестируется.Если это что-то, что могло бы потенциально истечь (например, получить сетевое соединение, которое действительно должно произойти в течение определенного времени), это может быть уместно.Как упомянул Magrangs, тестирование времени - это больше тестирование производительности, чем модульное тестирование.Модульное тестирование просто проверяет, действительно ли запущенный объект выполняет то, что должен, - не проверяя, работает ли он так быстро, как положено.

...