Тестовые утверждения для кортежей с плаваниями

У меня есть функция, которая возвращает кортеж, который, среди других, содержит значение плавающее. Обычно я использую 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, но Вы получаете мое значение.

6
задан mskfisher 14 May 2012 в 14:48
поделиться

3 ответа

Хорошо, как насчет добавления в вашу функцию пары 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]:

8
ответ дан 8 December 2019 в 18:32
поделиться

Раньше я написал настраиваемую функцию, которая устанавливает достоверность для сложного типа данных, а затем использовал assert (IsFooValid (foo)) . Функция проверки действительности может просто возвращать истину / ложь, но обычно для нее лучше вызвать AssertionError с соответствующим сообщением.

2
ответ дан 8 December 2019 в 18:32
поделиться

Я, вероятно, определю рекурсивную функцию.

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] равны.)

3
ответ дан 8 December 2019 в 18:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: