为什么我要用pytest获取pytest AssertionError?

时间:2018-04-06 09:16:24

标签: python-3.x pytest

您是否可以帮助我理解为什么我在AssertionError中通过以下简单测试获得pytest

这是测试函数conventer.py

from decimal import Decimal


TWO = Decimal(10) ** -2

def us_to_dec(odds=100):
    if odds >= 0:
        return Decimal((odds / 100) + 1).quantize(TWO)
    else:
        return Decimal((100 / odds) + 1).quantize(TWO)

在conventer py上的print语句返回预期结果

print(us_to_dec(odds=205))
3.05

这是测试返回断言错误test_conventer.py

from surebet import converter


def test_us_to_dec():
    assert converter.us_to_dec(odds=205) == 3.05

测试失败并显示以下输出

E       AssertionError: assert Decimal('3.05') == 3.05
E        +  where Decimal('3.05') = <function us_to_dec at 0x106c99598>(odds=205)
E        +    where <function us_to_dec at 0x106c99598> = converter.us_to_dec
tests/test_converter.py:16: AssertionError

我不知道为什么我会收到AssertionError

编辑:

如果其他人遇到同样的情况,我最终会做以下事情:

from pytest import approx

from decimal import Decimal

from surebet import converter

def test_us_to_dec():
    assert converter.us_to_dec(odds=205) == approx(Decimal(3.05))

简单地比较converter.us_to_dec(odds=205) == approx(3.05)会导致TypeError

1 个答案:

答案 0 :(得分:3)

Decimal((205 / 100) + 1).quantize(Decimal(10) ** -2) == Decimal('3.05')
# --> True

Decimal((205 / 100) + 1).quantize(Decimal(10) ** -2) == 3.05
# --> False

由于浮点算术的限制,即使它们具有相同的repr,也不能保证十进制值等于float值。在这种情况下,3.05无法用二进制表示,因此当比较两个值时,3.05将转换为

Decimal(3.05) == Decimal('3.04999999999999982236431605997495353221893310546875')

在进行比较之前。