Moodle + CodeRunner — correção automática de código
O CodeRunner é um tipo de questão do Moodle em que o aluno escreve código e a nota sai de rodar esse código contra uma bateria de testes. É ideal para estender o aprendizado da parte de linguagem do curso — bits, estruturas de controle, tipos de dados — com feedback imediato, complementando os labs de firmware (Wokwi/ESP32).
O código é executado num sandbox (servidor Jobe) usando o compilador do host (gcc/g++, python3, …) — não é firmware de ESP32. Use o CodeRunner para os conceitos de C/C++/Python puros (ex.: ehPar, FizzBuzz, soma de dígitos) e os labs de GitHub/Wokwi para o hardware.
1. Como funciona
- CodeRunner é o tipo de questão (plugin
qtype_coderunner) instalado no Moodle. - Jobe é o sandbox separado que compila e executa o código com segurança.
- O aluno responde e clica em Check: o CodeRunner roda os test cases e mostra na hora quais passaram (modo adaptativo). No modo típico tudo-ou-nada, todos os testes precisam passar.
Linguagens suportadas incluem Python3, C, C++, Java, PHP, JavaScript, Octave e SQL.
2. Instalação
2.1 O plugin CodeRunner
Instale o qtype_coderunner pelo diretório de plugins do Moodle: Administração do site → Plugins → Instalar plugins (ou baixe de moodle.org/plugins/qtype_coderunner). Ele traz junto o qbehaviour_adaptive_adapted_for_coderunner.
2.2 O sandbox Jobe
- Jobe público (só para testar)
- Jobe próprio (produção)
Logo após instalar, o CodeRunner já aponta para o Jobe público da Universidade de Canterbury — bom para experimentar as primeiras questões, mas não para produção (sem garantia de disponibilidade e com limite de uso).
Para uso real, suba seu próprio Jobe. Como o curso já usa Docker, a forma mais simples é a imagem jobeinabox:
docker run -d --name jobe -p 4000:80 trampgeek/jobeinabox:latest
docker run -d --name jobe -p 4000:80 ruseler/jobeinabox:latest
Depois, em Administração do site → Plugins → Tipos de questão → CodeRunner, defina:
- Jobe host:
IP-da-maquina:4000(ou o host do container). - API key: se você configurou uma no Jobe.
O código-fonte e as instruções completas do Jobe estão em github.com/trampgeek/jobe.
O sandbox executa código do aluno. Rode o Jobe em uma máquina/rede isolada e, para provas, prefira um Moodle separado. Nunca exponha o Jobe sem firewall.
3. Criar sua primeira questão (passo a passo)
- No curso, vá em Banco de questões → Criar uma nova questão → CodeRunner.
- Question type: escolha a linguagem/modelo, por exemplo:
c_function— o aluno escreve uma função (você fornece os testes que a chamam).c_program/cpp_program— o aluno escreve o programa inteiro commain().python3— função ou programa em Python.
- Question name e Question text (o enunciado).
- Answer (resposta de referência): uma solução correta — serve para o Moodle validar os testes.
- Test cases: para cada teste, informe o código de teste (que chama a solução), a entrada (stdin, se houver) e a saída esperada.
- Marque Use as example em 1–2 testes (aparecem numa tabela "Por exemplo" para o aluno).
- Deixe pelo menos um teste oculto (evita que o aluno "chute" código que só passa nos testes visíveis).
- Marque Validate on save: o Moodle roda sua resposta de referência contra os testes antes de salvar.
Um teste hidden impede soluções que apenas reproduzem as saídas visíveis. É a prática recomendada pelo próprio CodeRunner.
4. Exemplos ligados ao curso
- C — ehPar (bits)
- C — FizzBuzz (controle)
- Python — soma de dígitos
Tipo: c_function · Enunciado: "Escreva int ehPar(unsigned char n) que retorne 1 se n for par, usando um operador bitwise."
Answer (referência):
int ehPar(unsigned char n) {
return (n & 1) == 0;
}
Test cases (código de teste → saída esperada):
| Test code | Esperado | Uso |
|---|---|---|
printf("%d\n", ehPar(4)); | 1 | example |
printf("%d\n", ehPar(7)); | 0 | example |
printf("%d\n", ehPar(0)); | 1 | hidden |
Tipo: c_program · Enunciado: "Imprima de 1 a 15: Fizz (múltiplo de 3), Buzz (de 5), FizzBuzz (de ambos), senão o número."
Answer (referência):
#include <stdio.h>
int main(void) {
for (int i = 1; i <= 15; i++) {
if (i % 15 == 0) printf("FizzBuzz\n");
else if (i % 3 == 0) printf("Fizz\n");
else if (i % 5 == 0) printf("Buzz\n");
else printf("%d\n", i);
}
return 0;
}
Test case: sem entrada; saída esperada = as 15 linhas (1, 2, Fizz, …, FizzBuzz). Deixe-o hidden ou example conforme preferir.
Tipo: python3 (função) · Enunciado: "Escreva somaDigitos(n) que some os dígitos de n."
Answer (referência):
def somaDigitos(n):
s = 0
while n > 0:
s += n % 10
n //= 10
return s
Test cases:
| Test code | Esperado |
|---|---|
print(somaDigitos(1234)) | 10 |
print(somaDigitos(0)) | 0 |
Para questões em C++, use o tipo cpp_program (ou derive do tipo C mudando a linguagem para cpp e incluindo <iostream>). Compilar C/C++ é mais lento que Python — dimensione o Jobe conforme a turma.
5. Montar o questionário (Quiz)
- No curso: Adicionar atividade → Quiz. Defina prazos, tentativas e nota.
- Em Editar questionário → Adicionar → do banco de questões, escolha as questões CodeRunner criadas.
- Comportamento das questões: o CodeRunner sempre roda em modo adaptativo (o botão Check dá feedback imediato). Você pode manter Adaptive/Interactive para prática, com penalidade por tentativa.
- Feedback: aproveite os testes example para o aluno entender o que se espera, e mensagens de feedback por questão.
Habilite o Precheck para dar ao aluno um botão de "conferir" sem penalidade — ótimo para aprendizado, deixando a penalidade só no Check definitivo.
6. Boas práticas
- 1–2 testes
example+ pelo menos 1hiddenpor questão. Validate on savesempre — pega erros nos testes cedo.- Penalidade leve por tentativa incentiva pensar antes de checar, sem punir demais.
- Exporte o banco (formato Moodle XML) para versionar e reutilizar entre turmas/semestres.
- Template customizado quando precisar de setup extra (ex.: incluir headers, limitar tempo). O CodeRunner permite editar o template do tipo de questão.
7. Como isso estende o curso
Uma divisão natural de trabalho:
| Onde | Para quê |
|---|---|
| Moodle + CodeRunner | Treinar linguagem com correção instantânea: bits, operadores, estruturas de controle, tipos, funções. |
| GitHub + CommitPoint | Entregas versionadas dos labs (firmware, Docker, MQTT), avaliadas por commit. |
| Wokwi / ESP32 físico | Rodar o firmware de verdade (hardware, WiFi, MQTT). |
Os desafios D1–D4 dos labs (ex.: ehPar, FizzBuzz, menorDivisor, somaDigitos) viram excelentes questões CodeRunner: o mesmo objetivo de aprendizagem, agora com feedback automático e imediato antes de o aluno levar o conceito para o hardware.
Guia de referência — Moodle + CodeRunner.