在python中使用XMLUnit,或其他替代方案

2024-06-01 08:22:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python非常陌生,但是我花了很多年的时间使用XMLUnit来比较单元测试中的XML文件

我想用python做一些同样简单的事情,但XMLUnit似乎没有移植到python

有一种叫做XMLDiff的东西,但它相当复杂,使用我的简单相同文件装备,报告了数百个空格差异

理想情况下会有一个XmlUnit端口?或者类似的东西……最糟糕的情况是,我用java编写了一个应用程序,它接收两个文件,然后用它们来比较这些文件,并将答案保存在一个文本文件中……糟糕透了

人们如何进行简单的XML单元测试


Tags: 文件报告时间情况xml差异单元测试事情
1条回答
网友
1楼 · 发布于 2024-06-01 08:22:00

根据您希望平等性测试的粒度,这相当简单:

from pathlib import Path
from xml.etree.ElementTree import Element, parse
from io import StringIO


test1 = r"""<?xml version="1.0"?>
<lol>stuff
    <kek>lolkek</kek>keklol
</lol>
"""

test2 = r"""<?xml version="1.0"?>
<lol>different
    <kek>lolkek</kek>keklol
</lol>
"""


def compare_xml_files(file1: Path, file2: Path) -> bool:
    if not file1.is_file() or not file2.is_file():
        raise FileNotFoundError()
    with file1.open("r") as f1:
        with file2.open("r") as f2:
            return compare_xml_elements(parse(f1.read()).getroot(), parse(f2.read()).getroot())


def compare_xml_strings(xml1: str, xml2: str) -> bool:
    return compare_xml_elements(parse(StringIO(xml1)).getroot(), parse(StringIO(xml2)).getroot())


def compare_xml_elements(elem1: Element, elem2: Element) -> bool:
    if elem1.tag != elem2.tag:
        return False
    if elem1.text != elem2.text:
        return False
    if elem1.tail != elem2.tail:
        return False
    attr1 = elem1.attrib
    attr2 = elem2.attrib
    if len(attr1) != len(attr2):
        return False

    attr1keys = sorted(attr1.keys())
    attr2keys = sorted(attr2.keys())

    for attr1, attr2 in zip(attr1keys, attr2keys):
        if attr1 != attr2:
            return False

    # This will fail for Equal Children in different orders
    for child1, child2 in zip(iter(elem1), iter(elem2)):
        if not compare_xml_elements(child1, child2):
            return False

    return True


if __name__ == "__main__":
    print(compare_xml_strings(test1, test1))
    print(compare_xml_strings(test2, test2))
    print(compare_xml_strings(test1, test2))

这更像是一个概念证明,如果您想要更精确的错误报告,请将所有return False替换为raise <your Error here>。使用Python3.8进行测试

相关问题 更多 >