programing

스프링 부트에서 프로필을 기반으로 선택적 테스트를 실행/해제하는 방법

subpage 2023. 7. 18. 21:44
반응형

스프링 부트에서 프로필을 기반으로 선택적 테스트를 실행/해제하는 방법

나는 있습니다spring-boot제가 IT 테스트를 작성하는 응용프로그램입니다.

검정에 대한 데이터는 다음과 같습니다.application-dev.properties가 화성시활을 활성화할 때.dev

다음은 제가 테스트할 내용입니다.

@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration
public class ApplicationTests {

    @Autowired
    Environment env;

    @Test
    public void contextLoads() {
        System.out.println(Arrays.toString((env.getActiveProfiles())));

    }

}

서비스 IT 테스트

public class ServiceITTest extends ApplicationTests {


     @value
     String username;

     @value
     String address;

     @Autowired
     MyService myService;


      @Test
      public void check_for_valid_username_address(){
            myService.validate(username,address);
      }
}

기본적으로 "dev",qa.의 프로필을 설정했을 때만 위의 테스트가 실행되기를 원합니다.

스프링 부트 테스트에서 그 미세한 제어가 가능합니까?

은 사수있다니습할용다를 입니다.@IfProfileValue◦◦ 도 활성 을 읽을 수에 대한.안타깝게도 활성 프로파일에서는 직접 작동하지 않지만 속성을 읽을 수 있으므로 프로파일 내에서 테스트를 실행할 특정 속성만 정의한 경우 해당 속성에 대한 주석을 사용할 수 있습니다.

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html#integration-testing-annotations-junit

활성 프로파일에서도 작동합니다. 활성 프로파일을 포함하는 속성 값이 있습니다.

특정 프로필을 사용하여 테스트만 활성화:

@IfProfileValue(name = "spring.profiles.active", values = {"specific"})

특정 프로필이 활성화된 경우 실행해서는 안 되는 테스트가 있으므로 이러한 테스트에 다음을 추가했습니다.

@ActiveProfiles(profiles = {"default"})

▁does와 함께 하지 않습니다.@IfProfileValue그리고 "기본값"과 "특정 프로필이 활성화되지 않은 경우 실행"도 찾지 못했습니다.

에는 봄당신또수있사다니습용할한은에를 할 수도 있습니다.@DisabledIf주석스프링 표현식 언어 표현식을 지정할 수 있습니다.를 보려면 이 블로그 게시물을 참조하십시오.

또한 JUNIT 5에는 다음이 있습니다.

  • @DisabledIfEnvironmentVariable
  • @DisabledIfSystemProperty

는 외부 한 시험을 제가 수 하지 않는 외부서필거테를제스트외고하싶원수다대없하만니않는작습음었로할동지지하존었의재요비스가한거▁i▁thatmore▁but않(▁or다음▁less▁service없지니▁tests▁that▁i▁a'▁the의▁requiredt▁an▁get존).@IfNotProfileValue).

대안으로 JunitAssume.assume을 사용했습니다.내가 원하는 행동을 제공한 것. 예를 들어,

Assume.assumeThat("Skipping Test: No username property", this.username, not(isEmptyString()));

프로필을 사용하지 않고 드라이브를 사용하게 되었습니다. 하지만 속성을 정의하거나 환경을 사용하여 프로필이 활성화되어 있는지 확인할 수 있어야 합니다.

assumeThat에 사용할 수 있습니다.@Test그리고.@Before방법들 그러나 그것을 알고 있어야 합니다.@After메서드가 계속 실행되므로 정리에 코드 가드가 필요할 수 있습니다.

저는 최근에 이것을 해야만 했습니다.

import org.springframework.core.env.Environment;
import static org.junit.Assume.assumeFalse;

@Test
public void testSomethingWhenProfileIsNot(){
  assumeFalse("Ignore this test when the active profile is 'myprofile'",
     Arrays.stream(environment.getActiveProfiles()).anyMatch( profileName -> "myprofile".equals(profileName)));

}


@Test
@IfProfileValue(name = "spring.profiles.active", value = "myprofile")
public void testSomethingWhenProfileIs(){
  
}

는 비슷한 비활성화 / 를 해야 했습니다. 사용 안 함/사용@TestSpring 속성 YAML 파일을 다른 환경으로 사용하는 메서드는 해제/해제된 기능이 서로 다릅니다.

솔루션은 사용자 지정 주석을 만드는 것이었습니다.FeatureA그리고.FeatureB예.

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@DisabledIf(value = "${ignore-feature.billing}", loadContext = true)
public @interface FeatureBilling {

}

그리고...

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@DisabledIf(value = "${ignore-feature.webhooks}", loadContext = true)
public @interface FeatureWebhooks {

}

테스트 방법은 다음과 같이 주석을 달 수 있습니다.

@SpringBootTest
public class TestScenarios {

    @Test                         
    public void test1() {
        // always run      
    }

    @Test
    @FeatureBilling         // method tests billing functionality
    public void test2() {

    }

    @Test
    @FeatureWebhooks        // method tests webhooks 
    public void test3() {

    }

    @Test
    @FeatureWebhooks        // method also tests webhooks
    public void test4() {

    }

    ...

}

그래서 그application.yaml파일은 예를 들어 포함할 수 있습니다.

ignore-feature:
  billing: false
  webhooks: false
  ... 
  

이는 특정 환경이 테스트하거나 주목하는 기능에 대해 매우 세분화될 수 있음을 의미합니다.

application-staging.yaml이를 무시하고 해당되는 경우 비활성화할 수 있습니다. -

ignore-feature:
  billing: true

다음을 사용하여 활성 프로필을 가져올 수 있습니다.org.springframework.core.env.Environment(조심하세요, 코틀린입니다.

@Autowired
private val environment: Environment? = null

private fun isProfileActive(name: String) = environment!!.activeProfiles.contains(name)

@Test fun onlyOnOpenShift {
     org.junit.Assume.assumeTrue(isProfileActive("openshift"));
     ...
}

만약 당신이 그것을 사용할 많은 사례가 있다면 (당신이 무언가를 잘못하고 있다는 것을 암시할 수도 있다고 제안합니다), 그러면 테스트 방법을 다음과 같은 주석으로 장식하는 것이 보상을 받을 수 있습니다.@OnlyIfProfileActive("openshift")그리고 당신 자신의 Junit 확장으로 그것을 처리한다, 예를 들면, 구현.org.junit.jupiter.api.extension.BeforeTestExecutionCallback메서드를 실행할지 여부를 결정합니다.이러한 경우 Spring 테스트 러너에서 환경을 얻을 수 있습니다.

@Test @OnlyIfProfileActive("openshift")
fun onlyOnOpenShift {
     ...
}

내 생각엔, 내가 추측하기에, 그것은 주석들이 하는 것과 같습니다.@IfProfileValue하지만 여기서 당신은 더 많은 통제권을 갖게 될 것입니다.

예를 들어, 다용도로 만들기 위해 JEXL이나 JUEL 등으로 평가된 표현일 수 있습니다.

@Test @SpringProfilesCondition("openshift && !mockDatabase")
fun onlyOnOpenShift {
     ...
}

언급URL : https://stackoverflow.com/questions/39048171/how-to-run-turn-off-selective-tests-based-on-profiles-in-spring-boot

반응형