自从有一天我在运行 pytests 时遇到了一个奇怪的错误,它们都失败了
E assert False is False
AssertionError
E assert True is True
AssertionError
但根据我的理解以及在应该给出正确输出的python终端中检查它时:
Python 3.6.9 (default, Oct 8 2020, 12:12:24)
>>> False is False
True
pytest 运行前的输出
platform linux -- Python 3.6.8, pytest-6.2.2, py-1.10.0, pluggy-0.13.1
plugins: cov-2.11.1, instafail-0.4.2, timeout-1.4.2
有没有人知道是什么导致了这种行为,因为对我来说这根本没有意义?
我的问题不是关于测试本身,而是关于它是如何发生的,pytest 引发了一个明确的错误,告诉我 False is False is not True 但 False == False 没有问题?
这实际上重现了问题:
from typing import Tuple
import numpy as np
import pytest
class MyObject():
def function_to_text(self, input: list) -> Tuple[bool, float]:
val = np.array(0) > 10
return val, 1.0
@pytest.fixture(scope='session')
def my_object():
my_obj = MyObject()
yield my_obj
def test_function_rejects_input(my_object):
assert my_object.function_to_text([])[0] is False
通过现在找到一种方法来重现这个问题,我现在也知道问题是什么,请参阅解决方案的答案
答案 0 :(得分:1)
虽然 Pytest 说 False 是 False,但第一个不是真正的 False 它是一个解析为 false 的 numpy 对象(
如果将 numpy.bool 与“标准”bool 进行比较,则会解析为 False,因为它们是不同的对象 - 不同的内存位置
相反,== 将两个操作数 (https://www.geeksforgeeks.org/difference-operator-python/) 的值与两者的 is False 进行比较,因此解析为 True。
在这种情况下令人困惑的是,pytest 的输出并没有真正给你暗示那个方向,因为它不显示两者的类型,只显示两者的值,这确实是 False