Модульное тестирование: имеет ли смысл тестировать методы родительских объектов? - PullRequest
2 голосов
/ 20 апреля 2011

Допустим, я использую фреймворк с классом Animal.

class Animal(object):
    def speak(self):
        logging.info(self.sound)

Мне нужно создать подкласс этого объекта, чтобы использовать его, и он может выглядеть примерно так:

class Dog(Animal):
    def __init__(self):
        self.sound = 'Woof Woof'

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

dog = Dog()
assert dog.sound == 'Woof Woof'

Второй вариант - макетировать logging.info и проверить, был ли он вызван.У меня смешанные чувства к ним обоим.

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

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

Например, у меня может быть это представление шаблона:

class HomeView(TemplateView):
    template_name = 'home.html'

Должен ли я просто проверить, имеет ли значение template_name правильное значение, или использовать тестовый клиент для выполнения теста более высокого уровня для проверкиполный вид?

Ответы [ 3 ]

5 голосов
/ 20 апреля 2011

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

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

3 голосов
/ 20 апреля 2011

В вашем простом примере я бы, вероятно, протестировал родительский метод. Но в вашем случае с Django это будет означать тестирование Django. И это не твоя работа! ;-) Для меня это одна из больших проблем модульного тестирования: не тестируйте код других людей или библиотеки третьей части. Убедитесь, что ваша часть верна. Может показаться очевидным, но это не так просто в реальной жизни - по крайней мере, по моему опыту.

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

Тест, который вы показываете, абсолютно верен - вы повторяете строковый литерал 'Woof Woof' в своем тесте.

Вы могли бы провести аналогичный тест для Animal:

animal = Animal()
animal.sound = 'sound'
animal.speak()
# test that detects log contains 'sound'

У вас также может быть тест, который берет список животных, например, [Dog, Cat, ...] и обнаруживает, что экземпляр каждого из них произносит свой звук.

for animalClass in AnimalList:
    animal = animalClass()
    animal.speak()
    # test that detects log contains animal.sound
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...