Python Unittest: убедитесь, что объекты не содержат данных из предыдущего запуска - PullRequest
0 голосов
/ 09 мая 2018

Я использую setUp для создания нового объекта из класса, который я создал.Насколько я понимаю, эта функция будет выполняться перед каждым тестом в тестовом примере, и это должно привести к созданию новых объектов для каждого теста.Кажется, что это не то, что происходит;по крайней мере, не в моих тестах.

Вот мой класс:

class Entity:
    def __init__(self, entities = []):
        self.entities = entities

    def add(self, entity: str):
        if entity not in self.entities:
            self.entities.append(entity)

А вот соответствующие тесты:

import unittest
from entity import Entity

class EntityTestCase(unittest.TestCase):
    def setUp(self):
        self.entity = Entity()
        print("Starting Entites = {}".format(self.entity.entities))

    def testA(self):
        self.entity.add("Foo")
        self.assertEqual(self.entity.entities, ["Foo"])

    def testB(self):
        self.entity.add("Bar")
        self.assertEqual(self.entity.entities, ["Bar"])

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

Я бы ожидал, что testAи testB начнется с новых Entity объектов.То есть я бы ожидал, что Entity.entities будет новым списком для каждого теста.

Я запускаю свои тесты с python -m unittest discover -v, что приводит к следующему выводу:

$ python -m unittest discover -v
testA (test_entity.EntityTestCase) ... Starting Entites = []
ok
testB (test_entity.EntityTestCase) ... Starting Entites = ['Foo']
FAIL

======================================================================
FAIL: testB (test_entity.EntityTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/julioguzman/Sites/Foobar/test_entity.py", line 15, in testB
    self.assertEqual(self.entity.entities, ["Bar"])
AssertionError: Lists differ: ['Foo', 'Bar'] != ['Bar']

First differing element 0:
'Foo'
'Bar'

First list contains 1 additional elements.
First extra element 1:
'Bar'

- ['Foo', 'Bar']
+ ['Bar']

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

FAILED (failures=1)

Как видите, testB начинается с данных из testA.Это не желаемое поведение, хотя оно может быть и предполагаемым.

Как мне обеспечить, чтобы мои объекты были "чистыми" для каждого теста?Почему это происходит?

1 Ответ

0 голосов
/ 09 мая 2018

У вас есть

class Entity:
    def __init__(self, entities = []):
        self.entities = entities

Где аргумент по умолчанию создается один раз, что приводит к этой общей проблеме

Просто измените __init__, чтобы использовать суррогатное значение, и назначьте новый список, если так:

class Entity:
    def __init__(self, entities=NotImplemented):
        if entities is NotImplemented:
            self.entities = []
        else:
            self.entities = entities

Кроме того, это одна из причин написания юнит-тестов: они также проверяют, был ли класс создан правильно с ожидаемым поведением. Это не было проблемой для вашего теста, когда setUp ясно показал, что он создал совершенно новый объект - ошибка заключается в реализации, где он сделал что-то неожиданное.

...