Как мне выполнить модульное тестирование наследующих объектов? - PullRequest
5 голосов
/ 19 сентября 2008

Когда вы используете композицию, вы можете издеваться над другими объектами от которого зависит ваш тестовый класс, но когда вы используете наследство, вы не можете издеваться над базовым классом. (Или можете?)

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

Итак, как вы тестируете наследование? Или ты просто испортишь это как непроверенный и использовать вместо этого состав?

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

Ответы [ 5 ]

5 голосов
/ 22 сентября 2008

Используйте набор модульных тестов, который отражает иерархию классов. Если у вас есть базовый класс Base и производный класс Derived, то есть тестовые классы BaseTests и производные от этого DerivedTests. BaseTests отвечает за тестирование всего, что определено в Base. DerivedTests наследует эти тесты и также отвечает за тестирование всего в Derived.

Если вы хотите протестировать защищенные виртуальные методы в Base (т. Е. Интерфейс между Base и его дочерними классами), может также иметь смысл создать производный класс только для тестирования, который тестирует этот интерфейс.

4 голосов
/ 19 сентября 2008

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

3 голосов
/ 19 сентября 2008

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

Так что вам не нужно проверять наследование. Предположительно, вы используете поведение базового класса, поэтому просто протестируйте производный класс, как вы это обычно делаете, - вызывая методы как базового, так и производного класса в соответствии с тестом. Это гарантирует, что все предполагаемое поведение производного класса проверено.

По сути, (в большинстве случаев) вы тестируете производный класс, как если бы базовый класс был невидимым.

1 голос
/ 19 сентября 2008

Почему вы должны издеваться над базовым классом?

Как вы можете создавать производные классы из несуществующего родительского класса?

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

Я думаю, что вы не рассказали всю историю.

Кроме того, языковые функции предположительно работают (если вы не работаете с бета-версиями или около того), поэтому вам не нужно проверять, существует ли метод в производном классе.

0 голосов
/ 19 сентября 2008

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

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