#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
они все равно умрут, потому что методы являются областью действия.