Я должен протестировать закрытые методы или только общедоступные? [закрытый]

329
задан Community 23 May 2017 в 01:55
поделиться

15 ответов

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

, Если я нахожу, что закрытый метод огромен или сложен или достаточно важен для требования его собственных тестов, я просто поместил его в другой класс и обнародовал его там ( Объект Метода ). Тогда я могу легко протестировать previously-private-but-now-public метод, который теперь живет на его собственном классе.

314
ответ дан Luke Girvin 23 November 2019 в 00:46
поделиться

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

0
ответ дан 23 November 2019 в 00:46
поделиться

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

2
ответ дан dvorak 23 November 2019 в 00:46
поделиться

Если Вы не тестируете свои закрытые методы, как Вы знаете, что они не повредятся?

3
ответ дан Billy Jo 23 November 2019 в 00:46
поделиться

Если закрытый метод четко определен (т.е., он имеет функцию, которая является тестируемой и не предназначена для изменения со временем), тогда да. Я тестирую все, что это является тестируемым, где это имеет смысл.

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

Это ускоряет отладку позже.

-Adam

18
ответ дан Adam Davis 23 November 2019 в 00:46
поделиться

Как заключено в кавычки выше, "Если Вы не тестируете свои закрытые методы, как Вы знаете, что они не повредятся?"

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

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

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

Так, таким образом, да, модульный тест Ваши закрытые методы.

6
ответ дан Adron 23 November 2019 в 00:46
поделиться

Модульные тесты, которым я верю, для тестирования открытых методов. Ваши открытые методы используют Ваши закрытые методы, так косвенно они также становятся протестированными.

9
ответ дан scubabbl 23 November 2019 в 00:46
поделиться

Мы тестируем закрытые методы выводом, которым я подразумеваю, что мы ищем общее тестовое покрытие класса по крайней мере 95%, но только имеем наш тестовый вызов в общедоступные или внутренние методы. Для получения покрытия мы должны выполнить множественные вызовы общественности/внутренностям на основе различных сценариев, которые могут произойти. Это делает наши тесты большим количеством intentful вокруг цели кода, который они тестируют.

ответ Trumpi на сообщение, которое Вы связали, является лучшим.

11
ответ дан Tom Carr 23 November 2019 в 00:46
поделиться

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

11
ответ дан maxbog 23 November 2019 в 00:46
поделиться

Если Ваш закрытый метод не тестируется путем вызова открытых методов тогда, что он делает? Я говорю частный не защищенный или друг.

19
ответ дан chrissie1 23 November 2019 в 00:46
поделиться

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

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

26
ответ дан 17 of 26 23 November 2019 в 00:46
поделиться

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

Не больше, чем 10 в цикломатическая сложность на функцию.

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

, Который на самом деле прохладен, потому что стек вызовов теперь намного легче считать (вместо ошибки в большой функции, у меня есть ошибка в sub-sub-function с названием предыдущих функций в стеке вызовов, чтобы помочь мне понять, 'как я добрался там')

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

Просто мои 2 цента.

60
ответ дан VonC 23 November 2019 в 00:46
поделиться

Я склонен следовать совету Dave Thomas и Andy Hunt в их книге Прагматическое Поблочное тестирование :

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

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

146
ответ дан Nate 23 November 2019 в 00:46
поделиться

Какова цель протестировать?

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

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

Рассмотрите: у Вас есть открытый метод A, который называет закрытый метод B. A и B, оба используют метод C. C изменяется (возможно, Вами, возможно, поставщиком), заставляя начинать проваливать его тесты. Не было бы полезно иметь тесты для B также, даже при том, что это является частным, так, чтобы Вы знали, находится ли проблема в употреблении A C, использовании B C или обоих?

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

282
ответ дан Dave Sherohman 23 November 2019 в 00:46
поделиться

Если вы разрабатываете управляемую тестами (TDD), вы протестируете свои частные методы.

12
ответ дан 23 November 2019 в 00:46
поделиться
Другие вопросы по тегам:

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