格式化python unittests的测试失败

时间:2019-03-05 12:13:35

标签: python python-3.x unit-testing string-formatting

我正在运行许多单元测试来测试二进制协议:

故障消息示例如下:

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 :(得分:0)

好吧,我自己研究了-lallegro-static的代码。

在内部,它使用unittest格式化测试失败的输出。缺少重写列表,集合,字典等的所有比较例程的方法。没有容易解决的方法。

我发现最好的解决方案是将repr(obj)对象子类化并重载其bytes方法,如下所示:

__repr__

然后可以在测试用例中使用该对象包装结果:

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