Поблочное тестирование большой метод

Существует много программируемых роботов вокруг. На самом деле даже некоторые Roomba (автоматизированный вакуум) могут быть запрограммированы. Это особенно хорошо, если Вы хотите учить детей, как программировать.

7
задан Finglas 6 January 2010 в 17:09
поделиться

5 ответов

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

Не знаю, какой язык, который вы используете, но если вы находитесь в мире .net, вы можете сделать эти классы внутренними, а затем предоставить их вашему тест-классу с «внутренними элементами, видимыми для», что позволит скрыть их.

13
ответ дан 6 December 2019 в 10:01
поделиться

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

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

4
ответ дан 6 December 2019 в 10:01
поделиться

При использовании TDD важно помнить, что тесты не должны жить вечно.

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

Мой совет для этого сценария:

  • Нарисуйте скелет большого метода в терминах новых методов, чтобы у вас был ряд шаги, которые имеет смысл тестировать индивидуально.
  • Сделайте эти новые методы общедоступными по умолчанию и начните их разработку с использованием TDD.
  • Затем, когда вы протестируете все части, напишите еще одну, которая проверяет весь метод . Гарантируя, что если какая-либо из меньших, делегированных частей сломается, этот новый тест не удастся.
  • На этом этапе большой метод работает и покрывается тестами, теперь вы можете начать рефакторинг. Я' Я рекомендую, как это делает FinnNk , попытаться выделить более мелкие методы в их собственные классы. Если это не имеет смысла или если это займет слишком много времени, я бы порекомендовал то, с чем другие могут не согласиться: изменить небольшие методы на частные и удалить тесты для них.

В результате вы использовали 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 #.

2
ответ дан 6 December 2019 в 10:01
поделиться

Вы можете рассмотреть Texttest ( http://texttest.carmen.se/ ) как способ тестирования «под интерфейсом».

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

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я слышал презентацию по Texttest и смотрел документацию, но еще не успел опробовать ее в серьезном приложении.

-1
ответ дан 6 December 2019 в 10:01
поделиться

Я предполагаю, что 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-й производной - меня это напугало бы ...

1
ответ дан 6 December 2019 в 10:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: