Etapa 6.5: Bateria de Testes (Front-end)

Published

16/06/2026

Modified

16/06/2026

Objetivos

  • Configurar Integração Contínua (CI) inicial usando GitLab CI/CD.
  • Validar se o front-end do seu compilador (Léxico, Sintático e Semântico) está robusto antes de iniciarmos a Geração de Código.
  • Obter uma “nota parcial” segura das Etapas 1 a 5.

Fundamentação

Até a Etapa 6, você construiu todo o Front-end do compilador. Ele já é capaz de ler código fonte, montar a Árvore Sintática (AST) e verificar regras de escopo e tipagem.

Nesta “Etapa 6.5”, vamos introduzir o conceito de testes automatizados e Integração Contínua (CI/CD). A ideia é congelar o progresso até aqui e garantir que a base do compilador é sólida o suficiente para suportar a complexidade do Back-end (Geração de Código) que virá na Etapa 7.

Atividades Práticas

1. Criando Testes Unitários de Front-end (JUnit)

Em vez de verificar a geração de .class (que ainda não está pronta), vamos testar se o compilador acusa erro quando o código do usuário está incorreto, e se passa silenciosamente quando está correto.

Crie o arquivo de teste src/test/java/br/com/comcet/tp6/FrontendSmokeTest.java:

package br.com.comcet.tp6;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

public class FrontendSmokeTest {

    @Test
    void testaProgramaValido() {
        // Um programa válido deve passar por todo o frontend sem lançar exceções.
        String codigo = "program p; var x: integer; begin x := 10; end.";
        
        Compiler compiler = new Compiler(); // Adapte para a sua classe principal
        
        assertDoesNotThrow(() -> {
            compiler.compileFrontendOnly(codigo); // Deve rodar Léxico, Sintático e Semântico
        });
    }

    @Test
    void testaErroSintatico() {
        // Falta o ponto-e-vírgula depois de 'p'
        String codigo = "program p var x: integer; begin x := 10; end.";
        
        Compiler compiler = new Compiler();
        
        assertThrows(Exception.class, () -> {
            compiler.compileFrontendOnly(codigo);
        });
    }

    @Test
    void testaErroSemanticoVariavelNaoDeclarada() {
        // Uso de variável 'y' que não foi declarada
        String codigo = "program p; var x: integer; begin y := 10; end.";
        
        Compiler compiler = new Compiler();
        
        assertThrows(Exception.class, () -> {
            compiler.compileFrontendOnly(codigo);
        });
    }
}

Dica: O método compileFrontendOnly acima é fictício. Você deve chamar os métodos reais do seu compilador que processam a AST e verificam a semântica. Se o seu compilador lança Exceptions ou marca flags de erro (ex: compiler.hasErrors()), você pode usar assertTrue(compiler.hasErrors()) em vez de assertThrows.

2. Integração Contínua (GitLab CI/CD)

Para validar essa entrega e ganhar a pontuação parcial, vamos criar um “Pipeline” no GitLab.

Crie um arquivo chamado .gitlab-ci.yml na raiz do seu repositório:

image: maven:3.9-eclipse-temurin-17

stages:
  - relatorios
  - test_frontend

auditoria_de_prazos:
  stage: relatorios
  # É necessário instalar o git caso a imagem maven pura não tenha
  before_script:
    - apt-get update -y && apt-get install git -y || true
  script:
    - echo "=== Relatório de Auditoria de Prazos (Git History) ==="
    - echo "Etapa 1 (Prazo: 23/03):"
    - git log --before="2026-03-23T23:59:59" -n 1 --format="%cd - %s" || echo "Sem commits antes do prazo!"
    - echo "Etapa 2 (Prazo: 30/03):"
    - git log --before="2026-03-30T23:59:59" -n 1 --format="%cd - %s" || echo "Sem commits antes do prazo!"
    - echo "Etapa 3 (Prazo: 13/04):"
    - git log --before="2026-04-13T23:59:59" -n 1 --format="%cd - %s" || echo "Sem commits antes do prazo!"
    - echo "Etapa 4 (Prazo: 04/05):"
    - git log --before="2026-05-04T23:59:59" -n 1 --format="%cd - %s" || echo "Sem commits antes do prazo!"
    - echo "Etapa 5 (Prazo: 24/05):"
    - git log --before="2026-05-24T23:59:59" -n 1 --format="%cd - %s" || echo "Sem commits antes do prazo!"
    - echo "Etapa 6 (Prazo: 23/06):"
    - git log --before="2026-06-23T23:59:59" -n 1 --format="%cd - %s" || echo "Sem commits antes do prazo!"

validacao_etapas1a5:
  stage: test_frontend
  script:
    - echo "Compilando e rodando os testes de Front-end (Léxico, Sintático e Semântico)..."
    - mvn clean test -Dtest=FrontendSmokeTest

Assim que fizer o push, o GitLab irá rodar seus testes e, se tudo estiver correto, uma bolinha verde de sucesso aparecerá ao lado do seu commit.

O que entregar

  • Os testes JUnit verificando casos válidos e inválidos de escopo e sintaxe.
  • O arquivo .gitlab-ci.yml ativo.
  • O pipeline verde no GitLab da sua equipe.
Back to top