2009-11-13 6 views
18

저는 파이썬 프로젝트에서 테스트의 수와 품질을 향상시키고 자합니다. 테스트 횟수가 증가함에 따라 발생하는 어려움 중 하나는 각 테스트가하는 일과 문제를 발견하는 데 도움이되는 방법을 파악하는 것입니다. 나는 테스트를 추적하는 부분이 단위 테스트 이름 (elsewhere으로 언급 됨)보다 우수하다는 것을 알고 있지만, 문서화와 단위 테스트가 어떻게 함께 진행되는지 이해하는 데에도 관심이 있습니다.단위 테스트는 어떻게 문서화해야합니까?

향후 테스트에 실패 할 경우 유틸리티를 향상시키기 위해 어떻게 단위 테스트를 문서화 할 수 있습니까? 특히, 좋은 단위 테스트 docstring 만드는 무엇입니까?

우수한 설명서가있는 단위 테스트의 설명과 예제를 모두 평가할 수 있습니다. 비록 내가 독점적으로 파이썬으로 일하고 있지만, 나는 다른 언어의 관행에 개방적이다.

답변

13

내가 독점적으로 메소드 이름 내 단위 테스트에서 대부분의 문서 : 내 테스트 케이스의 거의 100 %를

testInitializeSetsUpChessBoardCorrectly() 
testSuccessfulPromotionAddsCorrectPiece() 

이 명확하게 단위 테스트의 유효성 검사가 무엇인지 설명하고 그것이 내가 사용하는 모든입니다. 그러나 몇 가지 복잡한 테스트 케이스에서 몇 가지 주석을 추가하여 여러 행에서 수행중인 작업을 설명합니다.

프로젝트의 모든 테스트 케이스의 이름을 구문 분석하여 문서 파일을 생성하기 전에 (저는 루비 용이라고 생각합니다) 도구를 본 적이 있지만 이름을 기억하지 않습니다. 당신은 체스 여왕 클래스에 대한 테스트 케이스를 가지고 있다면 :

Queen requirements: 
- can move straight up when not blocked. 
- can move straight left when not blocked. 
+0

함수 이름은 무엇입니까?나는 당신이 당신의 테스트 이름을 "testFunctionName"이라고 가정하고 있지만 괜찮습니다,하지만 당신은 심각하게 InitializeSetsUpChessBoardCorrectly라는 함수를 가지고 있습니까? 나는 "setUpChessboard"가 괜찮을 것이라고 생각한다. –

+10

아니요, 메서드 이름이 정확히 무엇을 테스트하는지 설명합니다.이 테스트 사례에서는 initalize()가 체스 보드를 올바르게 설정하는지 확인합니다. 붐, 자동 문서. –

+0

하하 예, 처음에는 "테스트"가 JUnit의 오래된 시절이었습니다. 내 두뇌가 아직 고착되어 있습니다. 단지 이름을 ititalizeSetsUpChessBoardCorrectly()로 지정하고 @Test 주석을 사용할 수 있습니다. –

4

정확히 무엇인지 설명해야 시험 방법의 이름 :

testCanMoveStraightUpWhenNotBlocked() 
testCanMoveStraightLeftWhenNotBlocked() 

이 도구는이 같은 내용의 뭔가가있는 HTML 문서를 생성하는 것 테스트. 문서는 시험을 실패하게하는 원인을 말해야합니다.

1

문서 문자열에 설명적인 이름과 주석을 조합하여 사용해야합니다. 이를 수행하는 좋은 방법은 문서 문자열에 기본 절차와 확인 단계를 포함시키는 것입니다. 그런 다음 테스트 실행을 자동화하고 결과를 수집하는 테스트 프레임 워크에서 이러한 테스트를 실행하면 프레임 워크가 stdout + stderr와 함께 각 테스트 메소드에 대한 문서 문자열의 내용을 기록하도록 할 수 있습니다.

class SimpelTestCase(unittest.TestCase): 
    def testSomething(self): 
     """ Procedure: 
      1. Print something 
      2. Print something else 
      --------- 
      Verification: 
      3. Verify no errors occurred 
     """ 
     print "something" 
     print "something else" 

테스트가 훨씬 쉽게 테스트가 수행되고 있는지 파악 할 수와 절차를 갖는

여기에 기본적인 예입니다. 테스트 출력을 포함하는 문서 문자열을 포함하면 결과를 훨씬 쉽게 이해할 때 잘못된 점을 파악할 수 있습니다. 내가 일했던 이전의 장소는 이와 같은 것을했다. 그리고 실패가 일어 났을 때 그것은 잘 잘되었다. CruiseControl을 사용하여 자동으로 모든 체크 인에 대해 단위 테스트를 실행했습니다.

