Pytest 失败并出现 AssertionError False is False

Tan*_*yer 3 python unit-testing pytest python-3.x

自从有一天我在运行我的 pytests 时遇到了一个奇怪的错误,它们失败了

E    assert False is False
AssertionError
Run Code Online (Sandbox Code Playgroud)
E    assert True is True
AssertionError
Run Code Online (Sandbox Code Playgroud)

但根据我的理解,当在 python 终端中检查它时,应该给出正确的输出:

E    assert False is False
AssertionError
Run Code Online (Sandbox Code Playgroud)

运行 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
Run Code Online (Sandbox Code Playgroud)

有谁知道是什么导致了这种行为,因为对我来说这根本没有意义?

重要信息

我的问题不是关于测试本身,而是关于它是如何发生的,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

Run Code Online (Sandbox Code Playgroud)

通过现在找到一种重现此问题的方法,我现在也知道问题是什么,请参阅解决方案的答案

Tan*_*yer 7

尽管 Pytest 说 False 是 False,但第一个实际上并不是 False,它是一个解析为 false 的 numpy 对象(<class 'numpy.bool_'>)。

如果将 numpy.bool 与“标准”bool 进行比较,则会解析为 False,因为它们是不同的对象 - 不同的内存位置

相反, == 将两个操作符的值 ( https://www.geeksforgeeks.org/difference-operator-python/ ) 与两个操作符的值进行比较,结果都是 False,因此解析为 True。

在这种情况下,令人困惑的是 pytest 输出并没有真正给你这个方向的提示,因为它不显示两者的类型,而只显示两者的值,这确实是 False