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, sempre tindreu disponibles els tests que fem servir per corregir. 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

Això succeeix perquè no tots els tests de l’exemple compten per la correcció. Per exemple, si tenim el següent doctest

>>> from meu_fitxer import meva_funcio

>>> a = meva_funcio(3, 5)
>>> a
8

doctest compta com a test tot el que comença amb >>>, en aquest cas, 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 rellevant per la nota seria el tercer, que és el que comprova si el resultat és correcte.

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.

que no es pot interpretar com que, passant dos de tres tests, la nota és un 6,66, perquè l’únic test que comptaria no l’ha passat i per tant seria un 0. Per això, mentre feu els exercicis o els exàmens heu de mirar el detall de quins tests falla la vostra funció, no només mirar els resultats finals.

Dit això, és habitual que, si es passen tots els tests d’example, la nota no sigui baixa. Però teniu en compte sempre que són exemples i potser que no cobreixin tots els casos de l’enunciat que és el que heu de resoldre. Algunes solucions dels estudiants són massa específiques, només funcionen amb els exemples i fallen quan s’apliquen a dades diferents.

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.