首页 > 解决方案 > 从单元测试 Python 解析 XML 文件

问题描述

我正在尝试使用解析我的 XML 的不同元素的某些方法编写一些单元测试。但是我在单元测试中解析“测试”xml 文件时遇到了一些问题。

我的问题与 XML/XSD 文件无关,而只是关于如何在我的单元测试中正确解析它们。

到目前为止,这是我的代码:

import unittest
from lxml import etree
from Directory.method_in_class import ClassName #changed the names for security

class TestXmlData(unittest.TestCase):
    def setUp(self):
        self.method_in_class = ClassName()
        XSDDoc = etree.parse("dir/testxsd.xsd")
        rootXSD = XSDDoc.getroot()

    def test_whatever(self):
        # Test whatever

if __name__ == '__main__':
    unittest.main()

即使我在实现方法中以相同的方式解析,我收到以下错误:

OSError:读取文件“dir/testxsd.xsd”时出错:加载外部实体“dir/testxsd.xsd”失败

我尝试了其他几种替代方法,例如从此答案加载文件,但是这样做会给我一个错误:

import unittest
from lxml import etree
import os

THIS_DIR = os.path.dirname(os.path.abspath(__file__))

class TestSpecData(unittest.TestCase):
    def setUp(self):
        my_data_path = os.path.join(THIS_DIR, os.pardir, 'dir/testxsd.xsd')
        rootXSD = my_data_path.getroot()

    def test_whatever(self):
        data = sum(1, 2)
        self.assertEqual(data, 3)

if __name__ == '__main__':
    unittest.main()

AttributeError:“str”对象没有属性“getroot”

我也试过这个答案,但我不熟悉 Django,所以遇到了一堆错误。

标签: pythonxmlxsdlxmlpython-unittest

解决方案


在您编辑后的第二个版本中,您调用getroot的是字符串而不是解析的 XML 树。不过,如果您使用绝对路径正确解析文件,这可以解决您的问题。

架构示例 (test.xsd)

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified">

    <xs:element name="config" type="xs:string" />

</xs:schema>

Python 代码 ( test.py)

import unittest
from lxml import etree
import os

THIS_DIR = os.path.dirname(os.path.abspath(__file__))

class TestSpecData(unittest.TestCase):
    def setUp(self):
        my_data_path = os.path.join(THIS_DIR, 'data/test.xsd')

        tree = etree.parse(my_data_path)
        root = tree.getroot()

    def test_whatever(self):
        data = sum([1, 2])
        self.assertEqual(data, 3)

if __name__ == '__main__':
    unittest.main()

输出

假设一个文件夹test包含test.py, 并且test.xsd位于名为 的子文件夹中data,并且在修复测试中的错误(添加列表括号)后,输出为

$ python test.py
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK

推荐阅读