2009-07-07 1 views
3

Представьте, что у вас есть список поставщиков с внутренним контролем. Теперь представьте, что вы хотите сопоставить неструктурированные строки с этим списком. Большинство из них будут легко соответствовать, но некоторые из них могут быть практически невозможны. Алгоритм присваивает уверенность каждому соответствию, но человеку нужно подтвердить все произведенные матчи.Как проверить методы, которые могут не всегда давать правильный ответ

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

ответ

3

Я бы попробовал некоторые «канонические» пары, пары «должны соответствовать» и «не должны совпадать», и проверяйте только, если доверие выше (или ниже) заданного порога.

Возможно, вы также можете выполнить некоторые проверки заказа, такие как «никакая пара не должна обладать большей уверенностью, чем одна из пары точного соответствия», или «пара, соответствующая всем согласным, должна быть> = единственная гласная».

+0

Ошибка тестирования также была бы хорошей идеей, по крайней мере, чтобы убедиться, что доверие алгоритма не является произвольным. Как вы указали, отбрасывание результатов в пределах диапазона (25-75 процентилей, возможно) было бы хорошей идеей. –

1

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

+0

Это отличная идея. В тестах должны быть указаны номера доверия (я не думал об этом), и это звучит как хороший способ сделать это. –

0

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

0

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

Удачи.

1

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

Если возможно, добавьте новые совпадения в модульные тесты.

+0

На самом деле это было бы весело. К сожалению, я не думаю, что временные ограничения позволят, но тем не менее это что-то «включить в список». –

0

Я думаю, что здесь есть два вопроса: способ, которым ваш код ведет себя согласно алгоритму, и способ успешного алгоритма (т.е. не принимает ответы, которые человек позже отвергает, и не отвергает ответы, которые человек принял бы).

Вопрос 1 является регулярным тестированием. Проблема 2 Я бы пошел с предыдущими наборами результатов (т. Е. Сравнил результаты алгоритма с человеческими).

0

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

0

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

Для тех видов обстоятельств я буду использовать шаблон «Проверка проверок Гуру». Создайте коллекцию входов, запишите выходные данные и в последующих сериях модульных тестов убедитесь, что результат соответствует предыдущим результатам.Не так хорошо для обеспечения правильной реализации целевого алгоритма, но он эффективен для обеспечения того, что последний рефакторинг не изменил поведение в тестовом пространстве.

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

Образцы, которые имеют четкие правильные ответы (точные совпадения, нулевые совпадения, угловые случаи с высоким значением), должны храниться в отдельном тесте.

+0

Что делать, если я каким-то образом улучшу алгоритм для получения лучших результатов? Что делать, если я делаю это * и * рефакторинг? Это неплохая идея, но в моем случае я не уверен, что смогу доверять этому тесту. –

Смежные вопросы