web-dev-qa-db-ja.com

pytest:ほぼ等しいと主張する

実行する方法 assert almost equalのようなものに頼らずにフロート用のpy.testを使用:

assert x - 0.00001 <= y <= x + 0.00001

より具体的には、フロートのペアをアンパックせずにすばやく比較するためのきちんとしたソリューションを知っていると便利です。

assert (1.32, 2.4) == i_return_Tuple_of_two_floats()
101

この質問がpy.testについて具体的に尋ねていることに気付きました。 py.test 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

176
dbn

「ほぼ」何を指定する必要があります。

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())
40
yurib

NumPyにアクセスできる場合は、 numpy.testing

その後、次のようなことができます:

numpy.testing.assert_allclose(i_return_Tuple_of_two_floats(), (1.32, 2.4))
29
jiffyclub

何かのようなもの

assert round(x-y, 5) == 0

それが nittest が行うことです

第二部

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())
11
John La Rooy

これらの答えは長い間存在していましたが、最も簡単で読みやすい方法は、テスト構造に使用せずに 多くのNice assertions に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
10
KobeJohn

Nose.toolsを使用します。それはpy.testランナーでうまく機能し、他の同様に有用なassert-assert_dict_equal()、assert_list_equal()などを持っています。

from nose.tools import assert_almost_equals
assert_almost_equals(x, y, places=7) #default is 7 
2
volodymyr

FloatだけでなくDecimalsなどで機能するものが必要な場合は、pythonのmath.isclose

    # - rel_tol=0.01` is 1% difference tolerance.
    assert math.isclose(actual_value, expected_value, rel_tol=0.01)

ドキュメント- https://docs.python.org/3/library/math.html#math.isclose

2
validname