So geht's assert almost equal
mit py.test für Floats, ohne auf Folgendes zurückzugreifen:
assert x - 0.00001 <= y <= x + 0.00001
Insbesondere ist es nützlich, eine übersichtliche Lösung zu kennen, um Schwimmerpaare schnell zu vergleichen, ohne sie auszupacken:
assert (1.32, 2.4) == i_return_tuple_of_two_floats()
python
unit-testing
pytest
Vladimir Keleshev
quelle
quelle
Antworten:
Mir ist aufgefallen, dass diese Frage speziell zu py.test gestellt wurde. py.test 3.0 enthält eine
approx()
Funktion ( na ja , wirklich Klasse), die für diesen Zweck sehr nützlich ist.Die Dokumentation finden Sie hier: https://docs.pytest.org/en/latest/reference.html#pytest-approx
quelle
assert [0.1 + 0.2, 0.2 + 0.4] == pytest.approx([0.3, 0.6])
assert {'a': 0.1+0.2} == pytest.approx({'a': 0.3})
assert [[0.1 + 0.2], [0.2 + 0.4]] == pytest.approx([[0.3], [0.6]])
führt beispielsweise zu aTypeError
. Wenn festgestellt wird, dass Numpy'snp.testing.assert_allclose([[0.1 + 0.2], [0.2 + 0.4]], [[0.3], [0.6]])
(siehe Antwort unten) für diesen Fall funktioniert hat.Sie müssen angeben, was für Sie "fast" ist:
auf Tupel (oder eine beliebige Sequenz) anwenden:
quelle
x - d <= y <= x+d
, der so aussieht, als ob OP dies auch bedeutete. Wenn Sie den Schwellenwert für "fast" nicht explizit angeben möchten, lesen Sie die Antwort von @ jiffyclub.pytest.approx
. Es ist eine schlechte Idee, eine eigene ungefähre Funktion zu schreiben. (Die in dieser Antwort ist nicht einmal so gut wie die enthaltene.)Wenn Sie Zugriff auf NumPy haben, bietet es großartige Funktionen für den Gleitkomma-Vergleich, mit denen bereits ein paarweiser Vergleich durchgeführt wird
numpy.testing
.Dann können Sie so etwas tun wie:
quelle
Etwas wie
Das ist es, was Unittest tut
Für den zweiten Teil
Wahrscheinlich ist es besser, das in eine Funktion zu packen
quelle
Diese Antworten gibt es schon lange, aber ich denke, der einfachste und auch am besten lesbare Weg ist, unittest für seine vielen netten Behauptungen zu verwenden, ohne es für die Teststruktur zu verwenden.
Holen Sie sich Behauptungen, ignorieren Sie den Rest von unittest.TestCase
(basierend auf dieser Antwort )
Machen Sie einige Aussagen
Implementieren Sie den Test zum automatischen Auspacken der Originalfragen
Verwenden Sie einfach *, um Ihren Rückgabewert zu entpacken, ohne neue Namen eingeben zu müssen.
quelle
Wenn Sie etwas möchten, das nicht nur mit Floats, sondern auch mit Dezimalstellen funktioniert, können Sie Pythons verwenden
math.isclose
:Dokumente - https://docs.python.org/3/library/math.html#math.isclose
quelle
Ich würde nas.tools verwenden. Es spielt sich gut mit py.test Runner und hat andere ebenso nützliche Asserts - assert_dict_equal (), assert_list_equal () usw.
quelle