2011-01-21 6 views
2

"우수 사례"라는 질문이 있습니다. 특정 메소드에 대한 테스트를 작성하고 있지만 여러 항목 값이 있습니다. 각 항목 값에 대해 하나의 테스트를 작성해야합니까? 아니면 entryValues ​​변수 값을 변경해야하며 가능한 모든 범위의 값에 대해 .assert() 메서드를 호출해야합니까? 단위 테스트 작성 우수 사례

는 당신의 도움을 주셔서 감사합니다. 안부,

페드로 Magueija

편집 : 나는 .NET을 사용하고 있습니다. Visual Studio 2010 with VB.

답변

2

테스트하려는 방식 (또는 적어도 단위 테스트를 원하는 입출력 세트)에 대해 가능한 모든 값을 포함하는 각 입력/출력 세트에 대해 별도의 단위 테스트를하는 것이 좋습니다.

5

초기 입력 및 최종 출력이 다른 많은 테스트를 작성해야하는 경우 데이터 기반 테스트를 사용해야합니다. 이렇게하면 입력과 출력 간의 매핑과 함께 테스트를 한 번 정의 할 수 있습니다. 단위 테스트 프레임 워크는이를 케이스 당 하나의 테스트로 해석합니다. 실제로이 작업을 수행하는 방법은 사용중인 프레임 워크에 따라 다릅니다.

+0

데이터 구동 (매개 변수화) 테스트는 이론적으로는 좋지만 IMHO는 테스트 사례를 이해하고 유지 관리하기가 어렵게 만듭니다. 각각의 사례에 대해 설명적인 이름으로 별도의 테스트를하면 유스 케이스를 더 잘 이해할 수 있습니다. 충분히 의미가 있지만 중복 된 코드를 의미하지만 리팩토링은 적절한 수준으로 최소화 할 수 있습니다. –

+0

@Peter - 매개 변수화 된 테스트는 최소한 NUnit에서 가독성을 위해 Description 및 Name 속성을 사용합니다. 단위 테스트의 모든 단계가 일정하고 입력 - 출력 만 변경 될 때 데이터 기반 테스트를 사용합니다. – Gishu

0

이 차이점에 대해 이야기하고 있습니까?

- (void) testSomething 
{ 
    [foo callBarWithValue:x]; 
    assert… 
} 

- (void) testSomething2 
{ 
    [foo callBarWithValue:y]; 
    assert… 
} 

- (void) testSomething 
{ 
    [foo callBarWithValue:x]; 
    assert… 
    [foo callBarWithValue:y]; 
    assert… 
} 

테스트, 당신은 작동하지 않습니다 무엇을 더 좋은 생각을해야 실패 할 때 첫 번째 버전이 점에서 더 낫다. 두 번째 버전은 분명 더 편리합니다. 때로는 테스트 값을 컬렉션에 저장하여 작업을 저장하는 경우도 있습니다. 나는 보통 단 하나의 사례를 별도로 디버깅하고자 할 때 첫 번째 접근법을 선택한다. 그리고 물론, 테스트 값이 실제로 함께 소속되어 일관된 단위를 형성 할 때만 후자를 선택합니다.

0

정말로 두 가지 옵션이 있습니다. 어떤 테스트 프레임 워크 나 언어를 사용하고 있는지 언급하지 않으므로 적용되지 않을 수 있습니다.

1) 테스트 프레임 워크가 RowTest, MBUnit 및 Nunit을 사용하는 경우이를 지원합니다. .NET을 사용하는 경우이 방법을 사용하면 메서드에 여러 특성을 넣을 수 있으며 각 줄은 별도의 테스트로 실행됩니다

2) 조건별로 테스트를 작성하지 않고 의미있는 이름을 지정하면 테스트가 실패 할 경우 문제를 쉽게 찾을 수 있고 의미있는 결과를 얻을 수 있습니다.

편집 그것은 Nunit TestCase Explination

+0

안녕 Kev, RowTest를 검색 할 것입니다. 정말 좋은 접근 방법 같아. 고마워, 그리고 시간을내어 대답하는 모든 사람. –

1
  1. 작은 테스트를 쉽게 읽을 수 있습니다 NUNIT에서의 TestCase를했다.
  2. 이 이름은 테스트 문서의 일부입니다.
  3. 별도의 방법은 무엇이 실패했는지보다 정확하게 표시합니다.내 경험이 매우 빠르게 매우 큰 도착, 그래서 읽고 이해하기 어려워진다에서는

    void testAll() { 
        // setup1 
        assert() 
        // setup2 
        assert() 
        // setup3 
        assert() 
    } 
    

    , 그래서 내가 할 것 :

    void testDivideByZero() { 
        // setup 
        assert() 
    } 
    
    void testUnderflow() { 
        // setup 
        assert() 
    } 
    
    
    void testOverflow() { 
        // setup 
        assert() 
    } 
    
    당신은 같은 하나의 방법이 그래서 경우

1

나는 각 항목 값을 하나 개의 테스트를 작성해야하거나 내가 entryValues ​​변수 값을 변경해야하고, t 전화 그는 .assert() 메소드 (가능한 모든 값 범위에 대해 수행)?

하나의 코드 경로가있는 경우 일반적으로 가능한 모든 입력을 테스트하지 않습니다. 일반적으로 테스트하기를 원하는 것은 "흥미로운"인풋으로, 얻을 수있는 데이터의 좋은 예가됩니다.

나는 내가 MAX_NEGATIVE_INT, -1, 0, 1을 사용할 수있는 모든 가능한 값에 대한 테스트를 쓸 수 없습니다

define add_one(num) { 
    return num+1; 
} 

기능이있는 경우 예를 들어

, MAX_POSITIVE_INT 내 테스트 세트로 그들은 때문에 내가 얻을지도 모르는 재미있는 가치의 좋은 대표자.

모든 코드 경로마다 하나 이상의 입력이 있어야합니다. 모든 값이 고유 한 코드 경로에 해당하는 함수가있는 경우 가능한 전체 값 범위에 대한 테스트를 작성하는 것이 좋습니다. 그리고 이것의 예는 명령 파서 일 것입니다.

명확성을 위해 나는 디스패치 테이블보다는 엘프를 사용했습니다. 나는 이것이 고유 한 각각의 고유 한 값이 다른 행동을 가지므로 가능한 모든 값을 테스트해야한다는 것을 분명히합니다.