2013-04-27 2 views
3

나는 TDD와 단위 테스트에서 내 손을 시험하고있다.이 코드를 테스트하는 방법

프로그램에서 출력되는 XML 파일이 있습니다. JSON으로 변환하고 싶습니다.

def to_json(filename): 
    with open(filename) as f: 
     xml_ = f.read() 
     dict_ = xmltodict.parse(xml_) 
     json_ = json.dumps(dict_) 
    return json_ 

어떻게 이것을 테스트 것 : 나는 xmltodict 그래서 제가하고 싶은 것은 발견? 3 가지 기능으로 나누고 각 기능을 별도로 테스트해야합니까? 나쁜 파일 이름에 대해 "방어 적으로"코딩해야합니까? 구문 분석 및 덤프 메서드에서 발생하는 오류는 어떻게됩니까?

마지막으로 좋은 소식/책/블로그 게시물이 이런 유형의 이야기입니까? 나는 단위 테스트를해야하고 TDD에 대한 아이디어를 좋아해야한다는 것을 이해하지만, 실제로 나는 내가하고있는 일에 대해 전혀 모른다. 나는 실제 변환 단계에서 논리 "파일을 열어"분리하는 것 모두의

첫째 :

+0

내가 JSON으로 변환하여 파일을 열 분리 것입니다. 코드를 테스트하는 것이 더 쉬울 것입니다. – alecxe

+0

코드가 이미 작성되었으므로 TDD는 다른 방법으로 작동합니다. 먼저 테스트를 작성하고 테스트를 통과 시키려면 코드를 작성하십시오. – alecxe

+0

나는 그것을 시도했지만 초기 테스트 (들)가 어떻게 생겼는지조차 확신하지 못한다. – DaveO

답변

1

여기 내 통찰력입니다.

그런 다음 기본적으로 함수가 합법적이고 올바른 xml을 변환하는지 확인하고 xml이 유효하지 않거나 손상된 경우 예외를 throw해야합니다. 서로 다른 유효하고 유효하지 않은 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() 

을 당신이 당신의 시험 방법을 자동적으로 곱합니다 멋진 ddt 패키지를 사용할 수있다 : 여기

은 당신이해야하는지 간단한 예제 다른 입력.

또한 xmltodict가 유효하지 않은 dict 객체를 반환하는 실생활 상황에서 다소 달성하기 어려울 수 있습니다. 이 경우 mockxmltodict.parse 기능이 필요하고 변경하려면 return_value입니다.

TDD에 대해 말하기. 코드가 이미 작성되었습니다. TDD는 먼저 테스트를 작성한 다음 실제 코드를 작성하여 테스트를 통과하는 다른 접근 방식을 사용합니다. 당신은 분명히 그것을 시도해야합니다 - 그것은 많은 이점을 가지고 있습니다.

일부 자원 :

관련 문제