2013-08-29 3 views
2

나는 반복적 인 방식으로 구축 한 객체를 가지고 있습니다. 매 단계마다 테스트하고 싶습니다. 여기에 대한 나쁜 테스트 기능은 다음과 같습니다.nosetests의 하위 테스트에서 테스트를 나누는 적절한 방법

def test_object: 
    o = object.Object() 
    o.step1() # in place method 
    assert(o.step1property) 
    o.step2() # in place method 
    assert(o.step2property) 
    o.step3() # in place method 
    # ... 

이렇게 모든 단계를 거친 후 개체에 원하는 속성이 있는지 확인합니다. 별도의 테스트에서 이러한 호출을 두지 왜 : 당신은 요청할 수 있습니다이 시점에서

def test_object: 
    o = object.Object() 
    yield o.step1 
    assert(o.step1property) 
    yield o.step2 
    # ... 

: 내가 좋아하는, 수율 키워드를 사용하여 하위 검사로이 분할 할 수 있습니다? 이전 결과의 올바른 출력이 필요한 경우 해당 파일을 .pickle 파일에 넣고 독립적 인으로 만듭니다. 그리고 나는 일반적으로 동의합니다. 그러나 유용하지 않은 유스 케이스가 있습니다. step1()이 클래스를 초기화하고 step2()가 JSON 내보내기라고 가정 해 보겠습니다. 그런 다음 step1()에서 항목을 변경하더라도 JSON 내보내기가 항상 작동하는지 확인해야합니다. .pickle 파일에 의존하는 것은 오래된 것일 수 있기 때문에 위험 할 수 있습니다. JSON 내보내기는 실제로 최신 객체로 실패 할 때 통과 할 수 있습니다. 두 가지 별도의 테스트에서 어설 션을 분리하고 step1()을 두 번 실행하면 (자체 테스트에서는 한 번, 테스트 2에서는 한 번의 설치 방법으로 실행), step1()은 시간이 많이 걸립니다.

이렇게하는 것이 바람직한 방법은 무엇입니까? 수율 이외의 "하위 테스트"를 호출하는 방법이 있습니까? 해당 하위 테스트의 반환 값을 얻을 수 있습니까? 제 경우에는 출력 디렉토리에 모든 테스트 결과를 저장하고 있기 때문에 JSON 문자열을 갖고 싶습니다. 그리고 문자열을 write_to_output_dir 함수에 전달하고 싶습니다 (잘못된 디자인 인 경우 알려주세요!).

답변

2

클래스가 이와 같이 테스트하기가 어렵다면 객체 지향 디자인에서 최적이 아닌 것을했을 가능성이 큽니다. 시간을 절약 할 수 있다면 this tech talk on unit testing을보십시오. 또한 좋은 (테스트 가능한) 객체 지향 디자인을 다룹니다.

tl; dr 본질적으로 단위 테스트를 가능한 한 원자 적으로 만드는 것이 좋습니다. 또한 특정 단위 테스트에서 테스트되지 않는 무의미한 기능을 조롱 할 수 있습니다.

예제에 초점을 맞추려면 초기화를 독립적으로 확인하고 싶습니다. 그것은 일종의 공장입니다. 그런 다음 JSON으로 내보내는 방법이 있습니다. 이것은 아마도 여러분이 초기화 된 객체를 조롱하고이 모의 객체에서 JSON 내보내기를 테스트하려는 지점 일 것이다. 즉, JSON 수출 업체는 초기화 논리와 운영 논리를 섞지 않도록 별도의 클래스 여야합니다. 일단 코드를 리팩터링하면 훨씬 쉽게 테스트 할 수 있습니다.

+0

본인의 테스트는 원자 적이어야한다는 데 동의합니다. 즉, JSON 내보내기는 이전 기능이 변경 되더라도 작동해야합니다. 공장 파일에 대한 JSON 내보내기를 테스트하는 함수가 있지만, 항상 해당 팩토리 파일을 업데이트하지 않고도 현재 버전의 객체에 대해 테스트하고 싶습니다 (매우 자주 사용됩니다!). 별도의 클래스에 관해서는 : 위의 코드는 읽기 쉽도록 단순하게 유지했습니다. 내 코드의 진짜 질문은 테스트를 하위 테스트로 분할하는 방법 이었으므로 하위 테스트를 호출하는 것이 중요했습니다. –

+0

(이전 코멘트를 계속 :) 귀하의 답변에서 나는 사람들이 일반적으로 하위 테스트를하지 않는 것을 읽었습니다. 내가 연계 된 기술 토크를 살펴보고 더 나은 테스트를 이해하는 데 도움이되기를 바랍니다. 도와 줘서 고마워! –