Сброс пользовательских классов для модульного теста

#python #python-unittest

#python #python-unittest

Вопрос:

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

Однако, похоже, что последующие тесты повторно используют одни и те же объекты, даже когда я использую команды tearDown или del .

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

 class MyClass:

    numbers = []

    def __init__(self):
        pass

    def __del__(self):
        del self.numbers

    def addNumber(self,newnumber):
        self.numbers  = [newnumber]

    def getNumbers(self):
        return self.numbers
 
 
import unittest
from myclass import MyClass

class TestNumbers(unittest.TestCase):

    def test_oneNumbers(self):
        mc = MyClass()
        mc.addNumber(5)
        self.assertListEqual(mc.getNumbers(), [5])
        del mc

    def test_twoNumbers(self):
        mc = MyClass()
        mc.addNumber(5)
        mc.addNumber(6)
        self.assertListEqual(mc.getNumbers(), [5,6])
        del mc

if __name__ == '__main__':
    unittest.main()
 

Python myunit.py выходной сигнал

 .F
======================================================================
FAIL: test_twoNumbers (__main__.TestNumbers)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:REDACTEDunitexamplemyunit.py", line 17, in test_twoNumbers
    self.assertListEqual(mc.getNumbers(), [5,6])
AssertionError: Lists differ: [5, 5, 6] != [5, 6]

First differing element 1:
5
6

First list contains 1 additional elements.
First extra element 2:
6

- [5, 5, 6]
?     ---

  [5, 6]

----------------------------------------------------------------------
Ran 2 tests in 0.001s

FAILED (failures=1)
 

разве каждый экземпляр MyClass не должен быть независимым?

Комментарии:

1. Итак, вы хотите, чтобы они были независимыми или нет?

2. Вы используете переменную класса, а не переменную экземпляра — это то, что вы хотите? В вашем __del__ , вы, вероятно, хотите очистить список, например self.numbers.clear() .

Ответ №1:

@MrBean-Bremen был прав, я переместил переменную в класс init, чтобы сделать ее переменной экземпляра. Каждый экземпляр теперь сохраняет свою собственную копию.

Я читал https://pencilprogrammer.com/python-tutorials/class-and-instance-variables / чтобы также помочь прояснить разницу.

Хотя я не уверен, что это необходимо, но я также очищаю словарь в своем del

Комментарии:

1. В python del почти всегда нет необходимости из-за подсчета ссылок. У ваших методов есть mc = MyClass(); del mc , но mc они все равно умрут, потому что методы являются областью действия.