Python 如何使用pytest测试简单堆栈类

Python 如何使用pytest测试简单堆栈类,python,pytest,Python,Pytest,我想写一个简单的堆栈类来学习TDD。但问题是它无法通过使用正确代码的测试 代码如下: class Stack: def __init__(self): self.stack = [] def push(self,new_item): self.stack.append(new_item) def pop(self): return int(self.stack.pop(0)) 下面是测试类: import pytest

我想写一个简单的堆栈类来学习TDD。但问题是它无法通过使用正确代码的测试

代码如下:

class Stack:
    def __init__(self):
        self.stack = []

    def push(self,new_item):
        self.stack.append(new_item)

    def pop(self):
        return int(self.stack.pop(0))
下面是测试类:

import pytest
from Stack import Stack

def test_it_can_push():
    stack = Stack()
    stack.push(2)
    assert stack.stack is [2]
下面是错误:

    def test_it_can_push():
        stack = Stack()
        stack.push(2)
>       assert stack.stack is [2]
E       assert [2] is [2]
E        +  where [2] = <Stack.Stack instance at 0x7f2273491560>.stack

test_stack.py:7: AssertionError
def test_it_can_push():
stack=stack()
堆栈推送(2)
>assert stack.stack为[2]
E断言[2]是[2]
E+式中[2]=.stack
test_stack.py:7:AssertionError

有人能告诉我如何解决这个问题吗?

您正在使用
is
进行身份检查(
id
--CPython中的内存位置),这将永远不会相等,因为操作数是两个不同的列表(它们是可变对象),尽管它们具有相同的元素,并且您可以使用
id
进行检查

进行公平测试:

assert stack.stack == [2]

使用
assert stack.stack==[2]
作为旁注,您正在导入
pytest
,但未使用它。使用
is
,两个列表操作数可以相等,例如:
a=[1,2,3];b=a;断言b是一个
@complexabot,但它们是相同的列表,即
a
b
两个名称都指向相同的列表对象。使用
id
检查。它们是相同的列表,正确。但是你说“…如果操作数是列表,那么它永远不会相等”,这不是真的,或者至少措辞令人困惑。我在上一篇评论中给出的示例证明了该语句是错误的:两个操作数都是列表,但
is
返回
true
@implegatabo这是不公平的。重新措辞。