Модульное тестирование для случайных процессов?

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

5 ответов

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

Вот хороший пост в блоге, который охватывает эту тему. По сути, вам нужно ввести контролируемую случайность в тестируемый объект.

Может быть, вы могли бы использовать JUnit Theories чтобы решить это.

http://blogs.oracle.com/jacobc/entry/junit_theories

вам нужно найти Q0 и p00 для системы. p00 - это прогнозируемое состояние, а qo - расчетное состояние. прогнозируемое состояние может привести к нахождению рекуррентной системы, которая является наименьшим значением, скажем, k в системе.

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

Другие вопросы по тегам