Tema 3: Documentació i test de programes

Objectius i argument

Aquest tema és una mena de relaxament després dels dos temes anteriors que només introdueix el concepte de unit test conjuntament amb les eines de doctests i nose. L'objectiu és doble. Per una cantó cal consolidar els coneixements adquirits en els temes anteriors i per l'altre cal adquirir els coneixements sobre unit testing via doctest que permetin incorporar aquesta eina amb normalitat a partir d'aquest tema.

Resultats d'aprenentatge

Un estudiant que assoleixi aquest tema:

  • Ha de saber documentar programes emprant la sintaxi de doctest.
  • Ha de saber passar els tests i interpretar-ne el resultat
  • Ha de conèixer els principis de "Test driven development" i saber-los posar en pràctica en petits exercicis.

Conceptes clau

Unit test, doctest, nose, test driven development.

Referència principal

Referències complementàries

  • Python para todos (Capítols "Documentación" i "Pruebas", pp. 125 - 142). Cobreix aproximadament els mateixos temes que la referència principal de manera una mica diferent i amb més extensió. Us pot servir de reforç del que s'explica en la referència principal.
  • Els procediments que s'usen per estructurar, planificar i controlar el desenvolupament d'una aplicació informàtica es coneixen com a «metodologies de desenvolupament» i juguen un paper fonamental en la programació. En aquest article de la wikipèdia podeu llegir una introducció a aquest àmbit tant important.

Exercicis obligatoris de teoria

EOT 3.1

Dissenyeu una funció amb un paràmetre enter n que retorni True si n és parell i False en cas que n sigui senar. Documenteu la funció mitjançant doctests.

EOT 3.2

Dissenyeu un programa que llegeixi 100 enters del teclat i calculi quants d'aquests enters són parells. Feu servir la funció de l'apartat anterior per aquest programa.

EOT 3.3

Dissenyeu una funció amb dos paràmetres reals a i b que retorni True si i solament si a és més gran que b i, al mateix temps, el producte de a per b és la unitat. Documenteu la funció mitjançant doctests.

EOT 3.4

Implementeu un programa que demani un nombre enter n i retorni la piràmide conformada amb els seus dígits. Per exemple, donat el nombre 1234, el programa hauria d'escriure:

1
1 2
1 2 3
1 2 3 4

EOT 3.5

Dissenyeu una funció que donada una cadena s i una cadena c retorni la cadena csc. Per exemple, si c="A" i s="BB", la funció retorna "ABBA". Documenteu la funció mitjançant doctests.

EOT 3.6

Dissenyeu la funció centra. Aquesta funció té dos paràmetres w i s. El paràmetre w és un enter que indica l'amplaria d'una pàgina en caràcters. El paràmetre s és un text. La funció ha de tornar una cadena de caràcters tal que, quan s'escriu mostra la paraula s centrada en una línia de w caràcters d'ample. Documenteu la funció mitjançant doctests.

EOT 3.7

Implementeu un programa que mostri un menú amb les següents opcions:

Benvinguts
==========

1. Provar exercici 5
2. Provar exercici 6
S. Sortir

Cada vegada que el programa hagi executat una de les opcions, s'haurà de mostrar el menú d'inici fins que l'usuari introdueixi la cadena 'S'. Useu crides a les funcions implementades anteriorment per executar les opcions del menú.

Exercicis obligatoris de laboratori

EOL 3.1.

La darrera lletra del DNI es pot calcular a través dels seus nombres. Per a obtenir-la, només cal quedar-se amb el mòdul de la divisió del nombre per 23. El mòdul és un nombre entre 0 i 22. La lletra que correspon a cada nombre es mostra en la següent taula:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
T R W A G M Y F P D X B N J Z S Q V H L C K E

Es demana que escriguis un programa que llegeixi per teclat un número de DNI i escrigui per pantalla la lletra que li correspon. Crea una funció que calculi i retorni la lletra del nif. Fes ús de les funcions per escriure el programa i documenta'l el programa de manera adequada tot incloent els doctests pertinents.

