Spring Boot/Junit, 다중 프로파일에 대한 모든 장치 테스트 실행
저는 몇 가지 테스트로 구성된 기본 테스트 수업이 있습니다.각 테스트는 I 목록의 모든 프로필에 대해 실행되어야 합니다.
다음과 같은 매개 변수 값을 사용하는 것에 대해 생각했습니다.
@RunWith(Parameterized.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
// @ActiveProfiles("h2-test") // <-- how to iterate over this?
public abstract class BaseTest {
@Autowired
private TestRepository test;
// to be used with Parameterized/Spring
private TestContextManager testContextManager;
public BaseTest(String profile) {
System.setProperty("spring.profiles.active", profile);
// TODO what now?
}
@Parameterized.Parameters
public static Collection<Object[]> data() {
Collection<Object[]> params = new ArrayList<>();
params.add(new Object[] {"h2-test" });
params.add(new Object[] {"mysql-test" });
return params;
}
@Before
public void setUp() throws Exception {
this.testContextManager = new TestContextManager(getClass());
this.testContextManager.prepareTestInstance(this);
// maybe I can spinup Spring here with my profile?
}
@Test
public void testRepository() {
Assert.assertTrue(test.exists("foo"))
}
스프링에게 이러한 서로 다른 프로필을 사용하여 각 테스트를 실행하도록 어떻게 지시합니까?실제로 각 프로파일은 서로 다른 데이터 소스(메모리 내 h2, 외부 mysql, 외부 oracle 등)와 통신하므로 저장소/데이터 소스를 다시 초기화해야 합니다.
@ActiveProfiles(...)를 지정할 수 있으며 BaseTest에서 확장하여 ActiveProfile 주석을 재정의할 수도 있습니다.이것은 효과가 있겠지만, 저는 제 테스트 세트의 일부만 보여줍니다.대부분의 테스트 클래스는 BaseTest에서 확장되며 각 클래스에 대해 여러 개의 다른 프로필 스텁을 만들고 싶지 않습니다.현재 작동 중이지만 위험한 해결책:
- 기본 테스트(@ActiveProfiles("mysql"))
- FooClassMySQL(기본 테스트의 주석)
- FooClassH2(@ActiveProfiles("h2"))
- BarClassMySQL(BaseTest의 주석)
- BarClassH2(@ActiveProfiles("
- FooClassMySQL(기본 테스트의 주석)
감사해요.
가치가 있는 것:
제 사용 사례는 여러 스프링 프로파일에 대해 특정 테스트 클래스를 실행하는 것이었는데, 이를 달성한 방법은 다음과 같습니다.
@SpringBootTest
abstract class BaseTest {
@Test void doSomeTest() {... ARRANGE-ACT-ASSERT ...}
}
@ActiveProfiles("NextGen")
class NextGenTest extends BaseTest {}
@ActiveProfiles("Legacy")
class LegacyTest extends BaseTest {}
Maven을 사용하는 경우 실제로 명령줄에서 활성 프로파일을 지정할 수 있습니다(필요한 경우 env 변수).
mvn clean test -Dspring.profiles.active=h2-test
스프링이 컨텍스트를 부팅하기 전에 프로파일을 지정해야 하기 때문에 이 경우 매개 변수화된 테스트를 사용하는 접근 방식이 작동하지 않을 수 있습니다.이 경우 매개 변수화된 통합 테스트를 실행하면 테스트 실행자가 테스트 실행을 시작하기 전에 컨텍스트가 이미 부팅됩니다.또한 Junit의 매개 변수화된 테스트는 다른 이유(다른 데이터 시리즈로 단위 테스트 실행)로 인해 발명되었습니다.
편집: 또한 한 가지 더 - 사용하기로 결정했을 때@RunWith(Parameterized.class)
다른 러너를 사용할 수 없습니다.대부분의 경우(통합 테스트의 경우 모두는 아니지만) 다음과 같이 다른 러너를 지정하려고 합니다.SpringRunner.class
매개 변수화된 테스트를 수행할 수 없습니다.
스프링 프로파일은 이러한 방식으로 작동하도록 설계되지 않았습니다.
이 경우 각 프로필은 특정 데이터 원본을 사용합니다.
따라서 예상되는 데이터 소스를 사용하여 테스트를 실행하려면 각각 Spring Boot 로드가 필요합니다.
사실, 여러분이 하고 싶은 것은 여러분이 테스트하고 싶은 스프링 프로필만큼 많은 메이븐 빌드를 만드는 것과 같습니다.
게다가, 지역 환경에서의 빌드는 가능한 한 빨라야 합니다.
각각의 테스트에 대해 스프링 부트를 다시 로드해야 하는 DBMS 구현을 통해 자동화된 테스트 실행을 곱하는 것은 도움이 되지 않습니다.
은 지할필없다니를 .@ActiveProfiles
.
특정 Spring Boot 프로파일을 지정하여 각 Maven 빌드를 (순차적으로 또는 병렬적으로) 실행하는 작업을 정의할 수 있는 Continuous Integration 도구의 작업처럼 보입니다.
mvn clean test -Dspring.profiles.active=h2
mvn clean test -Dspring.profiles.active=mysql
기타...
메이븐 빌드 실행을 수행하는 스크립트를 작성하여 로컬에서 이를 수행할 수도 있습니다.
하지만 앞서 말한 것처럼, 그것은 당신의 지역 구축을 늦추고 또한 그것을 복잡하게 만들 것입니다.
언급URL : https://stackoverflow.com/questions/45200126/spring-boot-junit-run-all-unit-tests-for-multiple-profiles
'programing' 카테고리의 다른 글
현재 파이썬 세션에서 모든 변수를 저장하는 방법은 무엇입니까? (0) | 2023.08.20 |
---|---|
Android Studio Run/Debug 구성 오류: 모듈이 지정되지 않았습니다. (0) | 2023.08.20 |
클릭 시 Twitter Bootstrap Tooltip 콘텐츠 변경 (0) | 2023.08.20 |
전화 = N'1234'를 사용한 쿼리가 전화 = '1234'보다 느린 이유는 무엇입니까? (0) | 2023.08.20 |
비주얼 스튜디오 2013.컴퓨터의 IIS 웹 사이트에 액세스할 수 있는 권한이 없습니다. (0) | 2023.08.20 |