Etapa 6.5: Bateria de Testes (Front-end)
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
compileFrontendOnlyacima é 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 usarassertTrue(compiler.hasErrors())em vez deassertThrows.
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=FrontendSmokeTestAssim 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.ymlativo. - O pipeline verde no GitLab da sua equipe.