2012-06-25 3 views
2

저는 다양한 방법으로 엔티티를 생성하고 작동하는 서비스에 대한 JUnit 테스트를 작성하고 있습니다. 나는 여러 가지 조합의 활동을 시도하기 위해 시험을 원한다. 나는 이런 일이 :이 JUnit 테스트 세트를 작성하는 "올바른"방법은 무엇입니까?

test1() { 
/** create entity **/ 
/** assert **/ 
} 

test2() { 
/** do X to entity **/ 
/** assert **/ 
} 

test3() { 
/** do X again to entity, expect failure **/ 
/** assert **/ 
} 

test4() { 
/** do Y to entity, expect success **/ 
/** assert **/ 
} 

그러나, 나의 이해는 내가 JUnit을 올바른 순서로 테스트를 실행 기대할 수 없습니다입니다, 각 테스트는 완전히 자체 포함되어야한다고. 내가 포함 된 모든 테스트 자체를 할 경우

, 그때 중복 코드를 많이 예를 들어 ... 상황이 다소 긴 실행하고 유지하는 것이 더 어렵다, 거기 :

test1() { 
/** create entity **/ 
/** assert **/ 
} 

test2() { 
/** create entity **/ 
/** do X to entity **/ 
/** assert **/ 
} 

test3() { 
/** create entity **/ 
/** do X to entity **/ 
/** do X again to entity, expect failure **/ 
/** assert **/ 
} 

test4() { 
/** create entity **/ 
/** do X to entity **/ 
/** do X again to entity, expect failure **/ 
/** do Y to entity, expect success **/ 
/** assert **/ 
} 

... 당신이 경우 따라와.

내 질문은 코드가 깨끗하고 우아하도록이 테스트를 작성하는 "올바른"방법은 무엇일까요? 당신은 개체를 초기화 @Before 주석이 방법을 사용할 수 있습니다

감사합니다, 롭

+2

오류가 발생한 위치를 문서화하는 데 더 많은 주장이있는 test4() {...} 만있는 옵션 3을 제안 할 수 있습니다. – Sam

+1

@sam 확실히 하나의 JUnit 테스트에서 여러 개의 어설 션을 제안하지 않으십니까? 옳은? 심지어 http://junit.sourceforge.net/doc/faq/faq.htm#tests_12는 테스트 당 하나의 주장을 제안합니다. –

+0

나는 그것을 제안하고 있습니다. :) 나는 로버트 흄이 테스트하고있는 그 권고가 도움이된다고 생각하지 않는다. 일련의 이벤트 또는 특정 사용 시나리오를 테스트하기 위해 다른 테스트 프레임 워크를 사용해야한다고 말할 수 있습니다. 테스트 케이스 내에서 주문을 유지 관리하는 테스트 러너를 만들 수도 있지만, 다른 FAQ를 위반하게됩니다. 그래도 좋은 생각. – Sam

답변

3

당신은 중복 코드를 처리하기 위해 각 시험 방법의 설정 방법을 호출 할 수 있습니다.

당신을 위해 더 읽을 수
test1() { 
setup(); 
/** create entity **/ 
/** assert **/ 
} 

test2() { 
setup(); 
/** create entity **/ 
/** do X to entity **/ 
/** assert **/ 
} 

setup(){ 
/**perform setup here*/ 
} 
5

은 테스트에 사용합니다. 그런 다음 @After 주석 메서드를 사용하여 테스트에 사용 된 리소스를 지우거나 해제하십시오.

당신은 할 수 :

private Entity entity; 

@Before 
public void init() { 
    entity = ... 
} 

@Test 
public void test1() { 
    // do things to entity 
    ... 
} 
+0

일련의 테스트가 연결 확인에서 시작해야하는 경우이 체크를 "before"절에 넣을 수 없습니다. – Gangnus

1

?

@OrderRunner 
public class EntityTest { 
    Entity e; 

    shouldBeCreatedInValidState() { 
    e = new Entity(); 
    assert(e.isValid()); 
    } 

    shouldBeWigglable() { 
    e.wiggle(); 
    assert(e.hasBeenWiggled()); 
    } 

    shouldNotBeWigglableTwice() { 
    try { 
     e.wiggle(); 
     fail("Wiggled too many times") 
    } catch(OverWiggledException e) {} 
    } 
} 

또는

public class EnttityTest { 
    shouldBeCreatedInValidState() { 
    Entity e = new Entity(); 
    assert(e.isValid()); 
    } 

    shouldBeWigglable() { 
    Entity e = new Entity(); 
    e.wiggle(); 
    assert(e.hasBeenWiggled()); 
    } 

    shouldNotBeWigglableTwice() { 
    Entity e = new Entity(); 
    e.wiggle(); 
    try { 
     e.wiggle(); 
     fail("Wiggled too many times") 
    } catch(OverWiggledException e) {} 
    } 
} 

내 취향은 후자이다. 이 속성은 놓치기 쉽기 때문에 두 번째 "흔들기"는 테스트를 통해 인과 관계가 한 번 흔드는 것처럼 보입니다.

그리고 설정/테스트 방법이 더 복잡하면 방법을 만듭니다.

shouldNotBeWigglableTwice() { 
    givenAnEntity(); 
    andIWiggleIt(); 
    try { 
     whenIWiggleIt(); 
     thenItShouldThrowAnException(); 
    } catch(OverWiggledException e) {} 
    } 
관련 문제