从单元测试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()
属性错误:"str"对象没有属性"getroot"

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

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

模式示例(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

最新更新