#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-это атрибут класса, а не атрибут экземпляра, который повторно инициализируется для каждого экземпляра словаря.