Exemple d'execució:

Introdueix DNI: 99999999
Lletra del NIF: R

Utilitza les eines de testeig per comprovar què passa en cas d'introducció de nombres negatius.

EOL 3.2

Escriu un programa tal que donat un nombre enter n introduït per l'usuari, escrigui els n primers enters parells positius. El primer parell positiu és el 0. Utilitza les eines de documentació i testeig de manera adequada i fés que l'execució sigui la que mostren els exemples de funcionament següents.

Exemple 1 d'execució:

escriu un enter: 8
Els 8 primers parells positius són:

0
2
4
6
8
10
12
14

Exemple 2 d'execució:

Escriu un enter: 0
0 nombres a mostrar

Exemple 3 d'execució:

Escriu un enter: -2
Valor incorrecte

E0L 3.3

Escriu el següent programa en un fitxer de nom quadrant.py. Executa'l i complementa'l amb els doctests que s'escaiguin.

from math import ceil # ceil arrodoneix per excés

def calcula_quadrant(a):
return int(ceil(a) % 360) / 90


angle = float(raw_input("Escriu un angle en graus: "))
quadrant = calcula_quadrant(angle)
if quadrant == 0:
print "primer quadrant"
elif quadrant == 1:
print "segon quadrant"
elif quadrant == 2:
print "tercer quadrant"
elif quadrant == 3:
print "quart quadrant"

EOL 3.4

Escriviu un programa que calculi la conversió a billets i monedes d'una quantitat exacta d'euros. Considereu que hi ha bitllets de 500,200,100,50,20,10 i 5 € i monedes de 2 i 1 €. Desenvolupeu-lo seguin l'estratègia del "Test driven development".

Exemple de funcionament:

Introdueix euros: 434

2 bitllets de 200 euros
1 bitllet de 20 euros
1 bitllet de 10 euros
2 monedes de 2 euros

Exercicis optatius

En els següents exercicis, utilitza les eines de documentació i testeig de manera adequada.

EOP 3.1.

Escriu un programa tal que donat un nombre enter, escrigui si aquest és el doble d'un nombre senar.

Exemple 1 de funcionament:

Introdueix nombre: 14
El 14 es el doble del nombre senar 7

Exemple 2 de funcionament:

Introdueix nombre: 12
El 12 no es el doble de cap nombre senar

EOP 3.2.

Escriviu un programa que calculi, donats 10 nombres reals introduïts per l'usuari, els següents estadístics:

  1. El mínim.
  2. La mitja.

EOP 3.3

Dissenyeu una funció que donat un valor enter x i un interval tancat [a,b], escrigui:

  1. El caràcter '+' si x és més petit que el límit inferor de l'interval
  2. El caràcter '=' si x es troba dins de l'interval
  3. El caràcter '-' si x és més gran que el límit superior de l'interval

EOP 3.3

Dissenyeu un programa que demani a l'usuari 10 nombres i comprovi si tots ells són positius.

EOP 3.4

Dissenyeu quatre programes. Cadascún ha de llegir deu enters del teclat i després:

  1. Escriure aquells valors que són múltiples de 2 i de 3
  2. Escriure aquells valors que són múltiples de 2 o de 3
  3. Sumar els múltiples de 2 i de 3 i escriure'n la suma
  4. Escriure quins dels nombres llegits són nombres primers

EOP 3.5

Escriviu un programa que, donats 5 nombres enters, determini quin dels quatre darrers nombres és més proper al primer.

Exemple d'execució:

Escriu enter: 2
Escriu enter: 6
Escriu enter: 4
Escriu enter: 1
Escriu enter: 10

El nombre 1 es el mes proper al 2

EOP 3.6

Escriviu un programa tal que, donats 5 punts en el pla, calculi quin dels quatre darrers punts és més proper al primer.  Recordeu que un punt es representa en el pla amb dues coordenades. El càlcul de la distància entre dos punts el podeu trobar aquí.