2010-04-06 4 views
46

우리의 툴킷에는 15000 개 이상의 JUnit 테스트가 있으며 다른 테스트가 실패 할 경우 많은 테스트가 실패하는 것으로 알려져 있습니다. 예를 들어, X.foo() 메서드가 Y.bar() 및 YTest.testBar() 함수를 사용하면 XTest.testFoo()도 실패합니다. 분명히 XTest.testFoo()는 X.foo()와 관련된 문제로 인해 실패 할 수도 있습니다.JUnit 테스트 종속성을 어떻게 지정합니까?

괜찮 았지만 여전히 두 테스트를 실행하려면 YTest.testBar()를 가리키는 XTest.testFoo()를 사용하여 테스트 종속성에 주석을다는 것이 좋습니다. 이 방법으로, X.foo()가 사용하는 기능이 실패했는지 여부를 즉시 알 수 있습니다.

JUnit 또는 다른 곳에서 사용할 수있는 주석이 있습니까? 뭔가 같은 :

public XTest { 

    @Test 
    @DependsOn(method=org.example.tests.YTest#testBar) 
    public void testFoo() { 
    // Assert.something(); 
    } 

} 
+0

그것은 그러나, 노년 스레드의 (!) X.foo()가 Y.bar()를 사용하는 경우 반드시 모의 Y.bar(), 그렇지 않으면 시험 귀하의 테스트는 단위 테스트가 아닙니다 (그러나 통합 테스트). 단위 테스트의 전체 아이디어는 어떤 의존성도 가지지 않는 것입니다. 그러나, 나는 이유가 여기에있어 ;-) – letmejustfixthat

답변

22

JExampleTestNG는 그런 일이있다.

나는 그것이 얼마나 유용한 지 모릅니다.하지만 시도해 보시고, 유용했는지 다시 말해주십시오.

+3

그래, 그것은 훌륭한 시작 같다 : http://chem-bla-ics.blogspot.com/2010/08/specifying-unit-test-dependencies-with. html –

+1

ClassA의 상황에서 유용합니다.methodA()는 ClassB.methodB()를 호출하고 둘 다 많은 시간이 필요합니다. 이 경우 testMethodA()가 testMethodB()에 종속되도록 지정할 수 있습니다. 즉, testMethodB()가 실패하고 testMethodA()가 실행되지 않고 ** 실패합니다. – Cherry

+0

@Cherry : [빠른 테스트] (http://agileinaflash.blogspot.fi/2009/02/first.html)를 쓰지 않는 핑계 인 것처럼 들립니다. 설계 개선을위한 몇 가지 옵션 : (1) methodB를 빠르게 만든다. (2) methodA를 methodB에 의존하지 않게한다. (3), ClassA를 테스트 할 때 ClassB에 대한 테스트 이중을 사용한다. –

1

실제로 알고있는 이와 같은 것이 없습니다. (편집 : 당신은 매일 새로운 것을 배웁니다 :) 내 의견으로는, 이것은 나쁜 것만은 아닙니다. (JUnit이 자동화 된 테스트의 다른 형태 (예 : 통합 테스트). 당신의 테스트 인 IMO는 "단위 테스트"(적어도 X#foo()의 테스트가 아닙니다)라는 단어의 가장 엄격한 의미는 아닙니다. X#foo()에 대한 테스트는 에만 의 구현에 따라에 따라 성공하거나 실패해야합니다. Y#foo()에 의존해서는 안됩니다.

내가하는 일은 Y를 조롱하고 매우 단순하고 제어 된 동작으로 MockY#foo() 같은 것을 구현하고 X#foo() 님의 테스트에 사용하는 것입니다.

말하자면, 15,000 개의 테스트를 통해 이것이 리팩터링에 어떤 고통을 줄 수 있는지 알 수있었습니다. :)

+1

단위 테스트가 종속성을 가질 수없는 이유가 표시되지 않습니다 ... 툴킷은 데이터 객체와 알고리즘을 정의합니다 ... 데이터 객체가 실패하면 어떻게합니까? 알고리즘이 자동으로이를 수정하도록 기대하십니까? 아마도 foo() 두 메소드의 이름은 오도 된 것일 수 있습니다 ... –

+0

엄격한 모의 테스트 만이 서로에 대한 의존성을 나타내지 않을 것입니다. 일반적으로 이러한 종속성은 항상 가능하며 OO 설계의 종속성을 반영해야합니다. 모든 테스트에서 이러한 주석을 유지하는 것이 상당한 이점없이 복잡성을 증가시킬 수 있다고 생각하지만 몇 가지 핵심 사례에서 이러한 주석을 사용하면 도움이 될 수 있습니다. – topchef

3

test dependencies in TestNG을 선언 할 수 있으며 구문은 예제와 거의 같습니다. 나는 JUnit이 비슷한 것을 제공한다고 생각하지 않는다.

+1

https://github.com/junit-team/junit.contrib/tree/master/assumes – jplandrain

1

behavior driven designjBehave에는 기본 시나리오보다 먼저 실행되는 시나리오 목록을 가져 오는 GivenScenarios 키워드가 있습니다. 이렇게하면 종속성을 정의하고 한 지점에서 실패 할 수 있습니다. jBehave의 로깅은 테스트가 의존성 또는 메인 본 섹션에서 실패한 경우 알려줍니다. 이것은 당신의 단위 테스트 클래스의 상단에 간다 https://github.com/junit-team/junit.contrib/tree/master/assumes

17

.

당신은 대중 당신의 방법 이름을 지정할 수 있습니다 무효 step1_methodName 등

+3

좋습니다. 곧 병합되기를 바랍니다 :) –

+0

이것은 maven central (http://search.maven.org/#search%7Cga%7C1%7Cjunit-contrib 참조)에서 아직 사용할 수없는 것 같습니다. 어떻게 사용합니까? 아니면 지금 다른 것을 사용하고 있습니까? – koppor

3

org.junit.FixMethodOrder

@FixMethodOrder (MethodSorters.NAME_ASCENDING) :이 문제를 해결의 JUnit에 기여 거기