2013-04-27 166 views
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个功能并分别测试吗?我是否应该对一个错误的文件名进行“防御”编码?怎么样的解析和转储方法抛出的错误?

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

+0

我会单独与转换成JSON打开该文件。测试代码会更容易。 – alecxe 2013-04-27 03:57:01

+0

加上你的代码已经写好了,TDD以另一种方式工作 - 首先你写你的测试,然后在试图通过测试时进行编码。 – alecxe 2013-04-27 03:59:00

+0

我尝试过,但我甚至不确定那些初始测试是什么样的。 – DaveO 2013-04-27 04:09:27

回答

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对象的实际情况中测试某种程度上不可实现的情况。在这种情况下,您需要mockxmltodict.parse函数并更改它的return_value

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

一些资源: