2013-04-27 250 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在您首先編寫測試時使用不同的方法,然後嘗試通過編寫實際代碼來使它們通過。你一定要嘗試它 - 它有很多好處。

一些資源: