Jak zrobić assert almost equal
z py.test dla pływaków bez uciekania się do czegoś takiego:
assert x - 0.00001 <= y <= x + 0.00001
Dokładniej rzecz biorąc, przydatne będzie poznanie zgrabnego rozwiązania do szybkiego porównywania par pływaków bez ich rozpakowywania:
assert (1.32, 2.4) == i_return_tuple_of_two_floats()
python
unit-testing
pytest
Vladimir Keleshev
źródło
źródło
Odpowiedzi:
Zauważyłem, że to pytanie dotyczyło konkretnie py.test. py.test 3.0 zawiera
approx()
funkcję (cóż, klasę), która jest bardzo przydatna do tego celu.Dokumentacja jest tutaj: https://docs.pytest.org/en/latest/reference.html#pytest-approx
źródło
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]])
prowadzi doTypeError
. Jeśli okaże się, że Numpynp.testing.assert_allclose([[0.1 + 0.2], [0.2 + 0.4]], [[0.3], [0.6]])
(patrz odpowiedź poniżej) zadziałało w tym przypadku.Będziesz musiał określić, co jest dla Ciebie „prawie”:
zastosowanie do krotek (lub dowolnej sekwencji):
źródło
x - d <= y <= x+d
, wydaje się, że właśnie to miał na myśli OP. Jeśli nie chcesz jawnie określać progu dla „prawie”, zobacz odpowiedź @ jiffyclub.pytest.approx
. Pisanie własnej przybliżonej funkcji to zły pomysł. (Ten w tej odpowiedzi nie jest nawet tak dobry, jak ten dołączony.)Jeśli masz dostęp do NumPy, ma on świetne funkcje do porównywania zmiennoprzecinkowego, które już wykonują porównania parami
numpy.testing
.Następnie możesz zrobić coś takiego:
źródło
Coś jak
To właśnie robi Unittest
W drugiej części
Prawdopodobnie lepiej zawrzeć to w funkcji
źródło
Te odpowiedzi istnieją od dawna, ale myślę, że najłatwiejszym i najbardziej czytelnym sposobem jest użycie unittest, ponieważ zawiera wiele fajnych twierdzeń bez użycia go w strukturze testowej.
Uzyskaj potwierdzenia, zignoruj resztę unittest.TestCase
(na podstawie tej odpowiedzi )
Zrób kilka twierdzeń
Wykonaj test automatycznego rozpakowywania oryginalnych pytań
Wystarczy użyć *, aby rozpakować zwracaną wartość bez konieczności wprowadzania nowych nazw.
źródło
Jeśli chcesz czegoś, co działa nie tylko z liczbami zmiennoprzecinkowymi, ale na przykład dziesiętnymi, możesz użyć Pythona
math.isclose
:Dokumenty - https://docs.python.org/3/library/math.html#math.isclose
źródło
Używałbym nosa. Narzędzi. Dobrze współpracuje z py.test runner i ma inne, równie przydatne funkcje - assert_dict_equal (), assert_list_equal () itp.
źródło