Я не делаю закрытых методов модульного теста. Закрытый метод является деталью реализации, которая должна быть скрыта пользователям класса. Тестирование закрытых методов повреждает инкапсуляцию.
, Если я нахожу, что закрытый метод огромен или сложен или достаточно важен для требования его собственных тестов, я просто поместил его в другой класс и обнародовал его там ( Объект Метода ). Тогда я могу легко протестировать previously-private-but-now-public метод, который теперь живет на его собственном классе.
Если метод будет достаточно достаточно значительным, я буду обычно делать, он "защитил", и протестируйте его. Некоторые методы оставят частными и протестированными неявно как часть модульных тестов на общественность/защищенные методы.
Это является очевидно языковозависимым. В прошлом с C++ я объявил, что класс тестирования друг класс. К сожалению, это действительно требует, чтобы Ваш производственный код знал о классе тестирования.
Если Вы не тестируете свои закрытые методы, как Вы знаете, что они не повредятся?
Если закрытый метод четко определен (т.е., он имеет функцию, которая является тестируемой и не предназначена для изменения со временем), тогда да. Я тестирую все, что это является тестируемым, где это имеет смысл.
, Например, библиотека шифрования могла бы скрыть то, что она выполняет блочное шифрование с закрытым методом, который шифрует только 8 байтов за один раз. Я записал бы модульный тест на тот - он не предназначен для изменения, даже при том, что он скрыт, и если он действительно повреждается (из-за будущих улучшений производительности, например) тогда, я хочу знать, что это - закрытая функция, которая повредилась, не только, который повредила одна из государственных функций.
Это ускоряет отладку позже.
-Adam
Как заключено в кавычки выше, "Если Вы не тестируете свои закрытые методы, как Вы знаете, что они не повредятся?"
Это - главная проблема. Одна из больших точек модульных тестов должна знать, где, когда, и как что-то повредилось как можно скорее. Таким образом уменьшая существенное количество разработки & усилие по QA. Если все, что тестируется, является общественностью, то у Вас нет честного покрытия и формирования рисунка внутренностей класса.
я нашел один из лучших способов сделать, это, просто добавляют тестовую ссылку на проект и помещают тесты в класс, параллельный закрытым методам. Вставьте соответствующую логику сборки так, чтобы тесты не встраивали в заключительный проект.
Тогда Вы обладаете всеми преимуществами тестирования этих методов, и можно найти проблемы в секундах по сравнению с минутами или часами.
Так, таким образом, да, модульный тест Ваши закрытые методы.
Модульные тесты, которым я верю, для тестирования открытых методов. Ваши открытые методы используют Ваши закрытые методы, так косвенно они также становятся протестированными.
Мы тестируем закрытые методы выводом, которым я подразумеваю, что мы ищем общее тестовое покрытие класса по крайней мере 95%, но только имеем наш тестовый вызов в общедоступные или внутренние методы. Для получения покрытия мы должны выполнить множественные вызовы общественности/внутренностям на основе различных сценариев, которые могут произойти. Это делает наши тесты большим количеством intentful вокруг цели кода, который они тестируют.
ответ Trumpi на сообщение, которое Вы связали, является лучшим.
Я не эксперт в этом поле, но поблочное тестирование должно протестировать поведение, не реализацию. Закрытые методы являются строго частью реализации, так по моему скромному мнению, не должен быть протестирован.
Если Ваш закрытый метод не тестируется путем вызова открытых методов тогда, что он делает? Я говорю частный не защищенный или друг.
Я думаю, лучше просто тестировать открытый интерфейс объекта. С точки зрения внешнего мира только поведение вопросов открытого интерфейса и это - то, к чему должны быть направлены Ваши модульные тесты.
, Как только у Вас есть некоторые твердые модульные тесты, записанные для объекта, Вы не хотите должными быть возвращаться и изменять те тесты просто потому что реализация позади измененного интерфейса. В этой ситуации Вы разрушили непротиворечивость своего поблочного тестирования.
Я вид чувства, вынужденного протестировать закрытые функции, поскольку я следую все больше одной из нашей последней рекомендации QA в нашем проекте:
Не больше, чем 10 в цикломатическая сложность на функцию.
Теперь побочный эффект осуществления этой политики состоит в том, что многие мои очень большие государственные функции разделены на более сфокусированный, лучшее, именованное частный функция.
государственная функция все еще там (конечно), но по существу уменьшается до названного все те частные 'подфункции'
, Который на самом деле прохладен, потому что стек вызовов теперь намного легче считать (вместо ошибки в большой функции, у меня есть ошибка в sub-sub-function с названием предыдущих функций в стеке вызовов, чтобы помочь мне понять, 'как я добрался там')
Однако, это теперь кажется легче модульному тесту непосредственно те частный функции и оставляет тестирование большой государственной функции к некоторому тесту 'интеграции', где сценарий должен быть обращен.
Просто мои 2 цента.
Я склонен следовать совету Dave Thomas и Andy Hunt в их книге Прагматическое Поблочное тестирование :
В целом, Вы не хотите повреждать любую инкапсуляцию ради тестирования (или поскольку мама раньше говорила, "не представляют Ваше причинное место!"). Большую часть времени необходимо быть в состоянии протестировать класс путем осуществления его открытых методов. Если существует значительная функциональность, которая скрыта позади частного или защищенного доступа, который мог бы быть предупредительным знаком, что существует другой класс, там изо всех сил пытающийся выходить.
, Но иногда я не могу мешать мне тестировать закрытые методы, потому что это дает мне, что смысл заверения, которое я создаю полностью устойчивая программа.
Какова цель протестировать?
в большинстве ответов до сих пор говорится, что закрытые методы являются деталями реализации, которые не делают (или по крайней мере не был должен), вопрос, пока открытый интерфейс хорошо протестирован и работа. Это абсолютно корректно , если Ваша единственная цель для тестирования состоит в том, чтобы гарантировать, что открытый интерфейс работает .
Лично, мое основное использование для тестов кода должно гарантировать, чтобы будущие изменения кода не вызывали проблемы и помочь моим усилиям по отладке, если они делают. Я нахожу что, тестируя закрытые методы так же полностью как открытый интерфейс (если не больше!) furthers та цель.
Рассмотрите: у Вас есть открытый метод A, который называет закрытый метод B. A и B, оба используют метод C. C изменяется (возможно, Вами, возможно, поставщиком), заставляя начинать проваливать его тесты. Не было бы полезно иметь тесты для B также, даже при том, что это является частным, так, чтобы Вы знали, находится ли проблема в употреблении A C, использовании B C или обоих?
закрытые методы Тестирования также увеличивают стоимость в случаях, где тестовое покрытие открытого интерфейса является неполным. В то время как это - ситуация, мы обычно хотим избежать, поблочное тестирование эффективности зависит и от тестов, находящих ошибки и от связанной разработки и затрат на обслуживание тех тестов. В некоторых случаях преимущества 100%-го тестового покрытия могут быть оценены недостаточные для гарантирования затрат на те тесты, произведя разрывы в тестовом покрытии открытого интерфейса. В таких случаях хорошо предназначенный тест закрытого метода может быть очень эффективным дополнением к кодовой базе.
Если вы разрабатываете управляемую тестами (TDD), вы протестируете свои частные методы.