Похоже, что во многих модульных тестах значения, которые параметризуют тест, либо запекаются самим тестом, либо объявляются заранее определенным образом.Недетерминизм в модульном тестировании
Например, вот тест взят из модульных тестов NUnit в (EqualsFixture.cs):
[Test]
public void Int()
{
int val = 1;
int expected = val;
int actual = val;
Assert.IsTrue(expected == actual);
Assert.AreEqual(expected, actual);
}
Это имеет преимущество быть детерминированным; если вы один раз запустите тест, и он терпит неудачу, он будет продолжать сбой, пока код не будет исправлен. Тем не менее, вы заканчиваете тестирование только ограниченного набора значений.
Я не могу не чувствовать, что это пустая трата; точно такой же тест, вероятно, будет выполняться с теми же параметрами сотни, если не тысячи раз в течение всего жизненного цикла проекта.
Как насчет того, чтобы рандомизировать как можно больше входных данных во все модульные тесты, чтобы каждый запуск показывал что-то новое?
В предыдущем примере, может быть:
[Test]
public void Int()
{
Random rnd = new Random();
int val = rnd.Next();
int expected = val;
int actual = val;
Console.WriteLine("val is {0}", val);
Assert.IsTrue(expected == actual);
Assert.AreEqual(expected, actual);
}
(Если код ожидается строка, возможно, случайная строка, как известно, действует для конкретной функции можно было бы использовать каждый раз)
Выгода было бы в том, что чем больше раз вы запускаете тест, тем больший набор возможных значений вы знаете, что он может справиться правильно.
Полезно? Зло? Есть ли недостатки в этом? Неужели я полностью потерял точку модульного тестирования?
Спасибо за ваши мысли.
Одним из главных недостатков является то, что если вы получаете отказ в тестировании, он не воспроизводится по своей природе. Очевидно, что вы можете регистрировать, какие значения использовались, когда произошел сбой, но это создает накладные расходы и возможности пропустить что-то. Однако то, что вы описываете, по-прежнему определенно полезно: см. Http://en.wikipedia.org/wiki/Fuzz_testing для получения информации о некоторых способах использования этой идеи и ее расширения. – itowlson
Спасибо! Испытание Fuzz звучит точно, о чем я говорю. Я рассмотрю это больше. –
«то же самое испытание, вероятно, выполняется с теми же параметрами, сколько сотни, если не тысячи раз в течение всего жизненного цикла проекта» - к счастью, мы изобрели компьютеры именно так, чтобы они могли выполнять повторяющиеся задачи в течение всего дня и не надоедать! – Ken