如何测试此代码

时间:2013-04-27 02:39:19

标签: python unit-testing tdd

我正在尝试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个功能并分别测试吗?我应该针对错误的文件名进行“防御性”编码吗?那么解析和转储方法引发的错误呢?

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

1 个答案:

答案 0 :(得分: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对象的现实生活中无法实现的情况。在这种情况下,您需要mock xmltodict.parse功能,并将其更改为return_value

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

一些资源: