Pytest 因 AssertionError 失败而失败

时间:2021-02-11 08:58:09

标签: python python-3.x unit-testing pytest

自从有一天我在运行 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

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

1 个答案:

答案 0 :(得分:1)

虽然 Pytest 说 False 是 False,但第一个不是真正的 False 它是一个解析为 false 的 numpy 对象()。

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

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

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