13 dic. 2012

Probar código con doctest

Doctest es un framework que viene en Python el cual permite desarrollar aplicaciones utilizando TDD (Desarrollo guiado por pruebas).

El TDD exige escribir las pruebas primero y la refactorización del código para llegar al resultado deseado.

En este caso se usará doctest el cual permite realizar pruebas según la documentación que se tenga escrita en el código. Significa que es necesario tener una documentación clara para cada función antes de desarrollarla, de esta forma se tiene claro los casos de funcionamiento correcto de la función y los casos en los cuales puede fallar.

El código de ejemplo es el de una función que permite calcular la raíz cuadrada de un número.

A continuación el código:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

#Se importa el módulo math para calcular la raiz cuadrada.

import math



#Función raiz cuadrada.

def RaizCuadrada(a):

    """

    >>> RaizCuadrada(4)

    2.0

    >>> RaizCuadrada(9)

    3.0

    >>> RaizCuadrada(25)

    5.0

    >>> RaizCuadrada(0)

    0.0

    >>> RaizCuadrada(-1)

    Traceback (most recent call last):

        ...

    ValueError: a debe ser >= 0

    """

    #Si a es mayor o igual a cero se calcula la raiz cuadrada

    if a >= 0:

        return math.sqrt(a)

    #Si es menor a cero se genera una excepción donde se informa que a debe ser mayor o igual a cero.

    else:

        raise ValueError("a debe ser >= 0")

Como se muestra se genera en la documentación una serie de casos de ejecución de la función donde debe devolver un valor correcto y si se pasa un valor que no puede ser calculado devuelve la excepción.

Para realizar la prueba se ejecuta el código realizando una llamada al módulo doctest y modo verbose:
python -m doctest -v prueba-raizcuadrada.py

El resultado es el siguiente:

Trying:

    RaizCuadrada(4)

Expecting:

    2.0

ok

Trying:

    RaizCuadrada(9)

Expecting:

    3.0

ok

Trying:

    RaizCuadrada(25)

Expecting:

    5.0

ok

Trying:

    RaizCuadrada(0)

Expecting:

    0.0

ok

Trying:

    RaizCuadrada(-1)

Expecting:

    Traceback (most recent call last):

        ...

    ValueError: a debe ser >= 0

ok

1 items had no tests:

    prueba-raizcuadrada

1 items passed all tests:

   5 tests in prueba-raizcuadrada.RaizCuadrada

5 tests in 2 items.

5 passed and 0 failed.

Test passed.

Como se muestra todos los casos pasaron el test.
Pueden revisar la siguiente documentación y tutoriales:
En otro artículo se explicará como separar los diferentes casos en un archivo de texto y el programa en un script aparte.


Publicar un comentario en la entrada

AddThis