Usted está aquí: Inicio Artes y oficios Computación libre Tutoriales y técnicas Diseño de software mediante pruebas en Python

Diseño de software mediante pruebas en Python

Las pruebas de software sirven para documentar lo que un paquete debe de hacer y lo que no. También sirven para ejemplificar lo que se puede hacer y como utilizar nuestro código. Las pruebas son un vínculo entre programadores, ya que narran nuestras intenciones y las comprueban.

Acerca del diseño de software guiado por pruebas

La técnica de diseño de software guiado por pruebas ("Test-Driven Development", en inglés), según la Wikipedia: "...es una práctica de programación que involucra otras dos prácticas: Escribir las pruebas primero ('Test First Development') y Refactorización ('Refactoring'). Para escribir las pruebas generalmente se utilizan las pruebas unitarias ('unit test', en inglés). En Primer Lugar se escribe una prueba y se verifica que las pruebas fallen, luego se implementa el código que haga que la prueba pase satisfactoriamente y seguidamente se refactoriza el código escrito. El propósito del desarrollo guiado por pruebas es lograr un código limpio que funcione (Del inglés: 'Clean code that works'). La idea es que los requerimientos sean traducidos a pruebas, de este modo, cuando las pruebas pasen se garantizará que los requerimientos se hayan implementado correctamente."

Resumen

En síntesis, el uso de la técnica de diseño de software guiado por pruebas ahorra tiempo a la hora de escribir código de software que sea claro, legible, entendible y de probada calidad.

 

¿Cómo funcionan las pruebas?

Se empieza por la creación de "pruebas", que en realidad son archivos o segmentos de texto que se ubican dentro del paquete que estamos desarrollando, ya sea en archivos separados o dentro de nuestros "módulos" (ver documentación acerca de módulos, de Python 2.7).

Dichas "pruebas" contienen narrativas y ejemplificaciones de cómo es que funciona nuestro paquete. En las pruebas usualmente narramos e ilustramos mediante código python, que aparece escrito como si lo estuvieramos tecleando en vivo a través del interprete de python.

Ejemplo: Digamos que tenemos un objeto llamado 'news1' al cual queremos
le queremos incorporar un nuevo atributo vacío, llamado 'media'. 'news1' es
para nosotros un artículo noticioso dentro de nuestro portal de internet.

Para hacer esto con python, tendríamos que escribir algo como lo siguiente:
    >>> class newsobject(object):
... pass
...
    >>> news1 = newsobject()
>>> news1.__dict__['media'] = None

y con eso, acabamos de escribir nuestra primera prueba. Es decir, si el
código que escribimos arriba es correcto y no produce errores en la consola,
entonces nuestro código pasa la prueba.

Sigamos con el ejemplo, ahora queremos crear una carpeta para incluir foto-
grafías y videos que puedan ser vistas junto con la noticia de 'news1'. Esta
carpeta la importaremos de nuestro paquete llamado 'paquete.medios':

>>> from paquete.medios import medios
>>> news1['media'] = medios.Container()

Ahora subiremos una imagen a nuestra carpeta 'media' y le pediremos que nos
de el código html para llamarle dentro de otras páginas:

>>> from paquete.medios.tests import image_demo
>>> demoimg = medios.Image(id='image_demo.png', file=image_demo, title='Image Demo')
>>> news1['media'][demoimg.id()] = demoimg
>>> news1['media']['image_demo.png'].tag()
'<img src="news1/media/image_demo.png" title="Image Demo" />'

Si todo funciona bien, entonces nuestro código funciona correctamente, es decir:
las imágenes se crean bien, el contenedor acepta contenido nuevo y nuestras
imágenes son capaces de generar trozos de HTML que puede ser correctamente
incluido en nuestras páginas web.


El código que aparece después de los símbolos ">>> ", representa los comandos que la maquinaria de pruebas debe de ejecutar, de tal manera que si nuestro código es correcto, las pruebas son satisfactorias, de lo contrario, aparecerán errores que habremos de resolver en nuestro paquete.

En sí, la esencia de las pruebas es que nos deja poner de manera explícita como queremos que funcione nuestro paquete, pero más importante aún: nos pone en el lugar del usuario.

Dentro de nuestro paquete, tenemos que incluir un módulo llamado tests, el cual puede ser creado de dos formas posibles:

  1. creando un archivo llamado tests.py que incluya las configuraciones de todas las pruebas
  2. creando un directorio llamado tests/ , que tenga su correspondiente archivo __init__.py y que contenga archivos diferentes para las diferentes configuraciones de pruebas

Aquí en el taller, preferimos crear el directorio tests/ y agregarle un archivo para cada conjunto de pruebas que nos interesa.

 

¿Pero, cómo escribo las pruebas?

Diseño de pruebas en el desarrollo de paquetes para Plone 4

El desarrollo de paquetería basado en pruebas es una práctica común dentro de la comunidad de programadores de Plone. Conocer las prácticas comunes, así como las herramientas disponibles en el paquete Products.PloneTestCase pueden ayudarnos a diseñar mejores pruebas para nuestros paquetes.

 

Objetos que pueden ser usados dentro de las pruebas

  • self.folder
  • self.portal

 

Métodos que pueden ser usados dentro de las pruebas

  • self.addProduct(name)
  • self.setRoles(roles, name=default_user)
  • self.setGroup(groups, name=default_user)
  • self.setPermissions(permission, role)
  • self.login(name)
  • self.logout()

 

 

Referencias

  1. "Test, tests, and  more tests" - http://plone.org/documentation/kb/five-zope3-walkthrough/tests

Extracto de un tutorial de tecnologías de Zope 3, en el que se destacan los conceptos básicos acerca de las pruebas para Plone.

archivado en: ,