Pular para conteúdo

CICD

4. CI CD

Os testes de integração complementam os testes unitários ao fornecer uma visão mais abrangente e holística do sistema como um todo. Juntos, esses dois tipos de testes desempenham papéis distintos e complementam-se de várias maneiras.

A integração contínua automatiza a execução de testes sempre que há uma alteração no código-fonte. Isso permite detectar problemas rapidamente, logo após a introdução de uma mudança.

Os desenvolvedores recebem feedback imediato sobre a qualidade do código e a integração com o restante do sistema. Isso ajuda a corrigir problemas antes que possam se propagar.

A entrega contínua integra o código de diferentes desenvolvedores, reduzindo conflitos de integração que podem ocorrer quando as alterações são combinadas apenas no final do ciclo de desenvolvimento.

Assim, a tarefa repetitiva executada pelo desenvolvedor enquanto constroi os testes é executada automaticamente pela plataforma CI CD, formalizando a situação daquela versão após os testes e oferecendo feedback sobre ela. A seguir veremos como configurar a esteira utilizando a plataforma gitlab.

4.1. Configuração da esteira

Configurar uma esteira CI/CD (Continuous Integration/Continuous Delivery) com GitLab, separando testes unitários e testes de integração usando Maven pode ser realizado em várias etapas. Vou guiá-lo por um exemplo básico com uma estrutura de projeto Java usando Spring Boot e Testcontainers. Certifique-se de ajustar conforme necessário para suas necessidades específicas.

Estrutura de Projeto

  1. Estrutura de Diretórios:

    /my-spring-boot-app
    ├── src
    │   ├── main
    │   │   ├── java
    │   │   └── resources
    │   └── test
    │       ├── java
    │       └── resources
    ├── .gitlab-ci.yml
    └── pom.xml
    

  2. Pom.xml:

    • Certifique-se de incluir as dependências necessárias do Maven para o Spring Boot e o Testcontainers.
    • Aqui, estamos usando spring-boot-starter-test para o Spring Boot e testcontainers para testes de integração.
      <!-- Dependências para Spring Boot e Testcontainers -->
      <dependencies>
          <!-- Outras dependências do Spring Boot -->
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-test</artifactId>
              <scope>test</scope>
          </dependency>
          <dependency>
              <groupId>org.testcontainers</groupId>
              <artifactId>testcontainers</artifactId>
              <scope>test</scope>
          </dependency>
      </dependencies>
      

Configuração da Esteira CI/CD com GitLab

  1. .gitlab-ci.yml:

    • Configure o arquivo .gitlab-ci.yml para definir as etapas da esteira de integração contínua.
    • Divida as etapas para testes unitários e testes de integração.
    • Utilize o maven para a execução dos testes e do processo de construção.
      stages:
        - unit_test
        - integration_test
        - deploy
      
      unit_test:
        stage: unit_test
        script:
          - mvn clean test
      
      integration_test:
        stage: integration_test
        script:
          - mvn clean verify -P integration-tests
      
      deploy:
        stage: deploy
        script:
          - echo "Implemente seu script de implantação aqui"
      
  2. Configuração de Perfis Maven:

    • No arquivo pom.xml, crie um perfil para os testes de integração usando Testcontainers.
    • Este exemplo usa o plugin Surefire para testes unitários e Failsafe para testes de integração.
      <profiles>
          <profile>
              <id>integration-tests</id>
              <build>
                  <plugins>
                      <plugin>
                          <groupId>org.apache.maven.plugins</groupId>
                          <artifactId>maven-failsafe-plugin</artifactId>
                          <version>3.0.0-M5</version>
                          <executions>
                              <execution>
                                  <goals>
                                      <goal>integration-test</goal>
                                      <goal>verify</goal>
                                  </goals>
                              </execution>
                          </executions>
                      </plugin>
                  </plugins>
              </build>
          </profile>
      </profiles>
      

Vantagens de Separar Testes Unitários e de Integração

Separar testes unitários de testes de integração traz várias vantagens:

  • Rapidez nos Testes Unitários:

    • Os testes unitários são geralmente mais rápidos porque não envolvem a execução de serviços externos ou containers.
  • Identificação de Problemas Específicos:

    • A separação permite identificar problemas específicos, seja na lógica de negócios (testes unitários) ou nas integrações entre componentes (testes de integração).
  • Melhor Escalabilidade:

    • Testes unitários podem ser executados com mais frequência, proporcionando feedback mais rápido durante o desenvolvimento.
    • Testes de integração, por serem mais demorados, podem ser executados com menos frequência, garantindo uma boa cobertura sem sacrificar a agilidade.
  • Facilidade de Diagnóstico:

    • Falhas em testes de integração podem ser mais fáceis de diagnosticar devido à separação clara entre testes unitários e de integração.