[java] jUnit 4.x의 Before and After Suite 실행 후크

테스트를 실행하기 위해 jUnit 4.4를 사용하여 통합 테스트 세트에 대한 설정 및 분해를 수행하려고합니다. 분해는 안정적으로 실행되어야합니다. TestNG에 다른 문제가 있으므로 jUnit으로 다시 포팅하려고합니다. 테스트가 실행되기 전과 모든 테스트가 완료된 후에 실행할 수있는 후크는 무엇입니까?

참고 : 우리는 빌드에 maven 2를 사용하고 있습니다. 나는 maven의 pre-& post-integration-test단계를 사용해 보았지만 테스트가 실패하면 maven이 중지되고 실행 post-integration-test되지 않으므로 도움이되지 않습니다.



답변

예, 테스트 스위트에서 테스트 전후에 설정 및 해체 메소드를 안정적으로 실행할 수 있습니다. 코드로 보여 드리겠습니다.

package com.test;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({Test1.class, Test2.class})
public class TestSuite {

    @BeforeClass
    public static void setUp() {
        System.out.println("setting up");
    }

    @AfterClass
    public static void tearDown() {
        System.out.println("tearing down");
    }

}

따라서 Test1수업은 다음과 같습니다.

package com.test;

import org.junit.Test;


public class Test1 {
    @Test
    public void test1() {
        System.out.println("test1");
    }

}

… 그리고 Test2비슷해 보이는 것을 상상할 수 있습니다 . 를 실행 TestSuite하면 다음을 얻을 수 있습니다.

setting up
test1
test2
tearing down

따라서 설정 / 해체가 각각 모든 테스트 전후에만 실행되는 것을 볼 수 있습니다.

캐치 : 이것은 테스트 스위트를 실행하고 개별 JUnit 테스트로 Test1 및 Test2를 실행하지 않는 경우에만 작동합니다. 당신이 maven을 사용하고 있다고 언급했고 maven surefire 플러그인은 스위트의 일부가 아닌 개별적으로 테스트를 실행하는 것을 좋아합니다. 이 경우 각 테스트 클래스가 확장하는 수퍼 클래스를 만드는 것이 좋습니다. 그런 다음 수퍼 클래스에는 주석이 달린 @BeforeClass 및 @AfterClass 메서드가 포함됩니다. 위의 방법만큼 깨끗하지는 않지만 당신에게 효과적이라고 생각합니다.

실패한 테스트의 문제는 maven.test.error.ignore를 설정하여 실패한 테스트에서 빌드가 계속되도록 할 수 있습니다. 이것은 지속적인 연습으로 권장되지는 않지만 모든 테스트를 통과 할 때까지 기능을 발휘해야합니다. 자세한 내용은 maven surefire 문서를 참조하세요 .


답변

내 동료는 다음을 제안했습니다. 사용자 정의 RunListener를 사용하고 testRunFinished () 메서드를 구현할 수 있습니다. http://junit.sourceforge.net/javadoc/org/junit/runner/notification/RunListener.html#testRunFinished(org. junit.runner.Result)

RunListener를 등록하려면 다음과 같이 surefire 플러그인을 구성하십시오.
http://maven.apache.org/surefire/maven-surefire-plugin/examples/junit.html 섹션 “사용자 정의 리스너 및 리포터 사용”

이 구성은 failsafe 플러그인에서도 선택해야합니다. 이 솔루션은 스위트, 룩업 테스트 클래스 또는 이와 같은 것들을 지정할 필요가 없기 때문에 훌륭합니다. Maven이 모든 테스트가 끝날 때까지 기다릴 수 있도록합니다.


답변


답변

주석을 사용하면 다음과 같이 할 수 있습니다.

import org.junit.*;
import static org.junit.Assert.*;
import java.util.*;

class SomethingUnitTest {
    @BeforeClass
    public static void runBeforeClass()
    {

    }

    @AfterClass
    public static void runAfterClass()
    {

    }

    @Before
    public void setUp()
    {

    }

    @After
    public void tearDown()
    {

    }

    @Test
    public void testSomethingOrOther()
    {

    }

}


답변

여기, 우리

  • JUnit 4.5로 업그레이드,
  • 작업 서비스가 필요한 각 테스트 클래스 또는 메서드에 태그를 지정하는 주석을 작성했습니다.
  • 서비스의 설정 및 해체를 구현하는 정적 메서드가 포함 된 각 주석에 대한 핸들러를 작성했습니다.
  • 테스트에서 주석을 찾기 위해 일반적인 Runner를 확장하여 적절한 지점의 테스트 실행 체인에 정적 핸들러 메서드를 추가했습니다.


답변

“참고 : 우리는 빌드에 maven 2를 사용하고 있습니다. maven의 사전 및 사후 통합 테스트 단계를 사용해 보았지만 테스트가 실패하면 maven이 중지되고 통합 후 테스트를 실행하지 않습니다. , 도움이되지 않습니다. “

대신 failsafe-plugin을 사용해 볼 수 있습니다. 설정 또는 중간 단계 상태에 관계없이 정리가 이루어 지도록 보장하는 기능이 있다고 생각합니다.


답변

모든 테스트가 “기술”클래스를 확장하고 동일한 패키지에있는 경우 약간의 트릭을 수행 할 수 있습니다.

public class AbstractTest {
  private static int nbTests = listClassesIn(<package>).size();
  private static int curTest = 0;

  @BeforeClass
  public static void incCurTest() { curTest++; }

  @AfterClass
  public static void closeTestSuite() {
      if (curTest == nbTests) { /*cleaning*/ }
  }
}

public class Test1 extends AbstractTest {
   @Test
   public void check() {}
}
public class Test2 extends AbstractTest {
   @Test
   public void check() {}
}

이 솔루션에는 많은 단점이 있습니다.

  • 패키지의 모든 테스트를 실행해야합니다.
  • “기술”클래스를 하위 클래스로 분류해야합니다.
  • @BeforeClass 및 @AfterClass를 하위 클래스 내에서 사용할 수 없습니다.
  • 패키지에서 하나의 테스트 만 실행하면 청소가되지 않습니다.

정보 : listClassesIn () => Java에서 주어진 클래스의 모든 하위 클래스를 어떻게 찾습니까?