У меня есть функция, которая возвращает кортеж, который, среди других, содержит значение плавающее. Обычно я использую assertAlmostEquals
для сравнения их но это не работает с кортежами. Кроме того, кортеж содержит другие типы данных также. В настоящее время я утверждаю каждый элемент кортежа индивидуально, но это добирается слишком много для списка таких кортежей. Там какой-либо хороший путь состоит в том, чтобы записать утверждения для таких случаев? Рассмотрите эту функцию:
def f(a):
return [(1.0/x, x * 2) for x in a]
Теперь я хочу записать тест для него:
def testF(self):
self.assertEqual(f(range(1,3)), [(1.0, 2), (0.5, 4)])
Это перестанет работать потому что результат 1.0/2
не точно 0.5
. Кто-либо может рекомендовать хорошему способу записать такое утверждение читаемым способом?
Править: На самом деле 1.0/2
точно 0.5
, но Вы получаете мое значение.
Хорошо, как насчет добавления в вашу функцию пары zip-архивов:
def testF(self):
for tuple1, tuple2 in zip(f(range(1,3)), [(1.0, 2), (0.5, 4)]):
for val1, val2 in zip(tuple1, tuple2):
if type(val2) is float:
self.assertAlmostEquals(val1, val2, 5)
else:
self.assertEquals(val1, val2)
Я предполагаю, что лучше использовать несколько утверждений в цикле, чтобы получить точные значения, в которых оно прерывается, вместо использования одного утверждения со всеми ().
пс. Если у вас есть другие числовые типы, для которых вы хотите использовать assertAlmostEquals, вы можете изменить если выше, например, if type (val2) in [float, decimal.Decimal]:
Раньше я написал настраиваемую функцию, которая устанавливает достоверность для сложного типа данных, а затем использовал assert (IsFooValid (foo))
. Функция проверки действительности может просто возвращать истину / ложь, но обычно для нее лучше вызвать AssertionError с соответствующим сообщением.
Я, вероятно, определю рекурсивную функцию.
from collections import Iterable;
def recursiveAssertAlmostEqual(testCase, first, second, *args, **kwargs):
if isinstance(first, Iterable) and isinstance(second, Iterable):
for a, b in zip(first, second):
recursiveAssertAlmostEqual(testCase, a, b, *args, **kwargs)
else:
testCase.assertAlmostEqual(first, second, *args, **kwargs)
(Обратите внимание, что он будет утверждать, что (1, 2)
и [1, 2]
равны.)