Como fazer assert almost equal
com py.test para carros alegóricos sem recorrer a algo como:
assert x - 0.00001 <= y <= x + 0.00001
Mais especificamente, será útil conhecer uma solução interessante para comparar rapidamente pares de flutuadores, sem desempacotá-los:
assert (1.32, 2.4) == i_return_tuple_of_two_floats()
python
unit-testing
pytest
Vladimir Keleshev
fonte
fonte
Respostas:
Percebi que essa pergunta foi feita especificamente sobre py.test. O py.test 3.0 inclui uma
approx()
função (bem, realmente classe) que é muito útil para esse propósito.A documentação está aqui: https://docs.pytest.org/en/latest/reference.html#pytest-approx
fonte
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]])
leva a aTypeError
. Se você descobriu que o Numpynp.testing.assert_allclose([[0.1 + 0.2], [0.2 + 0.4]], [[0.3], [0.6]])
(veja a resposta abaixo) funcionou nesse caso.Você precisará especificar o que é "quase" para você:
para aplicar às tuplas (ou a qualquer sequência):
fonte
x - d <= y <= x+d
, parece que é isso que OP também significava. Se você não deseja especificar explicitamente o limite para 'quase', consulte a resposta de @ jiffyclub.pytest.approx
. Escrever sua própria função aproximada é uma má idéia. (O de esta resposta não é ainda tão bom quanto o incluído.)Se você tiver acesso ao NumPy, ele possui ótimas funções para comparação de ponto flutuante que já fazem comparação pareada
numpy.testing
.Então você pode fazer algo como:
fonte
Algo como
Isso é o que o mais unido faz
Para a segunda parte
Provavelmente melhor envolver isso em uma função
fonte
Essas respostas já existem há muito tempo, mas acho que a maneira mais fácil e legível é usar o unittest, pois ele tem muitas afirmações legais, sem usá-lo para a estrutura de teste.
Obtenha asserções, ignore o resto da unittest.TestCase
(com base nesta resposta )
Faça algumas afirmações
Implementar o teste de descompactação automática das perguntas originais
Basta usar * para descompactar seu valor de retorno sem precisar introduzir novos nomes.
fonte
Se você quer algo que funcione não apenas com flutuadores, mas, por exemplo, decimais, você pode usar o python
math.isclose
:Documentos - https://docs.python.org/3/library/math.html#math.isclose
fonte
Eu usaria nose.tools. Ele funciona bem com o corredor py.test e tem outras afirmações igualmente úteis - assert_dict_equal (), assert_list_equal (), etc.
fonte