Форматирование тестовых сбоев для юнит-тестов Python - PullRequest
1 голос
/ 05 марта 2019

Я запускаю несколько тестов юнитов для тестирования двоичного протокола:

Пример сообщений об ошибках выглядит следующим образом:

AssertionError: Items in the first set but not the second:
b'\x00\x02@=\x00'
Items in the second set but not the first:
b'\x00\x02@N\x00'

Это громоздко, так как мне нужно преобразовать символы asciiв гекс вручную, чтобы проверить, что происходит.

Было бы неплохо, если бы можно было заставить unittest отформатировать все bytes объекты в гекс, например

AssertionError: Items in the first set but not the second:
b'\x00\x02\x40\x3d\x00'
Items in the second set but not the first:
b'\x00\x02\x40\x4e\x00'

Любые советы поКак сделать это с помощью арендной платы за усилие?

Примечание: у меня есть не только это конкретное сравнение между двумя наборами, но также сравнения между списками и диктовками ... Отсюда мой запрос на решение с минимальными усилиями.

1 Ответ

0 голосов
/ 07 марта 2019

Хорошо, я сам копался в коде unittest.

Внутренне он использует repr(obj) для форматирования вывода тестовых сбоев.Если не считать переписывания всех процедур сравнения для списков, множеств, диктов и т. Д., Это не легко исправить.

Лучшее решение, которое я нашел, - это создание подкласса объекта bytes и перегрузка его метода __repr__ следующим образом:

class st_frame(bytes):
    def __repr__(self):
        return "b'{}'".format(
            ''.join(['\\x%02x' % c for c in self])
        )

Затем можно обернуть результаты этим объектом в тестовых случаях:

ret = func_to_test(data)      # lets assume this returns list of bytes objects
ret = [st_frame(value) for value in ret]
self.assertEqual(ret, target)
...