programing

메이븐에서 여러 스프링 부트 애플리케이션에 대한 엔드 투 엔드 통합 테스트

iphone6s 2023. 6. 26. 21:08
반응형

메이븐에서 여러 스프링 부트 애플리케이션에 대한 엔드 투 엔드 통합 테스트

여러 대의 엔드 투 엔드 통합 테스트를 실행하는 권장 방법은 무엇입니까?Spring에서 응용 부팅Maven빌드의 검증 단계?

기본적으로, 저는 여러 모듈이 별도의 스프링 부트 애플리케이션인 멀티 모듈 메이븐 프로젝트를 가지고 있습니다.소스에 있습니다. 흐름은 " " " " " " " " " " " " " " " " " " " 와 함께 사용됩니다.JMS를 들어, A 발생하면 "A", "A", "A"합니다.JSON를 데터파메저장니다합를시지이일과▁a에 저장합니다.JMS 응용 가 큐를 . 응프가램 B고폴있습다니하.JMS대기열은 메시지를 선택하고, 파일을 읽고, 다른 데이터베이스를 사용하여 일부 처리를 수행하고, 다른 대기열에 메시지를 저장합니다.그러면 애플리케이션 C가 해당 메시지 등을 수신합니다.

개별 애플리케이션에 대한 통합 테스트를 설정했습니다. 이 테스트는 Maven Failsafe 플러그인에서 실행됩니다.하지만 메이븐의 모든 시스템을 통합 테스트하고 싶습니다.이 작업을 전담하는 프로젝트에 별도의 모듈을 설정했으므로 이 모듈의 빌드 확인 단계에서 다른 종속 모듈을 사용하여 엔드 투 엔드 테스트를 수행했으면 합니다.

이를 위한 최선의 연습 방법이 있습니까?세 가지 잠재적인 방법이 있습니다.

  1. 각 응용프로그램의 구성을 동일한 응용프로그램 컨텍스트에 로드합니다.그러나 여러 데이터 소스 등으로 인해 충돌이 발생하기 때문에 엔드 투 엔드 통합 테스트를 사용하려면 이러한 데이터 소스를 모두 수동으로 구성해야 합니다. 따라서 이는 잘못된 것 같습니다.
  2. 각 응용 프로그램을 별도의 프로세스로 시작합니다. 그러면 테스트 모듈 빌드가 중지/충돌/충돌할 경우 응용 프로그램을 올바르게 추적하고 종료할 수 있는 방법은 무엇입니까?
  3. 각각의 구성 컨텍스트가 있는 별도의 스프링 부트 애플리케이션을 동일한 프로세스에서 쉽게 로드할 수 있는 방법이 있습니까?이것이 가장 합리적인 선택인 것 같습니다.다음과 관련하여 고려해야 할 사항이 있습니까?Maven빌드/페일세이프 플러그인?

후속 조치를 통해 제가 무엇을 하게 되었는지 말씀드리겠습니다(계속해서 잘 작동하고 있습니다).

  • 테스트 모듈에서 기본적으로 테스트를 건너뛸 수 있는 "default"(jgitflow 플러그인을 사용하므로 명시적으로 요청할 때만 엔드 투 엔드 테스트를 실행하도록 함), 데이터베이스와 같은 외부 리소스가 필요하지 않은 엔드 투 엔드 테스트를 위한 "standalone-e2e"(완전한 엔드 투 엔드 테스트를 수행하려는 개발자를 대상으로 함),실제 데이터베이스 등을 사용하는 엔드 투 엔드 테스트를 위한 "통합 e2e"(CI의 일부로 트리거될 수 있음).스프링 프로파일(해당 Maven 프로파일에 의해 활성화됨)은 개별 구성요소의 구성을 제어합니다.
  • 독립 실행형 e2e의 경우 빌드 도우미 메이븐 플러그인으로 예약된 포트에서 실행되는 엔드 투 엔드 테스트의 일부로 액티브 mq-maven-plugin, hsqldb-maven-plugin 등과 같은 관련 플러그인이 리소스를 시작(나중에 종료)합니다.process-exec-maven-plugin은 통합 전 테스트 단계(표준 Spring Boot 앱)에서 테스트할 모든 구성 요소를 시작하는 데 사용되며 통합 후 테스트 단계에서 자동으로 종료됩니다.스프링 구성 및 특정 Maven 테스트 종속성은 가짜 FTP 서버와 같은 다른 리소스를 처리합니다.모든 리소스 및 구성 요소가 실행된 후 테스트 코드 자체가 필요에 따라 데이터베이스와 파일 시스템을 채우고 JMS를 사용하여 흐름을 트리거(및 해당 응답 대기 등)합니다.
  • 통합 e2e 프로파일은 거의 동일하지만 관련 Spring 속성에 구성된 "실제" 외부 리소스(Amazon SQS 큐, MySQL 데이터베이스 등)를 사용합니다.
  • 테스트에 필요하고 테스트에 의해 생성된 모든 파일(예: 데이터 파일, HSQLDB 파일, 로그 파일 등)은 "target" 빌드 디렉토리 아래에 생성되므로 이 영역을 검사하여 테스트 중에 발생한 내용을 쉽게 확인할 수 있으며 "mvn clean"을 사용하여 모든 내용을 지울 수도 있습니다.

저는 그것이 유용하기를 바랍니다. 제가 해야 할 일이 무엇이든 간에 메이븐 플러그인이 그것을 처리하기 위해 존재한다는 것을 알게 되어 확실히 신선했습니다!

