【问题标题】:Parse XML file from unit test Python从单元测试 Python 解析 XML 文件
【发布时间】:2020-03-06 15:54:51
【问题描述】:

我正在尝试使用解析 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”

我尝试了其他几种方法,例如从 this answer 加载文件,但这样做会出错:

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'

我也尝试过this answer,但我对 Django 不熟悉,所以遇到了一堆错误。

【问题讨论】:

  • “我尝试了其他几种替代方法,例如从这个答案加载文件,但这样做会给我一个错误:” - 请显示此替代方法的代码。我认为您最初错误的原因是单元测试可以从不同的目录执行,因此路径应该是绝对的。您解析此 XSD 文件的方式很好。
  • 我以为我是在单元测试中给出 xsd 的绝对路径?我要解析的文件来自“dir”目录。
  • 请显示使用 XSD 文件绝对路径的代码。谢谢。 (只有以/ 开头的路径才是绝对路径。)
  • 抱歉。我以为您的意思是当前目录的绝对路径。那不行吗?
  • 我只能重复我自己。请显示使用 XSD 文件的绝对路径的代码。 (您说您尝试了this answer 中产生不同错误的方法。)

标签: python xml xsd lxml python-unittest


【解决方案1】:

在您编辑后的第二个版本中,您在字符串而不是已解析的 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

【讨论】:

  • 谢谢。使用上面的代码我仍然遇到错误:OSError: Error reading file '../dir/testxsd.xsd': failed to load external entity "../dir/testxsd.xsd"。我有我从“测试”目录运行的 test.py 文件。在该测试目录中,我有一个“dir”目录,其中包含 testxsd.xsd
  • @Adam 有关您的项目结构的详细信息很重要。此外,在您的情况下,似乎不需要包含os.pardir
  • 再次感谢您。你能告诉我你是如何进行测试的吗?我正在使用python -m unittest test.py 运行它,但由于某种原因仍然出现错误。这显然是我做错了什么,所以我会试着弄清楚。
  • 在我回答的最后,你会看到我正在使用python test.py。但是python -m unittest test.py 也应该这样做。也许您遗漏了一个重要的细节,例如更复杂的结构或更多代码。
  • 哦,对了,抱歉,没看到。是的,也许你是对的。我会考虑更多,但你的答案应该没问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 2021-11-15
相关资源
最近更新 更多