[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이 모든 테스트가 끝날 때까지 기다릴 수 있도록합니다.
답변
당신은 사용할 수 있습니다 JUnit을 4.9+에서 @ClassRule 주석 으로 내가 대답에 또 다른 질문을 설명 .
답변
주석을 사용하면 다음과 같이 할 수 있습니다.
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에서 주어진 클래스의 모든 하위 클래스를 어떻게 찾습니까?