Cómo hacer assert almost equal
con py.test para flotadores sin recurrir a algo como:
assert x - 0.00001 <= y <= x + 0.00001
Más específicamente, será útil conocer una solución ordenada para comparar rápidamente pares de flotadores, sin desempaquetarlos:
assert (1.32, 2.4) == i_return_tuple_of_two_floats()
python
unit-testing
pytest
Vladimir Keleshev
fuente
fuente
Respuestas:
Me di cuenta de que esta pregunta era específicamente sobre py.test. py.test 3.0 incluye una
approx()
función (bueno, realmente de clase) que es muy útil para este propósito.La documentación está aquí: https://docs.pytest.org/en/latest/reference.html#pytest-approx
fuente
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]])
conduce a aTypeError
. Si se encuentra que Numpy'snp.testing.assert_allclose([[0.1 + 0.2], [0.2 + 0.4]], [[0.3], [0.6]])
(ver la respuesta a continuación) funcionó para este caso.Tendrá que especificar qué es "casi" para usted:
para aplicar a las tuplas (o cualquier secuencia):
fuente
x - d <= y <= x+d
, parece que eso es lo que OP también quiso decir. Si no desea especificar explícitamente el umbral para 'casi', consulte la respuesta de @ jiffyclub.pytest.approx
. Escribir su propia función aproximada es una mala idea. (El de esta respuesta ni siquiera es tan bueno como el incluido.)Si tiene acceso a NumPy, tiene excelentes funciones para la comparación de coma flotante con las que ya se realiza la comparación por pares
numpy.testing
.Entonces puedes hacer algo como:
fuente
Algo como
Eso es lo que hace unittest
Para la segunda parte
Probablemente mejor envolver eso en una función
fuente
Estas respuestas han existido durante mucho tiempo, pero creo que la forma más fácil y fácil de leer es usar unittest porque son muchas afirmaciones agradables sin usarlo para la estructura de prueba.
Obtenga aserciones, ignore el resto de unittest.
(basado en esta respuesta )
Hacer algunas afirmaciones
Implemente la prueba de desempaque automático de las preguntas originales
Simplemente use * para desempaquetar su valor de retorno sin necesidad de introducir nuevos nombres.
fuente
Si desea algo que funcione no solo con flotadores, sino también con decimales, puede usar Python
math.isclose
:Documentos: https://docs.python.org/3/library/math.html#math.isclose
fuente
Yo usaría nose.tools. Funciona bien con py.test runner y tiene otras afirmaciones igualmente útiles: afirmar_dict_equal (), afirmar_lista_equal (), etc.
fuente