290 votes

pytest : assert almost equal

Comment faire assert almost equal avec py.test pour les flottants sans avoir recours à quelque chose comme :

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

Plus précisément, il sera utile de connaître une solution soignée pour comparer rapidement des paires de flotteurs, sans les déballer :

assert (1.32, 2.4) == i_return_tuple_of_two_floats()

4 votes

Py.test a maintenant une fonctionnalité qui fait cela.

2 votes

Voir cette réponse pour une description de cette fonctionnalité

13voto

gnibbler Points 103484

Quelque chose comme

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

C'est ce que unittest fait

Pour la deuxième partie

assert all(round(x-y, 5) == 0 for x,y in zip((1.32, 2.4), i_return_tuple_of_two_floats()))

Il est probablement préférable d'envelopper cela dans une fonction

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

5voto

J'utiliserais nose.tools. Il fonctionne bien avec py.test runner et possède d'autres asserts tout aussi utiles - assert_dict_equal(), assert_list_equal(), etc.

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

2 votes

De plus, pytest a une option pour cela, je ne considère pas que ce soit une bonne option que d'ajouter un département supplémentaire (dans ce cas, un cadre de test complet) uniquement pour cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X