ProgramingTip

코드가 JUnit 내에서 실행 중인지 여부를 어떻게 알 수 있습니까?

bestdevel 2021. 1. 6. 20:52
반응형

코드가 JUnit 내에서 실행 중인지 여부를 어떻게 알 수 있습니까?


내 코드에서는 JUnit 테스트 내에서 실행되는 경우 특정 수정을 수행해야합니다. 코드가 JUnit 내에서 실행 중인지 여부를 어떻게 알 수 있습니까? JUnit.isRunning () == true와 같은 서열이 있습니까?


"프로필"을 프로그래밍 방식으로 결정하려는 경우 유용 할 수 있습니다. 구성을 위해 Spring Profiles를 생각하십시오. 통합 테스트 내에서 다른 데이터베이스에 대해 테스트 할 수 있습니다.

여기에 작동하는 테스트 코드

public static boolean isJUnitTest() {
    StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
    List<StackTraceElement> list = Arrays.asList(stackTrace);
    for (StackTraceElement element : list) {
        if (element.getClassName().startsWith("org.junit.")) {
            return true;
        }           
    }
    return false;
}

우선, 아마도 좋은 생각이 아닐 것입니다. 약간 다른 코드가 아닌 실제 코드를 단위 테스트해야합니다.

코드에서 코드를 변경하고 있기 때문에 isUnitTesting코드에 새로운 정적 부울 필드 도입하고 JUnit이 구현할 수 있습니다. 단순하게 유지하십시오.


이 같은 많은 사람들은 JUnit에서 코드가 약간 다르게 실행되는 것이 나쁜 생각이라고 생각합니다. 일반적으로 동의하지만 몇 가지 예외가 신뢰할 수 있다고 생각합니다.

예를 들어, 현재 DB에 연결하는 앱에 대한 INTEGRATION (Unit이 아닌) 테스트를 작성하고 있습니다.

수용 테스트는 종종 특정 테스트 데이터로 DB를 완전히 다시 초기화해야합니다.

당연히 실제 수행되는 작업이 수행되는 작업이 수행됩니다. 이는 귀중한 데이터를 완전히 지울 수 있기 때문입니다.

가장 쉬운 절대 일어나지 방지를 보장하는 가장 쉬운 방법은 코드가 JUnit에서 실행하는 것입니다. 예를 들어 연결을 생성하는 공장에서 JUnit에서 실행 중임을 알릴 수 있고,이 경우 연결하려는 경우에는 기기에 연결된 이름이없는 경우 작업을 수행 할 수 있습니다. 테스트 데이터베이스 (예 : "testdatabase")가됩니다.


테스트를 제공하는 경우 클래스에서 코드를 제공하려는 경우에 사용할 수 있습니다. 이것은 디버그 플래그가 설치된 경우에만 적용되는 Java assert와 유사합니다.

이 같은 :

Object debugState() {
    // This is only meant to be called when testing
    if (!JUnit.isRunning()) {
        throw new IllegalStateException("Not in a test!");
    }
    // Now compute possibly costly debug information
    // not to be used in production
    Object state = ...
}

단위 테스트를 수행하기 때문에 다른 방식으로 작업을 수행하는 경우 단위 테스트의 목적을 무너 뜨리는 것입니다. (필요한 데이터의 설정 및 해체를 제외하고 ...하지만 코드가 아닌 JUnit 테스트 자체에 포함됨).

보고있는 것이 좋은 이유가 있는지 확인합니다.


junit jar가 클래스 경로에 있는지 확인하는 것은 무엇입니까?


Spring을 사용할 때 값을 보유하는 빈을 정의 할 수 있습니다.

애플리케이션에서 :

@Bean
public boolean isRunningTests() {
    return false;
}

테스트 애플리케이션에서 :

@Bean
public boolean isRunningTests() {
    return true;
}

값을 봄 준비해주십시오.

@Resource
private boolean isRunningTests;

private void someMethod() {
    if (isRunningTests()) {
        ....

테스트와 테스트 없음을 구분하기 위해 항상 application-test.properties에서 특수 속성 또는 값을 정의 할 수 있습니다.


가장 짧은 (최소 코드) 솔루션은 테스트가 실행 되지 않을 때 설정되는 전역 플래그를 갖는 것입니다 . 그런 다음 main()모든 테스트 클래스의 설정 방법에서 반복적으로 설정하는 대신 사용자 (또는 유사한 진입 점) 에서 한 번 설정할 수 있습니다 . 코드를 입력하는 다른 방법이없는 한 작동합니다 (대체 없음 main).

두 번째로 짧은 솔루션은 Janning의 답변 과 같이 junit 패키지에 대한 호출 스택을 스캔하는 입니다. 이것은 junit이 다른 라이브러리와 실행자 뒤에 숨지 않는 한 작동합니다.

종속성 주입도 작동하지만이 경우 기본적으로 전역 플래그를 설정하는 멋진 방법입니다.


이것은 나를 위해 일했습니다.

private Boolean isRunningTest = null;

private boolean isRunningTest() {
    if (isRunningTest == null) {
        isRunningTest = true;
        try {
            Class.forName("org.junit.Test");
        } catch (ClassNotFoundException e) {
            isRunningTest = false;
        }
    }
    return isRunningTest;
}

junit이 "test"범위의 종속성으로 포함되어있는 한, Maven 테스트 및 Eclipse IDE 내부에서 사용할 수 있습니다. 예 :

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>${junit.version}</version>
    <scope>test</scope>
</dependency>

이것은 사용자 질문과 엄격하게 관련이 없지만 거기에 도착한 누군가가 유용하다고 생각할 수 있습니다.

다음 접근 방식을 사용합니다. 테스트에서 사용할 패키지 로컬 생성자를 노출합니다.

예 :

src / main / java / ApplicationService.java

public class ApplicationService {
  private final Integer someInternalObject;

  public ApplicationService(String somePublicArgument) throws NumberFormatException {
    someInternalObject = Integer.valueOf(somePublicArgument, 16);
  }

  ApplicationService(Integer someInternalObject) {
     this.someInternalObject = someInternalObject;
  }
}

src / test / ApplicationServiceTest.Java

public class ApplicationServiceTest {
  @Test
  public void testSomething() throws Exception {
    ApplicationService applicationService = new ApplicationService(0);
  }
}

모든 테스트에 노출

마지막 수업이 아닙니다.

테스트에서 확장하고 패키지 로컬 또는 보호 대상에 대한 공용 생성자를 제공하십시오.

최종 수업

package-local 생성자를 사용하여 생성 할 동일한 패키지 (tests 내)에서 공용 팩토리 메서드 를 만듭니다.

참조 URL : https://stackoverflow.com/questions/2341943/how-can-i-find-out-if-code-is-running-inside-a-junit-test-or-not

반응형