Если вы делаете TDD, вы должны написать тест для геттера и сеттера.тоже.Не пишите ни одной строки кода без теста для него - даже если ваш код очень прост.
Это своего рода религиозная война, чтобы использовать тандем getter и setter для вашего теста или изолировать каждыйдоступ к защищенным членам класса с использованием возможностей вашего модульного теста.Как тестировщик «черного ящика» я предпочитаю привязывать свой код модульного теста к общедоступному API, а не привязывать его к конкретным деталям реализации.Я ожидаю перемен.Я хочу призвать разработчиков провести рефакторинг существующего кода.И внутренние классы не должны влиять на «внешний код» (модульные тесты в этом случае).Я не хочу нарушать юнит-тесты, когда меняются внутренние компоненты, я хочу, чтобы они ломались, когда меняются публичные API или когда меняется поведение.Хорошо, хорошо, в случае неудачного модульного теста не указывайте на единственный источник проблемы.Я должен посмотреть в получателе и установщике, чтобы выяснить, что вызвало проблему.В большинстве случаев ваш метод получения очень прост (менее 5 строк кода: например, возврат и необязательная проверка нуля с исключением).Так что проверка этого сначала не имеет большого значения и не занимает много времени.А проверка правильности пути установщика в большинстве случаев лишь немного сложнее (даже если у вас есть некоторые проверочные проверки).
Попробуйте изолировать ваши тестовые случаи - напишите тест для SUT (Тема подtest), который проверяет свою корректность без использования других методов (кроме моего примера выше).Чем больше вы изолируете тест, тем больше тестов выявляет проблему.
В зависимости от вашей стратегии тестирования вам может потребоваться пройти только по счастливому пути (прагматичный программист).Или печальные пути тоже.Я предпочитаю охватывать все пути исполнения.Когда я думаю, что обнаружил все пути выполнения, я проверяю покрытие кода, чтобы идентифицировать мертвый код (не чтобы определить, есть ли обнаруженные пути выполнения - 100% покрытие кода является ошибочным индикатором).
Это лучший метод для черного ящикатестировщикам использовать phpunit в строгом режиме и использовать @covers для скрытия сопутствующего покрытия.
Когда вы пишете модульный тест, ваш тест для класса A должен выполняться независимо от класса B. Поэтому ваши модульные тесты для класса A не должныметод call / cover класса B.
Если вы хотите идентифицировать устаревшие методы получения / установки и другие «мертвые» методы (которые не используются рабочим кодом), используйте для этого статический анализ кода.Интересующая вас метрика называется «Афферентная связь на уровне метода (MethodCa)».К сожалению, эта метрика (ca) недоступна на уровне метода в PHP Depend (см .: http://pdepend.org/documentation/software-metrics/index.html и http://pdepend.org/documentation/software-metrics/afferent-coupling.html). Если вам действительно это нужно, не стесняйтесь добавлять ее в PHP Depend.Исключить вызовы из того же класса было бы полезно для получения результата без «побочных» вызовов. Если вы идентифицируете «мертвый метод», попытайтесь выяснить, предполагается ли его использовать в ближайшем будущем (аналог другого метода, который имеетаннотацию @depricated) иначе удалите ее. Если она используется только в том же классе, сделайте ее приватной / защищенной. Не применяйте это правило к библиотечному коду.
План B: Если у вас есть приемочные тесты (интеграционный тест, регрессионный тест и т. д.) вы можете запустить этот тест без одновременного запуска модульных тестов и без строгого режима phpunits. Это может привести к очень похожему результату покрытия кода, как если бы вы анализировали свой рабочий код. Но в большинстве случаевслучаи, когда ваши не юнит-тесты не так сильны, как ваш производственный код. Это зависит от вашей дисциплины, если этот план B "равнозначный »производственному коду для получения значимого результата.
Дополнительная информация: - Книга: Прагматичный программист - Книга: Чистый код