Unit Tests en Python

De Cacauet Wiki
Salta a la navegació Salta a la cerca

Utilitzarem la llibreria unittest de Python per realitzar alguns tests sobre un Web Services, en concret el Web Services: exemple Escacs.

Llegeix aquests articles prèviament.


Introducció

Realitzar uns tests sobre un software és una tasca molt important però molt repetitiva i tediosa, i que pren molt temps. Una bona manera d'estalviar temps de desenvolupament és automatitzar el procés de testeig amb un script que ho faci per nosaltres.

També resulta crucial cada cop que es fa alguna modificació d'algun software que està en producció i que abans d'actualitzar-ho hem d'assegurar la seva funcionalitat a fons.

Bàsicament es tracta de provar certes funcions crítiques donant una entrada simulada, i comprovar després la resposta si és l'esperada.

En aquest article primer veurem com testejar una funció simple i després ho complicarem una mica més amb un Web Service que cal engegar abans de fer els tests.

Referències:


Test bàsic

Utilitzarem la llibereia Python unittest module. Sol fer-se un arxiu a part del nostre mòdul a comprovar, on crearem els tests en una classe derivada de TestCase.

Si agafem l'exemple dels escacs, podriem comprovar que la funció crea_partida genera una partida correctament amb totes les peces. En aquest exemple comprovem només 1 fitxa, el peó blanc de la 1a columna.

# arixu escacs_tests.py
import unittest
import cherrypy
import escacs
import httplib, urllib
import json

class TestsInterns(unittest.TestCase):
	"""
	Test de la funcio interna "crea_partida"
	"""
	def test_crea_partida(self):
		# Creem instancia del WS
		e = escacs.Escacs()
		partida = e.crea_partida()
		self.assertNotEqual( partida, None )
		fitxa1 = {"color":"b","figura":"peo","fila":2,"col":1}
		# comprovem que la fitxa estigui a l'array de figures
		self.assertIn( fitxa1, partida["figures"] )

if __name__ == "__main__":
	unittest.main()

Fixeu-vos en diverses coses:

  • Heredem de la classe TestCase
  • Cada mètode que realitzem serà un test independent. S'executaran tots els mètodes que fem.
  • En aquest test hi ha 2 comprovacions (asserts):
    • self.assertNotEqual(partida,None) : comprovem que ens retorni alguna cosa (que no sigui None)
    • self.assertNotEqual(partida,None) : comprovem que la fitxa1 estigui dins de l'array de figures. Una partida acabada d'iniciar hauria de tenir un peó blanc a la fila 2, columna 1.
  • Òbviament caldria comprovar la resta de figures.

Ara, si executem obtindrem:

(env)enric@tao:~/dev/cherry$ python escacs_tests.py 
.
----------------------------------------------------------------------
Ran 1 test in 0.003s

OK
(env)enric@tao:~/dev/cherry$ 


Testejant serveis web

Tenim entre mans un servei web, i hem pogut comprovar una funció del nostre servidor, però si ens cal comprovar les requests/responses d'un sistema REST, la cosa se'ns complica.