Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Тесты для рандомных сущностей  (Прочитано 19187 раз)
0 Пользователей и 1 Гость смотрят эту тему.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« : 27-08-2013 21:02 » new

Столкнулся по работе с тестом (написанным до меня), проверяющим некую сущность, свойства которой определяются генератором случайных чисел. При этом тест иногда не проходит. Как лучше тестировать подобные сущности? Я предложил как минимум устанавливать seed. Существует ли какой-либо универсальный подход к таким ситуациям?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 27-08-2013 22:05 » 

Объект, поля которого вычисляются рандомно для теста - это понятно.

Непонятно, что именно проверяет тест, и каковы критерии валидизации в тесте?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 28-08-2013 06:14 » 

Нет, Дим, не тест создает случайные значения, а нутро сущности и это нормальная ее работа. Есть плоское игровое поле и генератор некоторых объектов, размещающих их на поле в случайном порядке, но по некоторому закону. Скажем, находится на поле объект А и с некоторой вероятностью рядом появится другой объект А. Тест должен проверить, что такой закон работает.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 28-08-2013 06:33 » 

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

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 28-08-2013 07:40 » 

Ром, что значит

тест иногда не проходит

Если речь идёт о вероятности события, то тест не может не проходить, ведь если А не появилось - является подтверждением работы закона. Поэтому поддерживаю Славу: можно только задать значение вероятности, а потом проделать определённую кучу "экспериментов" и с некой точностью сравнивать полученный результат с заданой величиной. Если отклонение не больше чем, то закон работает.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Dimka
Деятель
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 28-08-2013 07:47 » 

RXL, ну значит тест накапливает статистику и изучает закон распределения вероятностей. Если закон статистически подтверждён - тест пройден. Вопрос в том: какой закон требуется (хорошая реализация rand() даёт равномерное распределение). Вся статистика основана на центральной предельной теореме теории вероятностей: если есть случайные (т.е. не подчинённые функциональному закону) величины, и они устроены таким образом, что чем больше значений просуммировано, тем меньший вклад привносит очередное значение, в бесконечности они дают нормальное распределение. Отсюда в статистике появляется масса разных вычисляемых показателей и критериев о том, с какой вероятностью параметры выборки (набора имеющихся данных) соответствуют параметрам генеральной совокупности (теоретической совокупности всех данных). Причём обычно это делается в форме гипотезы со стандартным доверительным интервалом (упомянутой вероятностью соответствия) 95%, 99%, 99,99...% - в зависимости от потребностей. Т.е. если расчётная величина больше или меньше того или иного критерия, гипотеза считается верной или неверной в доверительном интервале (например, не менее или не более чем на 95%).
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 28-08-2013 18:56 » 

...тест иногда не проходит. Как лучше тестировать подобные сущности?

1. Зафиксировать проблемную последовательность чисел, при которой тест не проходит.
2. Заменить генератор (псевдо)случайных чисел тестовым двойником, способным по запросу генерировать проблемную последовательность. В данном случае подойдет, например, "диверсант" или "подставной объект".
3. Составить модульные тесты, подтверждающие действительное наличие ошибки при такой последовательности входных данных.
4. Локализовать и исправить ошибку (возможно, после рефакторинга). Убедиться, что тесты проходят.
5. Обязательно включить эти тесты в набор регрессионных, чтобы в будущем эта ошибка не вернулась.

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

Вариант с seed в принципе тоже работоспособен, но слишком завязан на конкретную реализацию генератора последовательностей (псевдо)случайных чисел. Другая реализация при том же seed'е может породить совершенно другую последовательность. Или, если используется аппаратный генератор, такой подход тем более не сработает.
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines