pytest не сохраняет экземпляр класса в модульных тестах

#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 ============================