Существует много программируемых роботов вокруг. На самом деле даже некоторые Roomba (автоматизированный вакуум) могут быть запрограммированы. Это особенно хорошо, если Вы хотите учить детей, как программировать.
Если ваши шаги достаточно большие (или значимы сами по себе), вам следует рассмотреть возможность делегирования их другим меньшим классам и протестируйте взаимодействие между вашим классом и ними. Например, если у вас есть этап синтаксического анализа, за которым следует этап сортировки, за которым следует этап поиска, может иметь смысл иметь класс синтаксического анализатора, класс сортировщика и т. Д. Затем вы должны использовать TDD для каждого из них.
Не знаю, какой язык, который вы используете, но если вы находитесь в мире .net, вы можете сделать эти классы внутренними, а затем предоставить их вашему тест-классу с «внутренними элементами, видимыми для», что позволит скрыть их.
Реорганизуйте большой метод в более мелкие частные методы. Используйте отражение или другой механизм, доступный на вашем языке, для независимого тестирования более мелких методов. Худший случай - если у вас нет доступа к отражению или друзьям, сделайте методы защищенными и сделайте свой тестовый класс наследуемым от основного класса, чтобы он мог иметь к ним доступ.
Обновление : я также должен уточнить что простой рефакторинг до частных методов не обязательно означает, что вам нужно создавать тесты, специфичные для этих методов. Если вы тщательно тестируете общедоступные методы, которые полагаются на частные методы, возможно, вам не нужно тестировать частные методы напрямую. Это, наверное, общий случай.
При использовании TDD важно помнить, что тесты не должны жить вечно.
В вашем примере вы знаете, что собираетесь предоставить чистый интерфейс, и большая часть операции будет делегирована частным методам. Я думаю, что больше всего беспокоит предположение, что эти методы должны быть созданы как частные и оставаться такими. Также предполагается, что тесты должны оставаться в рабочем состоянии после того, как вы их разработали.
Мой совет для этого сценария:
В результате вы использовали TDD для создания всего метода, метод все еще покрывается тестами, а API - это именно тот, который вы хотите представить.
Большая путаница возникает из-за того, что когда вы Если вы написали тест, вы всегда должны его сохранять , и это не всегда так. Однако, если вы настроены сентиментально, есть способы, которыми модульные тесты для частных методов могут быть реализованы в Java , возможно, подобные конструкции есть в C #.
как это делает FinnNk , пытаясь выделить более мелкие методы в собственные классы. Если это не имеет смысла или если это займет слишком много времени, я бы порекомендовал то, с чем другие могут не согласиться: изменить небольшие методы на частные и удалить тесты для них.В результате вы использовали TDD для создания всего метода, метод все еще покрывается тестами, а API - это именно тот, который вы хотите представить.
Большая путаница возникает из-за того, что когда вы Если вы написали тест, вы всегда должны его сохранять , и это не всегда так. Однако, если вы сентиментальны, есть способы, которыми можно реализовать модульные тесты для частных методов в Java , возможно, есть аналогичные конструкции в C #.
как это делает FinnNk , пытаясь выделить более мелкие методы в собственные классы. Если это не имеет смысла или если это займет слишком много времени, я бы порекомендовал то, с чем другие могут не согласиться: изменить небольшие методы на частные и удалить тесты для них.В результате вы использовали TDD для создания всего метода, метод все еще покрывается тестами, а API - это именно тот, который вы хотите представить.
Большая путаница возникает из-за того, что когда вы Если вы написали тест, вы всегда должны его сохранять , и это не всегда так. Однако, если вы сентиментальны, есть способы, которыми можно реализовать модульные тесты для частных методов в Java , возможно, есть аналогичные конструкции в C #.
пытаясь выделить более мелкие методы в собственные классы. Если это не имеет смысла или если это займет слишком много времени, я бы порекомендовал то, с чем другие могут не согласиться: изменить небольшие методы на частные и удалить тесты для них.В результате вы использовали TDD для создания всего метода, метод все еще покрывается тестами, а API - именно тот, который вы хотите представить.
Большая путаница возникает из-за того, что когда вы Если вы написали тест, вы всегда должны его сохранять , и это не всегда так. Однако, если вы сентиментальны, есть способы, которыми можно реализовать модульные тесты для частных методов в Java , возможно, есть аналогичные конструкции в C #.
пытаясь выделить более мелкие методы в собственные классы. Если это не имеет смысла или если это займет слишком много времени, я бы порекомендовал то, с чем другие могут не согласиться: изменить небольшие методы на частные и удалить тесты для них.В результате вы использовали TDD для создания всего метода, метод все еще покрывается тестами, а API - это именно тот, который вы хотите представить.
Большая путаница возникает из-за того, что когда вы Если вы написали тест, вы всегда должны его сохранять , и это не всегда так. Однако, если вы сентиментальны, есть способы, которыми можно реализовать модульные тесты для частных методов в Java , возможно, есть аналогичные конструкции в C #.
или, если это займет слишком много времени, я бы порекомендовал то, с чем другие могут не согласиться: изменить небольшие методы на частные и удалить для них тесты .В результате вы использовали TDD для создания всего метода, метод все еще покрывается тестами, а API - это именно тот API, который вы хотите представить.
Большая путаница возникает из-за того, что, написав тест, вы всегда нужно держать , и это не обязательно так. Однако, если вы сентиментальны, есть способы, которыми можно реализовать модульные тесты для частных методов в Java , возможно, есть аналогичные конструкции в C #.
или, если это займет слишком много времени, я бы порекомендовал то, с чем другие могут не согласиться: изменить небольшие методы на частные и удалить для них тесты .В результате вы использовали TDD для создания всего метода, метод все еще покрывается тестами, а API - это именно тот API, который вы хотите представить.
Большая путаница возникает из-за того, что, написав тест, вы всегда нужно держать , и это не обязательно так. Однако, если вы сентиментальны, есть способы, которыми можно реализовать модульные тесты для частных методов в Java , возможно, есть аналогичные конструкции в C #.
В результате вы использовали TDD для создания всего метода, метод по-прежнему покрывается тестами, а API - это именно тот API, который вы хотите представить.
Большая путаница возникает из-за того, что написав тест, вы всегда должны его сохранять , и это не всегда так. Однако, если вы сентиментальны, есть способы, которыми можно реализовать модульные тесты для частных методов в Java , возможно, есть аналогичные конструкции в C #.
В результате вы использовали TDD для создания всего метода, метод по-прежнему покрывается тестами, а API - это именно тот API, который вы хотите представить.
Большая путаница возникает из-за того, что написав тест, вы всегда должны его сохранять , и это не всегда так. Однако, если вы сентиментальны, есть способы, которыми можно реализовать модульные тесты для частных методов в Java , возможно, есть аналогичные конструкции в C #.
Вы можете рассмотреть Texttest ( http://texttest.carmen.se/ ) как способ тестирования «под интерфейсом».
Он позволяет вам проверять поведение, исследуя зарегистрированные данные для проверки поведения, а не чисто черный блочное тестирование аргументов и результатов методов.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я слышал презентацию по Texttest и смотрел документацию, но еще не успел опробовать ее в серьезном приложении.
Я предполагаю, что A * означает алгоритм поиска (например, http://en.wikipedia.org/wiki/A*_search_algorithm ). Если да, то я понимаю вашу проблему, поскольку у нас похожие требования. Вот алгоритм WP, и я прокомментирую ниже:
function A*(start,goal)
closedset := the empty set % The set of nodes already evaluated.
openset := set containing the initial node % The set of tentative nodes to be evaluated.
g_score[start] := 0 % Distance from start along optimal path.
h_score[start] := heuristic_estimate_of_distance(start, goal)
f_score[start] := h_score[start] % Estimated total distance from start to goal through y.
while openset is not empty
x := the node in openset having the lowest f_score[] value
if x = goal
return reconstruct_path(came_from,goal)
remove x from openset
add x to closedset
foreach y in neighbor_nodes(x)
if y in closedset
continue
tentative_g_score := g_score[x] + dist_between(x,y)
if y not in openset
add y to openset
tentative_is_better := true
elseif tentative_g_score < g_score[y]
tentative_is_better := true
else
tentative_is_better := false
if tentative_is_better = true
came_from[y] := x
g_score[y] := tentative_g_score
h_score[y] := heuristic_estimate_of_distance(y, goal)
f_score[y] := g_score[y] + h_score[y]
return failure
function reconstruct_path(came_from,current_node)
if came_from[current_node] is set
p = reconstruct_path(came_from,came_from[current_node])
return (p + current_node)
else
return the empty path
Замкнутый набор может быть опущен (что дает алгоритм поиска по дереву), если решение гарантированно существует, или если алгоритм адаптирован так, что новые узлы добавляются к открытому набору, только если они имеют меньшее значение f, чем при любая предыдущая итерация.
Во-первых, и я не буду легкомысленным, это зависит от того, понимаете ли вы алгоритм - похоже, что вы понимаете. Также можно было бы расшифровать алгоритм, приведенный выше (в надежде, что он сработает), и провести ряд тестов. Вот что я бы сделал, так как подозреваю, что авторы WP лучше меня !. В крупномасштабных тестах будут проверяться крайние случаи, такие как отсутствие узла, один узел, два узла + без края и т. Д. Если все они пройдут, я буду спать счастливым. Но если они потерпели неудачу, нет другого выбора, кроме как понять алгоритм.
Если это так, я думаю, вам нужно построить тесты для структур данных. Это (как минимум) набор, расстояние, оценка и т. Д. Вы должны создать эти объекты и протестировать их. Каково ожидаемое расстояние для случая 1,2,3 ... написать тесты. Каков эффект добавления A к Z? нужен тест. Для этого алгоритма нужно протестировать heuristic_estimate_of_distance
и так далее. Это большая работа.
Один из подходов может заключаться в том, чтобы найти реализацию на другом языке и опросить ее, чтобы найти значения в структурах данных. Конечно, если вы модифицируете алгоритм, вы сами!
Есть одна вещь еще хуже - численные алгоритмы. Диагонализация матриц - действительно ли мы получаем правильные ответы. Я работал с одним ученым, который писал матрицы 3-й производной - меня это напугало бы ...
Каково ожидаемое расстояние для случая 1,2,3 ... написать тесты. Каков эффект добавления A к Z? нужен тест. Для этого алгоритма вам необходимо протестировать heuristic_estimate_of_distance
и так далее. Это большая работа.
Один из подходов может заключаться в том, чтобы найти реализацию на другом языке и опросить ее, чтобы найти значения в структурах данных. Конечно, если вы модифицируете алгоритм, вы сами!
Есть одна вещь еще хуже - численные алгоритмы. Диагонализация матриц - действительно ли мы получаем правильные ответы. Я работал с одним ученым, который писал матрицы 3-й производной - меня это напугало бы ...
Каково ожидаемое расстояние для случая 1,2,3 ... написать тесты. Каков эффект добавления A к Z? нужен тест. Для этого алгоритма нужно протестировать heuristic_estimate_of_distance
и так далее. Это большая работа.
Один из подходов может заключаться в том, чтобы найти реализацию на другом языке и опросить ее, чтобы найти значения в структурах данных. Конечно, если вы модифицируете алгоритм, вы сами!
Есть одна вещь еще хуже - численные алгоритмы. Диагонализация матриц - действительно ли мы получаем правильные ответы. Я работал с одним ученым, который писал матрицы 3-й производной - меня это напугало бы ...
Это большая работа.Один из подходов может заключаться в том, чтобы найти реализацию на другом языке и опросить ее, чтобы найти значения в структурах данных. Конечно, если вы модифицируете алгоритм, вы сами!
Есть одна вещь еще хуже - численные алгоритмы. Диагонализация матриц - действительно ли мы получаем правильные ответы. Я работал с одним ученым, который писал матрицы 3-й производной - меня это напугало бы ...
Это большая работа.Один из подходов может заключаться в том, чтобы найти реализацию на другом языке и опросить ее, чтобы найти значения в структурах данных. Конечно, если вы изменяете алгоритм, вы сами!
Есть еще одна вещь, которая хуже этого - числовые алгоритмы. Диагонализация матриц - действительно ли мы получаем правильные ответы. Я работал с одним ученым, который писал матрицы 3-й производной - меня это напугало бы ...