아주 좋은 질문입니다!저는 혼자서 다른 사람들이 대답하는 것에 관심이 있을 것입니다.제 의견을 공유하겠습니다.

제가 알기로는 무엇보다도 먼저 테스트하고자 하는 것이 무엇인지 알아야 합니다.통합 테스트는 응용 프로그램의 일부에서 작동해야 하며 개발한 구성 요소가 반실체 환경에서 제대로 작동하는지 확인해야 합니다.당신은 이미 그렇게 한 것 같습니다.

이제 시스템 테스트(통합 테스트와 시스템 테스트를 의도적으로 구분합니다.이들은 QA 직원들을 '모방'해야 합니다 :) 그래서 그들은 시스템을 블랙박스로 취급합니다.그들은 내부 API를 호출할 수 없고 실제 흐름을 실행할 수 없습니다.엔드 투 엔드 테스트 IMO는 이 범주에 속합니다.

이 경우 프로덕션에서와 같은 클래스 경로로 배포된 시스템과 프로덕션에서와 같은 클래스 경로를 비교하여 이러한 시스템을 확인하려고 합니다.

그래서 저는 당신처럼 옵션 1을 별로 믿지 않습니다.

옵션 3에 대해서도 좋은 해결책인지 잘 모르겠습니다.다른 응용 프로그램 컨텍스트(나는 스프링 부트에 대해 잘 모르기 때문에 기술적으로 언급할 수 없음)로 작업을 실행하더라도 런타임에서 동일한 클래스 경로를 공유하기 때문에 아마도 제3자 간에 충돌이 발생할 위험이 있습니다(스프링 부트가 자체적으로 많은 버전의 jar를 정의한다는 것은 알지만,특히 하나의 모듈만 업그레이드하고 종속성을 변경하는 경우에는 더욱 그렇습니다.따라서 이 방법을 실행할 때 메모리에서 정확히 무엇이 실행되는지 알 수 없습니다.

따라서 엔드 투 엔드 테스트의 경우 옵션 2를 선택합니다.동기화와 관련하여, 아마도 옵션은 운영 체제 수준의 프로세스 상태 추적과 함께 애플리케이션 수준에서 일부 논리를 구현하는 것일 것입니다.한 가지 더 언급하고 싶은 점은 일반적으로 엔드 투 엔드 테스트는 여전히 기능 테스트(시스템의 기능 동작을 확인함)이므로 일반적으로 각 테스트에서 시스템 충돌을 확인해서는 안 된다는 것입니다.각 흐름에 대해 시스템 충돌을 확인하면 이러한 테스트가 너무 느려집니다.물론 코너 케이스를 점검하기 위해 비교적 작은 테스트 스위트 하나를 유지할 수 있습니다.

이것이 도움이 되길 바랍니다.

특정한 이유로, 저는 두 번째 접근법을 사용하기로 결정했고 해결해야 할 비슷한 문제가 있었습니다.는 maven-dependency-plugin과 process-exec-maven-plugin의 조합을 생각해냈습니다.

몇 가지 애플리케이션이 있다고 가정합니다.)이 있다고 가정합니다.app_A,app_B...) 및 모듈T테스트가 구현되는 곳.

이 아이디어는 테스트를 시작하기 전에 응용프로그램을 로컬 빌드 디렉토리에 복사하고 시작하는 것이었습니다.테스트 실행 후 응용 프로그램이 중지됩니다.

이를 위해 모듈에 추가했습니다.T다음과 같은 제조법을 제시합니다.

<build>
  ...
  <plugin>
    <!-- copy apps to current build-dir -->
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>3.1.2</version>
    <executions>
      <execution>
        <id>copy-app-A</id>
        <goals>
          <goal>copy</goal>
        </goals>
        <phase><!-- either pre-test or pre-integration-test --></phase>
        <configuration>
          <artifactItems>
            <artifactItem>
              <groupId>${project.groupId}</groupId>
              <artifactId>app_a</artifactId>
              <version>${project.version}</version>
              <outputDirectory>${project.build.directory}</outputDirectory>
              <destFileName>app_a.jar</destFileName>
            </artifactItem>
          </artifactItems>
        </configuration>
      </execution>
      <execution><!-- repeat as many apps you have --></execution>
    </executions>
  </plugin>
  <plugin>
    <!-- start applications -->
    <groupId>com.bazaarvoice.maven.plugins</groupId>
    <artifactId>process-exec-maven-plugin</artifactId>
    <version>0.9</version>
    <executions>
      <execution>
        <!-- repeat 'start' block for each copied app -->
        <id>start-external-server</id>
        <phase><!-- same as in copy block --></phase>
        <goals>
          <goal>start</goal>
        </goals>
        <configuration>
          <name>run-app-A</name>
          <arguments>
            <argument>java</argument>
            <argument>-jar</argument>
            <argument>${project.build.directory}/app_a.jar</argument>
          </arguments>
        </configuration>
      </execution>
      <execution>
        <!-- this is always executed and ensures apps get stopped -->
        <id>stop-server</id>
        <phase><!-- either post-test or post-integration-test depending on --></phase>
        <goals>
          <goal>stop-all</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
  ...
</build>

언급URL : https://stackoverflow.com/questions/33873548/end-to-end-integration-test-for-multiple-spring-boot-applications-under-maven

반응형