IT

JUnit 테스트 내에서 코드가 실행 중인지 여부를 확인하려면 어떻게 해야 합니까?

itgroup 2023. 1. 31. 20:45
반응형

JUnit 테스트 내에서 코드가 실행 중인지 여부를 확인하려면 어떻게 해야 합니까?

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

실행할 "프로파일"을 프로그래밍 방식으로 결정하는 것이 좋습니다.설정에는 스프링프로파일을 고려해주세요.통합 테스트에서는 다른 데이터베이스에 대해 테스트할 수 있습니다.

여기 동작하는 테스트된 코드가 있습니다.

public static boolean isJUnitTest() {  
  for (StackTraceElement element : Thread.currentThread().getStackTrace()) {
    if (element.getClassName().startsWith("org.junit.")) {
      return true;
    }           
  }
  return false;
}

우선, 이것은 좋은 생각이 아닌 것 같습니다.약간 다른 코드가 아니라 실제 생산 코드를 유닛으로 테스트해야 합니다.

을 꼭 하고 할 수 이 을 위해 필드를 이 좋습니다.isUnitTestingJUnit(진실)순하단

이 스레드에 있는 많은 사람들은 JUnit에서 코드가 약간 다르게 실행되는 것은 좋지 않다고 말합니다.대체로 동의하지만 몇 가지 예외가 있을 것 같아요.

예를 들어, 저는 현재 DB에 접속하는 앱에 대해 Integration(유닛이 아닌) 테스트를 작성하고 있습니다.

이러한 승인 테스트에서는 종종 특정 테스트 데이터로 DB를 완전히 다시 초기화해야 합니다.

물론 실제 운영 DB에서 이 작업을 수행하지 않았으면 합니다. 이렇게 하면 귀중한 운영 데이터가 완전히 지워질 수 있기 때문입니다.

이 문제가 발생하지 않도록 하는 가장 쉬운 방법은 코드가 JUnit에서 실행 중일 때 프로덕션 DB에 연결할 수 없도록 하는 것입니다.예를 들어 연결을 생성하는 공장에서 JUnit에서 실행 중임을 알 수 있으며, 이 경우 연결하려는 데이터베이스가 테스트 데이터베이스(예: "test database")로 알려진 이름을 가지지 않는 한 늘 연결을 반환합니다.

이것은 나에게 효과가 있었다.

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"에 종속되어 있는 한 Eclipse IDE 내부뿐만 아니라 Maven 테스트에서도 사용할 수 있습니다. 예를 들어 다음과 같습니다.

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

유닛 테스트를 한다고 해서 다른 방식으로 작업을 수행한다면 유닛 테스트의 목적을 위반하는 것입니다.유닛 테스트는 실제 가동과 동일하게 실행됩니다(필요한 데이터의 셋업과 해체 등은 제외).JUnit 테스트 자체에 포함되며 코드에는 포함되지 않습니다).

단, 만약 당신이 정말 그럴만한 이유가 있다면, 저는 JUnit이 있는지 스택을 보고 알아보겠습니다.

유닛 항아리가 교실 통로에 있는지 확인해보는 건 어때?

스프링을 사용하면 이 값을 유지하는 콩을 정의할 수 있습니다.

응용 프로그램 컨텍스트:

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

테스트 응용 프로그램 컨텍스트:

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

스프링 구성 요소에 값을 주입합니다.

@Resource
private boolean isRunningTests;

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

가장 짧은(최소 코드) 솔루션은 테스트가 실행되지 않을 때 글로벌 플래그를 설정하는 것입니다.그 후, 1회 설정할 수 있습니다.main()(또는 유사한 진입점)을 사용하여 모든 테스트 클래스의 설정 메서드에서 반복적으로 설정할 필요가 없습니다.이 방법은 코드를 입력할 다른 방법이 없는 한 작동합니다(대안 없음).main).

두 번째로 짧은 해결책은 Janning의 답변과 같이 콜 스택에서 junit 패키지를 스캔하는 것입니다.다른 라이브러리와 실행자 뒤에 숨기지 않는 한 이 기능은 작동합니다.

의존성 주입도 효과가 있지만, 이 경우 기본적으로 글로벌 플래그를 설정하는 화려한 방법입니다.

test와 no test를 구별하기 위해 application-test.properties에서 항상 특별한 속성 또는 값을 정의할 수 있습니다.

이것은 사용자 질문과는 엄밀하게 관련이 없지만, 거기에 도달한 누군가가 유용하다고 생각할 것이라고 확신합니다.

다음 방법을 사용합니다. 테스트에서 사용되는 패키지 로컬 컨스트럭터를 노출합니다.

예.

src/main/java/ApplicationService.자바

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.자바

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

그것을 모든 시험에 폭로하다.

최종 수업이 아니다

테스트에서 확장하여 패키지 로컬 또는 보호 대상 퍼블릭컨스트럭터를 제공합니다.

최종 수업

package-local 컨스트럭터를 사용하여 작성하는 동일한 패키지(테스트 내)에 Factory 메서드를 공개합니다.

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

반응형