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)
通过现在找到一种重现此问题的方法,我现在也知道问题是什么,请参阅解决方案的答案
尽管 Pytest 说 False 是 False,但第一个实际上并不是 False,它是一个解析为 false 的 numpy 对象(<class 'numpy.bool_'>)。
如果将 numpy.bool 与“标准”bool 进行比较,则会解析为 False,因为它们是不同的对象 - 不同的内存位置
相反, == 将两个操作符的值 ( https://www.geeksforgeeks.org/difference-operator-python/ ) 与两个操作符的值进行比较,结果都是 False,因此解析为 True。
在这种情况下,令人困惑的是 pytest 输出并没有真正给你这个方向的提示,因为它不显示两者的类型,而只显示两者的值,这确实是 False