Comment faire assert almost equal
avec py.test pour les flotteurs sans recourir à 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()
python
unit-testing
pytest
Vladimir Keleshev
la source
la source
Réponses:
J'ai remarqué que cette question posait spécifiquement sur py.test. py.test 3.0 inclut une
approx()
fonction (enfin, vraiment classe) qui est très utile à cette fin.La documentation est ici: https://docs.pytest.org/en/latest/reference.html#pytest-approx
la source
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]])
conduit à un fichierTypeError
. Si trouvé que Numpynp.testing.assert_allclose([[0.1 + 0.2], [0.2 + 0.4]], [[0.3], [0.6]])
(voir la réponse ci-dessous) a fonctionné pour ce cas.Vous devrez spécifier ce qui est "presque" pour vous:
pour appliquer aux tuples (ou à toute séquence):
la source
x - d <= y <= x+d
, semble que c'est ce que OP voulait dire aussi. Si vous ne souhaitez pas spécifier explicitement le seuil pour «presque», consultez la réponse de @ jiffyclub.pytest.approx
. Ecrire votre propre fonction approximative est une mauvaise idée. (Celui de cette réponse n'est même pas aussi bon que celui inclus.)Si vous avez accès à NumPy, il dispose d'excellentes fonctions de comparaison en virgule flottante qui font déjà une comparaison par paires avec
numpy.testing
.Ensuite, vous pouvez faire quelque chose comme:
la source
Quelque chose comme
C'est ce que unittest - t
Pour la deuxième partie
Probablement mieux d'envelopper ça dans une fonction
la source
Ces réponses existent depuis longtemps, mais je pense que le moyen le plus simple et le plus lisible est d'utiliser unittest pour ses nombreuses affirmations. sans l'utiliser pour la structure de test.
Obtenez des assertions, ignorez le reste de unittest.
(basé sur cette réponse )
Faites quelques affirmations
Mettre en œuvre le test de décompression automatique des questions originales
Utilisez simplement * pour décompresser votre valeur de retour sans avoir à introduire de nouveaux noms.
la source
Si vous voulez quelque chose qui fonctionne non seulement avec les flottants mais par exemple Decimals, vous pouvez utiliser python
math.isclose
:Docs - https://docs.python.org/3/library/math.html#math.isclose
la source
J'utiliserais des outils nasaux. Il joue bien avec py.test runner et a d'autres assertions tout aussi utiles - assert_dict_equal (), assert_list_equal (), etc.
la source