我正在尝试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的想法,但在实践中我不知道我在做什么。
答案 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使用不同的方法,首先编写测试,然后尝试通过编写实际代码使它们通过。你一定要尝试一下 - 它有很多好处。
一些资源: