Должны ли частные / защищенные методы проходить модульное тестирование? - PullRequest
72 голосов
/ 09 апреля 2011

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

Теперь мой вопрос о частных и защищенных методах, которые я мог бы иметьнаписать в моем классе в поддержку методов / свойств, предоставляемых интерфейсом:

  • Должны ли частные методы в классе иметь свои собственные модульные тесты?

  • Должны ли защищенные методы в классе иметь свои собственные модульные тесты?

Мои мысли:

  • Тем более, что я кодируюинтерфейсы, я не должен беспокоиться о защищенных / частных методах, так как они являются черными ящиками.

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

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

Ответы [ 12 ]

1 голос
/ 09 апреля 2011

Я согласен со всеми остальными: ответ на ваш вопрос «нет».

Действительно, вы абсолютно правы в своем подходе и своих мыслях, особенно в отношении покрытия кода.

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

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

Кроме того, для C ++ (и я должен думать только для C ++) я реализую интерфейсы, используя только закрытые методы, чтобы указать, что класс должен использоваться только через интерфейс, который он реализует. Это останавливает меня по ошибке, вызывая новые методы, добавленные в мою реализацию из моих тестов

0 голосов
/ 07 декабря 2017

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

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

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