如何断言几乎等于pytest for floats,而不诉诸于类似的东西:
assert x - 0.00001 <= y <= x + 0.00001
更具体地说,它将有助于了解一个整洁的解决方案,快速比较浮点数对,而不拆封它们:
assert (1.32, 2.4) == i_return_tuple_of_two_floats()
如何断言几乎等于pytest for floats,而不诉诸于类似的东西:
assert x - 0.00001 <= y <= x + 0.00001
更具体地说,它将有助于了解一个整洁的解决方案,快速比较浮点数对,而不拆封它们:
assert (1.32, 2.4) == i_return_tuple_of_two_floats()
当前回答
如果你可以访问NumPy,它有很棒的浮点比较函数,已经与NumPy .testing进行了成对比较。
然后你可以这样做:
numpy.testing.assert_allclose(i_return_tuple_of_two_floats(), (1.32, 2.4))
其他回答
如果你可以访问NumPy,它有很棒的浮点比较函数,已经与NumPy .testing进行了成对比较。
然后你可以这样做:
numpy.testing.assert_allclose(i_return_tuple_of_two_floats(), (1.32, 2.4))
这些答案已经存在很长一段时间了,但我认为最简单也是最易读的方法是使用unittest,因为它有许多很好的断言,而不用它用于测试结构。
获取断言,忽略unittest的其余部分。TestCase
(根据这个答案)
import unittest
assertions = unittest.TestCase('__init__')
做出一些断言
x = 0.00000001
assertions.assertAlmostEqual(x, 0) # pass
assertions.assertEqual(x, 0) # fail
# AssertionError: 1e-08 != 0
实施原创题自动开箱测试
只需使用*来解包返回值,而不需要引入新名称。
i_return_tuple_of_two_floats = lambda: (1.32, 2.4)
assertions.assertAlmostEqual(*i_return_tuple_of_two_floats()) # fail
# AssertionError: 1.32 != 2.4 within 7 places
如果你想要一些不仅适用于浮点数还适用于小数的东西,你可以使用python的math.isclose():
# - rel_tol=0.01` is 1% difference tolerance.
assert math.isclose(actual_value, expected_value, rel_tol=0.01)
我注意到这个问题特别提到了pytest。Pytest 3.0包含了一个approx()函数(好吧,是真正的类),它对这个目的非常有用。
import pytest
assert 2.2 == pytest.approx(2.3)
# fails, default is ± 2.3e-06
assert 2.2 == pytest.approx(2.3, 0.1)
# passes
# also works the other way, in case you were worried:
assert pytest.approx(2.3, 0.1) == 2.2
# passes
可以直接使用round()
a, b = i_return_tuple_of_two_floats()
assert (1.32, 2.4) == round(a,2), round(b,1)