Тестирование функций со случайным выводом - PullRequest
2 голосов
/ 18 ноября 2010
  • Я работаю над тестовым проектом для тестирования библиотеки нейронных сетей ...
  • Проблема в том, что эта библиотека иногда использует случайные числа ..
  • Мне нужно получитьтестовые случаи (вход, ожидаемый результат, фактический вывод) ...

Кто-нибудь имеет представление о том, как выводить тестовые случаи (вход, ожидаемый результат, фактический вывод) в функцию, которая использует случайные числапринятие мер и оценка результатов ??

Ответы [ 2 ]

4 голосов
/ 18 ноября 2010

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

Anпример первого рода (это Python, но принцип может применяться на любом языке).

def test_random_number():
    total = sum(random.uniform(0, 1) for _ in xrange(1000))
    assert 100 < total < 900

Таким образом, этот тест может провалиться, если вам не повезло, но он все же является разумным тестом, поскольку онпройти почти все время, и сделать этот вид теста довольно просто.

Чтобы сделать все правильно, вам нужно ввести случайный источник.

class DefaultRandomBehavior(object):
    def pick_left_or_right(self):
        return random.choice(['left', 'right'])

class AardvarkModeller(object):
    def __init__(self, random_source=None):
        self.random_source = random_source or DefaultRandomBehavior()

    def aardvark_direction(self):
        r = self.random_source.pick_left_or_right()
        return 'The aardvark faces ' + r

Теперь вы можетеМодульное тестирование это либо путем макетирования или фальсификации класса DefaultRandomBehavior, тем самым полностью обойдя недетерминизм.

2 голосов
/ 18 ноября 2010

Маловероятно, что библиотека действительно использует случайные числа, поскольку компьютеры просто не очень хорошо их генерируют.Вместо этого он, вероятно, использует генератор псевдослучайных чисел, каким-то образом посеянный, возможно, из «реального» случайного источника или, возможно, из текущего времени.Один из способов сделать ваши результаты воспроизводимыми - научить библиотеку принимать принимаемое пользователем начальное значение PRNG и устанавливать для него некоторую константу для ваших тестовых случаев.Тогда внутренняя последовательность случайных чисел всегда будет одинаковой для ваших тестов.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...