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.
Cara simplesmente incrível a forma que você explicou isso, ja me deu uma luz muito grande.
Teve algo importante que talvez faltou de mencionar, vou até editar a postagem. A linguagem que vou utilizar é fixa, (No caso vai ser em C). Os exercícios seguirão um certo padrão evoluindo apenas em dificuldade.
Gostei muito desse seu ponto sobre isolar o ambiente, acredito que vai ser muito neccessário pra mim, se tiver mais informações, ou até mesmo alguma fonte de estudo para me aprofundar nessa solução ficarei grato.
Desde já, agradeço muito pelo comentário, @GRFreire. Abraço mano!