3

我正在尝试 TDD 和单元测试,但从未真正认真做过。

我有一个从程序输出的 XML 文件。我想将其转换为 JSON。我找到了 xmltodict所以我想做的是:

def to_json(filename):
    with open(filename) as f:
        xml_ = f.read()
        dict_ = xmltodict.parse(xml_)
        json_ = json.dumps(dict_)
    return json_

我将如何测试这个?我应该把它分成 3 个功能并分别测试吗?我应该对错误的文件名进行“防御性”编码吗?parse 和 dumps 方法抛出的错误呢?

最后,是否有很好的参考资料/书籍/博客文章谈论这类事情?我知道我应该进行单元测试并且非常喜欢 TDD 的想法,但实际上我不知道我在做什么。

4

1 回答 1

1

这是我的见解:

首先,我将“打开文件”逻辑与实际转换步骤分开。

然后,基本上您需要确保您的函数转换合法且正确的 xml,并在 xml 无效或损坏时抛出异常。

这是您应该拥有的简单示例:

import json
import unittest
import xmltodict


def to_json(xml_):
    dict_ = xmltodict.parse(xml_)
    json_ = json.dumps(dict_)
    return json_


class TestToJson(unittest.TestCase):
    def test_good_xml(self):
        xml = """<?xml version="1.0"?>
                <catalog>
                   <book id="bk101">
                      <author>Gambardella, Matthew</author>
                      <title>XML Developer's Guide</title>
                   </book>
                   <book id="bk102">
                      <author>Ralls, Kim</author>
                      <title>Midnight Rain</title>
                   </book>
                </catalog>"""
        self.assertEquals(json.loads(to_json(xml)), {"catalog": {
        "book": [{"@id": "bk101", "author": "Gambardella, Matthew", "title": "XML Developer\'s Guide"},
                 {"@id": "bk102", "author": "Ralls, Kim", "title": "Midnight Rain"}]}})

    def test_bad_xml(self):
        xml = "<broken><broken"
        self.assertRaises(Exception, to_json, xml)


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

至于你应该测试不同的有效和无效的 xml 字符串,你可以使用一个很棒的ddt包,它会为不同的输入自动增加你的测试方法。

此外,您可能希望在 xmltodict 返回无效 dict 对象的实际情况中测试一些无法实现的情况。在这种情况下,您需要模拟 xmltodict.parse函数并将其更改为return_value.

谈到TDD。你的代码已经写好了。TDD 使用不同的方法,您首先编写测试,然后尝试通过编写实际代码使它们通过。您绝对应该尝试一下 - 它有很多好处。

一些资源:

于 2013-04-27T04:18:02.067 回答