Dá pra fazer algo mais ou menos inspirado nesses sites de exercícios/desafios/etc.
Basicamente, para um problema, tem-se o formato da entrada e saída. Geralmente algo como "O programa deve ler X linhas, em cada linha tem N números. O programa deve fazer A, B e C e deve imprimir o resultado em tal formato".
Aí vc define as entradas, e as respectivas saídas. Depois, roda o programa para cada entrada e compara o resultado com a respectiva saída.
Aí entram outros problemas, já que muitos desses sites com "correção automática" podem dizer que o resultado está errado se tiver uma linha em branco a mais, um espaço a menos, etc. Tem que ver o quão rígido vc quer ser com esses detalhes.
Certifique-se também que os casos de teste são complicados o suficiente para que a pessoa não acerte por coincidência. Por exemplo, um programa que foi implementando errado, mas que por coincidência/sorte dá o resultado correto.
Essa parte é relativamente simples, o mais trabalhoso vai ser bolar tantos exercícios e casos de teste.