Ваши алгоритмы, вероятно, имеют случайный компонент. Возьмите это под контроль.
Вы можете либо
- Разрешить вызывающему абоненту выбрать начальное число для генератора случайных чисел. Затем используйте в тесте твердо закодированное семя.
- Пусть вызывающий абонент предоставит генератор случайных чисел. Затем используйте в тестах ложный генератор случайных чисел.
Второй вариант, вероятно, лучший, так как вам будет проще рассуждать, каков правильный результат алгоритма.
При алгоритмах модульного тестирования вы хотите проверить, правильно ли вы реализовали алгоритм. Не то, делает ли алгоритм то, что должен делать. Модульные тесты не должны рассматривать тестируемый код как черный ящик.
Возможно, вы захотите провести отдельный «тест производительности», чтобы сравнить, как работают разные алгоритмы (и действительно ли они работают), но ваши юнит-тесты действительно предназначены для тестирования вашей реализации алгоритма.
Например, при реализации алгоритма оптимизации Foo-Bar-Baz (TM) вы могли случайно написать x: = x / 2 вместо x: = x / 3. Это может означать, что алгоритм работает медленнее, но все равно находит тот же алгоритм. Вам понадобится тестирование белого ящика, чтобы найти такую ошибку.
Edit:
К сожалению, я не могу выбрать фиксированное начальное число для генератора случайных чисел, потому что я не хочу проверять, дает ли алгоритм тот же самый результат, что и раньше, но я хочу проверить что-то вроде «С 90% уверенностью, я получаю результат с 0,1 или лучше ".
Я не вижу способа сделать тест, который был бы автоматически проверяемым и стохастическим. Особенно если вы хотите иметь возможность отличить реальные ошибки от статистического шума.
Если вы хотите проверить «С 90% уверенностью, я получаю результат с 0.1 или лучше», я бы предложил что-то вроде:
double expectedResult = ...;
double resultMargin = 0.1;
int successes = 0;
for(int i=0;i<100;i++){
int randomSeed = i;
double result = optimizer.Optimize(randomSeed);
if(Math.Abs(result, expectedResult)<resultMargin)
successes++;
}
Assert.GreaterThan(90, successes);
(Обратите внимание, что этот тест является детерминированным).