Acho que tem dois caminhos para este problema:
- Usar uma biblioteca de testes para uma linguagem escolhida;
- Realizar testes de forma independente da linguagem.
Se seu curso for sobre frontend, acho que a alternativa 1 é a mais indicada. Caso contrário eu indico a segunda saída, que vou explicar como fazer agora.
obs: se seu curso for especificamente para uma linguagem só, pode considerar a alternativa 1 também, mas se decidir adicionar outra linguagem no futuro... boa sorte! Não será fácil converter a suíte de testes para uma maneira agnóstica de linguagem.
Vamos lá! Como eu implementaria a opção 2?
Eu iria utilizar STDIN e STOUT como parâmetros e saída para o programa do usuário. Esta é a maneira mais simples de comunicar entre processos e você pode enviar e receber qualquer tipo de dado: plaintext, json, binário, etc. Exemplos:
- Números para fazer soma:
result="$(echo "10\n5" | somador_do_usuario)"
if [ "$result" -eq "15" ]; then
echo "correto"
elif
echo "errado"
fi
O |
(pipe) do shell é o que permite a saída de um programa (stdout) ser a entrada (stdin) para outro.
- Enviar e receber JSON
const child = child_process.spawn('programa_do_usuario');
child.stdin.write(JSON.stringify({ foo: 'bar' }));
child.stdin.write('\n'); // flush
child.stdout.on('data', (data) => {
const response = JSON. parse(String(Buffer.from(data)));
// validar json
});
Como pode perceber, essa solução independe da linguagem de programação usada pelo usuário e pela linguagem de programação dos testes. A ideia envolve executar o programa e se comunicar pelos pipes unix.
A única coisa a se acertar com os usuários é o formato esperado de entrada e saída de dados, ou seja, JSON (e qual o schema), plaintext e qual a ordem dos dados, etc. Você pode também utilizar argumentos aos programas (programa agr1 arg2
) para indicar mais informações ao programa - exemplo qual teste rodar.
Isole o ambiente!
Idealmente (obrigatoriamente) você deve isolar o ambiente que você está rodando o código do terceiro, por questões de segurança e validação dos testes. Para isso, recomendo a utilização de containers, como o Docker ou Podman. Isso depende muito de cada situação, mas basicamente basta um Dockerfile que faz um git pull do código do usuário, compile (se necessário), rode e realize os testes.
Se tiver alguma pergunta ou algum outro exemplo/implementação sinta-se livre para perguntar e tentarei te ajudar. Muito legal seu projeto de aprendizado de programação gratuito. Sucesso.
obs: nenhum dos códigos foram testados, todos mostrados como exemplos.