Похоже, что во многих модульных тестах значения, параметризующие тест, либо испекаются самим тестом, либо объявляются предопределенным образом.
Например, вот тест, взятый из модульных тестов 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);
}
(Если код ожидает строку, возможно, случайная строка, известная как действительная для конкретной функции, может использоваться каждый раз)
Преимущество будет заключаться в том, что чем больше раз вы запускаете тест, тем больший набор возможных значений, которые, как вы знаете, могут обрабатывать корректно.
Это полезно? Зло? Есть ли недостатки в этом? Я полностью упустил точку модульного тестирования?
Спасибо за ваши мысли.