Automação de Avaliação de Projetos de Programação com Shell Script e Gitee

Estrutura de Submissão e Fluxo de Trabalho

Para implementar um sistema de correção automática, é fundamental estabelecer um padrão de entrega. O modelo sugerido utiliza o Gitee (ou qualquer servidor Git) como repositório central:

  • Padronização de Projeto: O docente disponibiliza um repositório base com a estrutura de diretórios definida. Isso evita que cada estudante crie uma organização própria, facilitando a automação.
  • Organização por Branches: Cada aluno deve criar uma branch seguindo o padrão ID_XXX (onde XXX são os últimos dígitos da matrícula) e realizar o push de seu código para essa branch específica.
  • Conformidade de Interface: Os nomes de arquivos, funções e formatos de entrada/saída devem seguir rigorosamente a especificação fornecida para que os scripts de teste funcionem corretaemnte.

Script de Orquestração: grade_engine.sh

Este script é responsável por clonar o repositório, iterar sobre as branches de cada aluno e consolidar os resultados em um arquivo CSV. Ele deve ser mantido na raiz do ambiente de correção.

#!/bin/bash
# Script: grade_engine.sh
# Finalidade: Gerenciar a clonagem e iteração entre as branches dos alunos

ARQUIVO_NOTAS="relatorio_final.csv"
DIRETORIO_ATUAL=$(pwd)
export DIRETORIO_ATUAL

if [ $# -ne 1 ]; then
    echo -e "Uso correto: $0 [URL_DO_REPOSITORIO]"
    exit 1
fi

REPO_URL=$1
NOME_REPO=$(basename "$REPO_URL" .git)

# Limpeza de execuções anteriores
if [ -d "$NOME_REPO" ]; then
    rm -rf "$NOME_REPO"
fi

echo "Clonando repositório: $REPO_URL..."
git clone "$REPO_URL"

if [ ! -d "$NOME_REPO" ]; then
    echo "Erro: Falha ao clonar o repositório."
    exit 1
fi

# Inicializa o arquivo de resultados
echo "ID_ALUNO,NOTA_FINAL" > "$ARQUIVO_NOTAS"

cd "$NOME_REPO" || exit

# Obtém branches remotas que seguem o padrão de identificação (ex: 'ID')
git branch -r | grep 'origin/ID' | sed 's/origin\///' > "$DIRETORIO_ATUAL/lista_alunos.txt"

index=1
while read -r branch; do
    echo "Processando aluno $index: $branch"
    
    # Troca para a branch do aluno de forma silenciosa
    git checkout -q "$branch"
    
    # Chama o gerenciador de testes
    source "$DIRETORIO_ATUAL/eval_manager.sh"
    
    # Registra o resultado
    echo "$branch,$NOTA_FINAL" >> "$DIRETORIO_ATUAL/$ARQUIVO_NOTAS"
    ((index++))
done < "$DIRETORIO_ATUAL/lista_alunos.txt"

echo "Processo concluído. Resultados salvos em $ARQUIVO_NOTAS."

Gerenciador de Avaliação: eval_manager.sh

Este script coordena a execução de diferentes verificadores (checkers) e calcula a média ponderada ou soma das notas parciais.

#!/bin/bash
# Script: eval_manager.sh
# Finalidade: Consolidar métricas de avaliação parciais

NOTA_FINAL=0

# Exemplo de Verificador 1: Verificação de arquivos C
source "$DIRETORIO_ATUAL/check_files.sh" "*.c"
PONTOS_C=$RESULTADO_PARCIAL

# Exemplo de Verificador 2: Verificação de scripts Python
source "$DIRETORIO_ATUAL/check_files.sh" "*.py"
PONTOS_PY=$RESULTADO_PARCIAL

# Lógica de composição da nota (Soma simples ou Pesos)
NOTA_FINAL=$((PONTOS_C + PONTOS_PY))

echo "Pontuação da Branch: $NOTA_FINAL"
export NOTA_FINAL

Verificador Unitário: check_files.sh

Um exemplo de verificador que realiza uma análise estática simples, como contar linhas de código ou verificar a existência de arquivos obrigatórios.

#!/bin/bash
# Script: check_files.sh
# Finalidade: Validar existência de arquivos e métricas básicas

RESULTADO_PARCIAL=0
PADRAO_BUSCA=$1

if [ -z "$PADRAO_BUSCA" ]; then
    echo "Erro: Padrão de busca não definido."
    return
fi

# Localiza o arquivo no subdiretório
ARQUIVO_ALVO=$(find . -name "$PADRAO_BUSCA" | head -n 1)

if [ -z "$ARQUIVO_ALVO" ]; then
    echo "Arquivo $PADRAO_BUSCA não localizado."
    RESULTADO_PARCIAL=0
else
    # Exemplo: A nota é baseada na contagem de linhas (SLOC)
    LINHAS=$(wc -l < "$ARQUIVO_ALVO")
    echo "Arquivo $ARQUIVO_ALVO possui $LINHAS linhas."
    RESULTADO_PARCIAL=$LINHAS
fi

export RESULTADO_PARCIAL

Organização do Ambiente de Trabalho

Para garantir o funcionamento dos scripts, a árvore de diretórios deve ser organizada da seguinte forma:


/ambiente_correcao
│
├── grade_engine.sh        # Script principal
├── eval_manager.sh        # Orquestrador de notas
├── check_files.sh         # Verificador específico
├── /tools                 # Ferramentas auxiliares (compiladores, linters)
├── /NomeDoRepositorio     # Criado dinamicamente via Git clone
└── relatorio_final.csv    # Saída gerada após a execução

Possibilidades de Extensão

A arquitetura modular permite que os profesores implementem verificadores mais complexos, tais como:

  • Compilação Automatizada: Scripts que tentam compilar o código e atribuem nota zero em caso de erro de sintaxe.
  • Testes de Unidade: Execução de binários contra um conjunto de entradas predefinidas, comparando a saída gerada com o resultado esperado.
  • Integração Contínua (CI): Embora esta abordagem utilize scripts locais, o mesmo conceito pode ser adaptado para ferramentas como Jenkins ou Gitee Go, disparando a correção a cada push do aluno.

Tags: Git Gitee Shell Script Automação de Testes Engenharia de Software

Publicado em 6-13 02:46 por Thomas