Как отладить код Python, который частично покрывается прохождением модульных тестов, но дает неправильные результаты при повторном использовании? - PullRequest
2 голосов
/ 08 июля 2010

У меня есть класс Python, и его методы частично покрываются юнит-тестами, подобными этим:

class MyClass:

    def __init__(self):

       self.instancevar1 = None # some methods change this value
       self.instancevar2 = None # some methods change this value
       ...

    def method1(self, input_data):

        ...
        <self.instancevar1 and self.instancevar2 are used here>

        <return True or False>

...

class TestMyClass(unittest.TestCase):

    def test_method1(self):

        mc = MyClass()
        input_data = 'foo'
        self.assertEqual(mc.method1(input_data), True)

Тесты проходят для простых случаев, подобных этому.

У меня также есть другие классыкоторые используют экземпляры MyClass следующим образом:

class MyOtherClass:

    def __init__(self):

        self.mc = MyClass()

Теперь, в некотором методе MyOtherClass, у меня есть такая ситуация:

class MyOtherClass:

    ...

    def some_method(self):

        ...
        result = self.mc.method1('foo') # result is expected to be True, but it is False

Я думаю, я понимаю причину, по которой это можетбывает.В тестовом примере я создаю экземпляр MyClass и вызываю тест.В MyOtherClass на self.mc ссылаются несколько раз, вызываются разные его методы, и они, вероятно, изменяют внутреннее состояние объекта (некоторые значения переменных экземпляра), создавая, таким образом, другое возвращаемое значение.

Что такоепредлагаемые рекомендации по устранению таких проблем?

Тот факт, что у меня есть несколько тестов для MyClass, хорош, но, похоже, здесь не очень помогает.Содержит ли этот пример некоторые недостатки дизайна, которые вызывают мои проблемы?

Ответы [ 2 ]

2 голосов
/ 08 июля 2010

Как сказал Руди , в MyClass.method1() есть либо ошибка, которая заставляет его возвращать False, если это не так, либо в других частях кода, которая помещает mc в состоянии, которого вы не ожидали.

Вы можете решить обе проблемы с помощью дополнительных модульных тестов:

  • Если в MyClass.method1() есть ошибка, когда mc находится в определенном состоянии, вы должны добавить дополнительные модульные тесты, чтобы убедиться, что mc.method1() возвращает правильное значение для каждого состояния, в котором находится mc.

  • Также добавьте модульные тесты для MyOtherClass и других соответствующих частей кода, чтобы гарантировать, что self.mc всегда находится в ожидаемом состоянии, независимо от того, какие операции вы выполняете с экземпляром MyClass .

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

1 голос
/ 08 июля 2010

Сначала вам нужно выяснить, находится ли объект MyClass в правильном состоянии, когда some_method вызывает метод дефекта. Если состояние правильное, в MyClass.method1 есть ошибка, если это не так, вам нужно искать неправильный переход состояния.

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

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