#python #unit-testing #pytest
#python #модульное тестирование #pytest
Вопрос:
Я использую pytest для создания утверждений для значения, созданного функцией внутри класса, которая записывает и возвращает атрибут класса. Значение атрибута сохраняется в двух модульных тестах. Как я могу получить новый экземпляр класса во втором модульном тестировании?
from dataclasses import asdict
from package.someclass import SomeClass
def test_method_a_one():
class_instance = SomeClass()
result = asdict(class_instance.method_a("a")[0])
assert result["string"] == "a"
def test_method_a_two():
class_instance = SomeClass()
result = asdict(class_instance.method_a("b")[0])
assert result["string"] == "b"
При запуске pytest tests
tests/test_method_a.py:15: AssertionError
=================================================================================================== short test summary info ===================================================================================================
FAILED tests/test_method_a.py::test_method_a_two - AssertionError: assert 'a' == 'b'
полный код: https://github.com/michaelhochleitner/pytest_test
Комментарии:
1. Обычно вы бы использовали здесь области применения pytest, но дело в том, что вы используете
dataclass
который действует как одноэлементный.2. Могу ли я использовать области привязки pytest, если я использую обычные классы для Result и ResultContainer?
3. Если вы используете обычные классы, области видимости здесь даже не понадобятся, ваш тест должен работать должным образом
4. Я изменил классы данных на обычные классы и использую приспособление для внедрения тестируемого класса. Я все еще получаю тот же результат. См . github.com/michaelhochleitner/pytest_test/tree /. …
5. Это потому, что у вас есть атрибут class в
ResultContainer
, у вас должен быть атрибут instance здесь. См . dzone.com/articles /…
Ответ №1:
Как указал RobinFrcd, вам необходимо преобразовать атрибут ResultContainer.result_list
класса в атрибут экземпляра следующим образом:
from dataclasses import dataclass
@dataclass
class ResultContainer:
"""SomeClass.method_a() appends values to the list in this class."""
def __init__(self):
self.result_list = []
Таким образом, каждый экземпляр ResultContainer
имеет свой собственный экземпляр result_list
, тогда как раньше все экземпляры ResultContainer
имели одинаковый result_list
доступ. С этим изменением ваши тесты работают безупречно:
$ python -m pytest tests
========================== test session starts ===========================
platform darwin -- Python 3.6.5, pytest-6.1.0, py-1.9.0, pluggy-0.13.1
rootdir: /Users/oschlueter/github/pytest_test
collected 2 items
tests/test_method_a.py .. [100%]
=========================== 2 passed in 0.01s ============================