+0

http://blog.codinghorror.com/code-tells-you-how-comments-tell-you-why/ –

8

아마도 문제는 테스트 문서 문자열을 작성하는 최선의 방법이 아니지만 테스트 자체를 작성하는 방법일까요? 스스로 문서화하는 방식으로 테스트를 리팩토링하면 코드가 변경 될 때 문서 구조가 오래 가지 않을 것입니다.

당신이 테스트를 명확하게하기 위해 할 수있는 몇 가지있다 :

  • 명확 & 설명이 시험 방법 이름은 (이미 언급)
  • 시험 몸이 명확하고 간결 (자기 문서화)해야
  • 멀리 떨어진 복잡한 설정/해체 등은 방법으로
  • 더 하시겠습니까? 예를 들어

,이 같은 시험이있는 경우 :

def test_widget_run_returns_0(): 
    widget = create_basic_widget() 
    return_value = widget.run() 
    assert return_value == 0 
    assert_basic_widget(widget) 

def create_basic_widget(): 
    widget = Widget(param1, param2, "another param") 
    widget.set_option(true) 
    widget.set_temp_dir("/tmp/widget_tmp") 
    widget.destination_ip = "10.10.10.99" 
    return widget 

def assert_basic_widget(): 
    assert widget.response == "My expected response" 
    assert widget.errors == None 

참고 테스트 방법은 현재로 구성되어있다 : 당신은 메서드 호출로 설정 문을 대체 할 수

def test_widget_run_returns_0(): 
    widget = Widget(param1, param2, "another param") 
    widget.set_option(true) 
    widget.set_temp_dir("/tmp/widget_tmp") 
    widget.destination_ip = "10.10.10.99" 

    return_value = widget.run() 

    assert return_value == 0 
    assert widget.response == "My expected response" 
    assert widget.errors == None 

을 의도에 부합하는 이름을 가진 일련의 메소드 호출, 테스트와 관련된 일종의 DSL. 그런 테스트에도 여전히 문서화가 필요합니까?

테스트 방법은 주로 한 수준의 추상화에만 적용됩니다. 알고리즘을 볼 수 시험 방법을 읽는 사람은 다음과 같습니다

  • 코드는 우리가 시험 방법의

그들의 이해를 기대했던 주장 위젯

  • 에서 실행을 요구하는 위젯
  • 을 만드는 테스트 메소드보다 낮은 추상화 레벨 중 하나 인 위젯을 설정하는 세부 사항에 의해 muddied되지 않습니다.

    시험 방법의 첫 번째 버전은 Inline Setup 패턴을 따릅니다. 두 번째 버전은 Creation MethodDelegated Setup 패턴을 따릅니다.

    일반적으로 나는 코드의 "이유"를 설명하는 경우를 제외하고는 의견에 반대합니다. 삼촌 밥 마틴의 Clean Code을 읽고 나에게 이것을 확신시켰다. 주석에 대한 장이 있으며 테스트 관련 장이 있습니다. 난 그것을 추천 해.

    자동 테스트 모범 사례에 대한 자세한 내용은 xUnit Patterns을 확인하십시오.

  • +0

    감사합니다. 추가 리소스를 제공하고 테스트 자체를 단순화하는 방법을 이해하도록 도와줍니다. 나는이 주제에 대해 더 많은 독서를하고있을 것입니다. 다시 고마워! – ddbeck

    0

    테스트가 실패하면 (그 전에 통과해야 함) 오류 메시지가 나타나고 무엇이 일어나는지 알 수 있어야합니다. 그런 식으로 계획하는 경우에만 발생합니다.

    전적으로 테스트 클래스, 테스트 메소드 및 어설 션 메시지의 이름 지정 문제입니다. 테스트가 실패하고 세 가지 단서에서 무엇이 일어나는지 알 수 없으면 몇 가지 이름을 바꾸거나 일부 테스트 클래스를 해체 할 수 있습니다.

    조명기의 이름이 ClassXTests이고 테스트 이름이 TestMethodX이고 오류 메시지가 "expected true, returned false"인 경우에는 발생하지 않습니다. 그것은 끔찍한 시험 쓰기의 표시입니다.

    대개의 경우 테스트 나 의견을 읽지 않아도 무슨 일이 일어 났는지 알 수 있습니다.

    관련 문제