pytest: утверждать почти равным
как сделать assert almost equal
С py.тест для поплавков не прибегая к чему-то вроде:
assert x - 0.00001 <= y <= x + 0.00001
более конкретно будет полезно знать аккуратное решение для быстрого сравнения пар поплавков, не распаковывая их:
assert (1.32, 2.4) == i_return_tuple_of_two_floats()
6 ответов:
Я заметил, что этот вопрос специально задан о py.тест. Пи.тест 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
документация здесь:https://docs.pytest.org/en/latest/reference.html#pytest-approx
вам нужно будет указать, что для вас" почти":
assert abs(x-y) < 0.0001
для применения к кортежам (или любой последовательности):
def almost_equal(x,y,threshold=0.0001): return abs(x-y) < threshold assert all(map(almost_equal, zip((1.32, 2.4), i_return_tuple_of_two_floats())
Если у вас есть доступ к NumPy он имеет большие функции для сравнения с плавающей запятой, которые уже делают попарное сравнение:http://docs.scipy.org/doc/numpy-dev/reference/routines.testing.html.
затем вы можете сделать что-то вроде:
numpy.testing.assert_allclose(i_return_tuple_of_two_floats(), (1.32, 2.4))
что-то вроде
assert round(x-y, 5) == 0
что это unittest тут
вторая часть
assert all(round(x-y, 5) == 0 for x,y in zip((1.32, 2.4), i_return_tuple_of_two_floats()))
вероятно, лучше обернуть это в функцию
def tuples_of_floats_are_almost_equal(X, Y): return all(round(x-y, 5) == 0 for x,y in zip(X, Y)) assert tuples_of_floats_are_almost_equal((1.32, 2.4), i_return_tuple_of_two_floats())
эти ответы были вокруг в течение длительного времени, но я думаю, что самый простой и также Самый читаемый способ-использовать unittest для этого много хороших утверждений без использования его для испытаний конструкций.
получить утверждения, игнорировать остальные unittest.Пример
(исходя из ответ)
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