如何测试此代码
问题描述:
我在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的想法,但在实践中我不知道我在做什么。
答
这里是我的见解:
首先,我会独立于实际转换步骤“打开文件”的逻辑。
然后,基本上你需要确保你的函数能够转换合法和正确的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对象的实际情况中测试某种程度上不可实现的情况。在这种情况下,您需要mockxmltodict.parse
函数并更改它的return_value
。
说到TDD。你的代码已经写好了。 TDD在您首先编写测试时使用不同的方法,然后尝试通过编写实际代码来使它们通过。你一定要尝试它 - 它有很多好处。
一些资源:
我会单独与转换成JSON打开该文件。测试代码会更容易。 – alecxe 2013-04-27 03:57:01
加上你的代码已经写好了,TDD以另一种方式工作 - 首先你写你的测试,然后在试图通过测试时进行编码。 – alecxe 2013-04-27 03:59:00
我尝试过,但我甚至不确定那些初始测试是什么样的。 – DaveO 2013-04-27 04:09:27