Почему Pytest Переносит состояние между тестами?

#python #unit-testing #pytest

Вопрос:

Прилагаются мои тесты и файл, который я тестирую. Я составляю задание для студента; однако, похоже, я не могу исправить эту ошибку. Это как бы сводит меня с ума…

Самый последний тест — вот в чем проблема. Видите ли, несмотря на то, что я создаю новый объект, pytest, похоже, сохраняет состояние предыдущих тестов (значение узла .right-это узел со значением «тест», а не «Нет»). Я понятия не имею, что происходит.

tests.py

 #!/usr/bin/python -m pytest -v
import pytest

from month_one.week_three.solution_dictionary import *


def test_exists():
    my_dict = Dictionary()
    assert isinstance(my_dict.root, Word)
    assert my_dict.root.val == ""


def test_empty_no_insert():
    my_dict = Dictionary()
    assert my_dict.is_empty()


def test_not_empty_after_insert():
    my_dict = Dictionary()
    my_dict.insert("test")
    assert not my_dict.is_empty()


def test_insert_once():
    my_dict = Dictionary()
    my_dict.insert("test")
    assert isinstance(my_dict.root.right, Word)


def test_insert_returns_new_node():
    my_dict = Dictionary()
    node = my_dict.insert("test")
    assert isinstance(node, Word)
    assert node.val == "test"

def test_insert_twice_increasing_order():
    my_dict = Dictionary()
    print(my_dict.root.right)
    assert False
 

Dictionary.py

 #!/usr/bin/env python

class Word:
    def __init__(self, val: str, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

    def __repr__(self):
        return self.val



class Dictionary:
    root = Word("")

    def is_empty(self):
        return self.root.right is None

    def insert(self, val: str) -> None:
        print("here")
        new_node = Word(val)

        if self.root.right is None:
            self.root.right = new_node
        else:
            self.root.right.right = new_node

        return new_node
 

Вывод на консоль

 ======================================================================================================= test session starts =======================================================================================================
platform linux -- Python 3.9.5, pytest-6.2.3, py-1.10.0, pluggy-0.13.1 -- /usr/bin/python
cachedir: .pytest_cache
rootdir: /home/michael/Documents/Tutoring/student
plugins: dash-1.20.0
collected 6 items                                                                                                                                                                                                                 

month_one/week_three/test_tree.py::test_exists PASSED                                                                                                                                                                       [ 16%]
month_one/week_three/test_tree.py::test_empty_no_insert PASSED                                                                                                                                                              [ 33%]
month_one/week_three/test_tree.py::test_not_empty_after_insert PASSED                                                                                                                                                       [ 50%]
month_one/week_three/test_tree.py::test_insert_once PASSED                                                                                                                                                                  [ 66%]
month_one/week_three/test_tree.py::test_insert_returns_new_node PASSED                                                                                                                                                      [ 83%]
month_one/week_three/test_tree.py::test_insert_twice_increasing_order FAILED                                                                                                                                                [100%]

============================================================================================================ FAILURES =============================================================================================================
_______________________________________________________________________________________________ test_insert_twice_increasing_order ________________________________________________________________________________________________

    def test_insert_twice_increasing_order():
        my_dict = Dictionary()
        print(my_dict.root.right)
>       assert False
E       assert False

month_one/week_three/test_tree.py:39: AssertionError
------------------------------------------------------------------------------------------------------ Captured stdout call -------------------------------------------------------------------------------------------------------
test
===================================================================================================== short test summary info =====================================================================================================
FAILED month_one/week_three/test_tree.py::test_insert_twice_increasing_order - assert False
=================================================================================================== 1 failed, 5 passed in 0.07s ===================================================================================================
 

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

1. Dictionary.root является атрибутом класса, а не атрибутом экземпляра, который повторно инициализируется для каждого экземпляра Dictionary .

2. Я не знал, что эти переменные имеют разное время жизни! Спасибо.

Ответ №1:

@чепнер:

Dictionary.root-это атрибут класса, а не атрибут экземпляра, который повторно инициализируется для каждого экземпляра словаря.