La correcció d’exàmens amb doctest¶
La correcció dels exàmens la fem a partir de tests que es poden executar amb doctest però amb un afegit per poder calcular les notes. La nota depèn del nombre de tests passats però alguns tests poden comptar diferent depenent si tracten casos més simples o més complexos.
La correcció és absolutament transparent, quan es publiquen les notes, sempre tindreu disponibles els tests que hem fet servir per la correcció. Llegiu aquest document per entendre no només com es calcula la nota sinó com fer servir els tests de correcció per trobar a on heu fallat i quins casos particulars no resolt correctament la vostra solució.
Els tests d’exemple no serveixen per calcular la nota¶
Els tests d’exemple serveixen per ajudar-te a entendre l’enunciat mitjançant alguns casos concrets. Resoldre un problema no consisteix només a aconseguir que passin els tests d’exemple; cal llegir amb cura l’enunciat, perquè s’avalua que siguis capaç de resoldre tots els casos que s’hi contemplen, apareguin o no als exemples.
És habitual que una solució que passa tots els doctests d’exemple obtingui punts durant la correcció, però això no garanteix que sigui completament correcta. Una solució pot funcionar només per a aquests casos i fallar en altres que també compleixen les condicions de l’enunciat, ja que els exemples no cobreixen necessàriament totes les possibilitats.
Tampoc es pot interpretar el recompte dels resultats de doctest com a una nota perquè doctest compta cada línia que comença amb >>> com un test. Per exemple, si al següent conjunt de tests:
>>> from meu_fitxer import meva_funcio
>>> a = meva_funcio(3, 5)
>>> a
8
doctest compta com a test 3 línes. El primer test (la importació) passarà sempre que existeixin el fitxer i la funció amb els noms indicats. El segon test (l’assignació de la variable a) passarà simplement amb que la funció retorni alguna cosa, sigui correcta o no. L’únic test útil per saber si la funció és correcta és el tercer, que comprova el valor retornat.
Així, una funció que no doni el resultat correcte, podria tenir el següent resultat
1 items had failures:
1 of 3 in test1.txt
3 tests in 1 items.
2 passed and 1 failed.
***Test Failed*** 1 failures.
Encara que el resum digui que la funció ha passat 2 de 3 tests, l’únic test que comprova si el resultat és correcte no ha passat. Per tant no es pot concloure que la funció sigui correcta en dos terceres parts.
A més, durant la correcció, els diferents casos o criteris poden tenir pesos diferents en la nota, tal com s’explica més endavant, mentre que el recompte de doctest tracta tots els exemples de la mateixa manera.
Quan executis els tests d’exemple, no et fixis només en el nombre total d’exemples que passen. Revisa quins fallen, què comproven i si la teva solució satisfà tots els requisits de l’enunciat.
Com interpretar les etiquetes del fitxer de tests de correcció¶
Al fitxer de tests de correcció els tests que compten estan etiquetats amb # doctesttag. A l’exemple anterior podríem tenir, per exemple:
>>> from meu_fitxer import meva_funcio
>>> a = meva_funcio(3, 5)
>>> a # doctesttag: +TAG=1_suma_nombres
8
Quan passeu el doctest sobre un fitxer de test de correcció amb etiquetes, doctest les ignora i, per tant, tindreu totals que inclouran tests que no compten. És per això que, si voleu trobar a on heu fallat, heu de revisar els resultats de doctest per buscar quins són els tests etiquetats que no passen.
Com interpretar el càlcul de la nota a partir de les etiquetes¶
A la retroacció de l’examen a Atenea podeu trobar un fitxer amb els resultats que hem obtingut passant els tests de correcció amb les vostres funcions. Al final d’aquest fitxer, hi ha un resum de les puntuacions parcials a partir de les que es calcula la vostra nota final.
Les etiquetes no només indiquen els tests que compten per la nota sinó que també serveixen per detallar quants punts s’assignen a diferents casos de cada problema i saber quants s’han obtingut.
Per exemple, amb el següent resultat:
4.22 nota total sobre 10.00.
2.00 nota 1_ops_cadenes sobre 3.33.
0.67 nota 1_ops_cadenes-comprova_return sobre 0.67.
0.67 nota 1_ops_cadenes-op_cute sobre 0.67.
0.00 nota 1_ops_cadenes-op_cutf sobre 0.67.
0.67 nota 1_ops_cadenes-op_dup sobre 0.67.
0.00 nota 1_ops_cadenes-ops_variades sobre 0.67.
2.22 nota 2_incidencies sobre 3.33.
1.11 nota 2_incidencies-tots_iguals sobre 1.11.
0.00 nota 2_incidencies-tots_valors sobre 1.11.
1.11 nota 2_incidencies-uns_i_zeros sobre 1.11.
0.00 nota 3_pneumatics sobre 3.33.
0.00 nota 3_pneumatics-extreu_data sobre 1.67.
0.00 nota 3_pneumatics-extreu_data-amb_un_digit sobre 0.83.
0.00 nota 3_pneumatics-extreu_data-tots_dos_digits sobre 0.83.
0.00 nota 3_pneumatics-mal_ordenat sobre 1.67.
0.00 nota 3_pneumatics-mal_ordenat-bon_ordre sobre 0.56.
0.00 nota 3_pneumatics-mal_ordenat-mal_ordre_any sobre 0.56.
0.00 nota 3_pneumatics-mal_ordenat-mal_ordre_setmana sobre 0.56.
tindriem que hi ha un problema d’operacions amb cadenes que compta 3,33 punts i que puntua per separat cinc aspectes diferents que compten el mateix (0,67). Com que és una funció modificadora que no ha de retornar res, hi ha tests per comprovar si ho fa o no etiquetats com a 1_ops_cadenes-comprova_return. També hi ha tests per comprovar i puntuar per separat les tres operacions explicades a l’enunciat (cute, cutf i dup) amb diferents etiquetes. I, finalment, hi ha tests etiquetats 1_ops_cadenes-ops_variades que comproven combinacions de les tres operacions.
Addicionalment, poden haver-hi penalitzacions a la nota que s’indicaran al final de la retroacció. Al següent exemple, s’aplica una penalització del 20% de la nota als exercicis marcats amb una etiqueta per no haver cridat a una funció com indicava l’enunciat:
Per calcular la nota s'ha aplicat el següent:
Penalització del 20% sobre 2_normalitzacio-2_transforma perquè transforma no crida normalitza.