Ejecutar una prueba de doctest con un contenedor Docker.
Posted on dom 27 marzo 2016 in Tutorial Python • 4 min read
Ahora se mostrará como usar un contenedor de Docker para hacer pruebas doctest, este artículo se basa en un post anterior del blog llamado Separar código de pruebas de la documentación (doctest,2da parte).
Los artículos anteriores sobre docker son:
1. Instalar Docker en Debian Jessie
-
Iniciando Django con docker usando docker-compose con postgresql como microservicio.
-
Crear un entorno de Integración y Despligue continue con Docker para node.js.
Se tendrán 3 archivos en un directorio que se llamará pruebas-doctest
con lo siguiente:
pruebas-doctest
├── Dockerfile
├── raizcuadrada.py
└── raizcuadrada.txt
El archivo Dockerfile
contendrá lo siguiente:
FROM python:3.4
MAINTAINER Ernesto Crespo
WORKDIR /app
COPY . /app
Se usará python 3.4, el mantenedor es Ernesto Crespo, el directorio de trabajo será app y se copiará todo lo que está en el directorio al directorio de trabajo.
Se tiene el archivo raizcuadrada.py
con lo siguiente:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Se importa el módulo math para calcular la raiz cuadrada.
"""
import math
#Función raiz cuadrada.
def Raiz(a):
"""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")
if __name__ == '__main__':
#Se importa el módulo doctest
import doctest
#Se realiza la prueba al archivo raizcuadra.txt
doctest.testfile("raizcuadrada.txt")
Y el último de los archivos es raizcuadrada.txt
el cual tendrá las pruebas de doctest:
Modulo raiz cuadrada
=====================
Usando 'raizcuadrada'
------------------------------
Primero se importa la función:
>>> from raizcuadrada import Raiz
Ejemplos de calculo de raiz cuadrada:
>>> Raiz(4)
2.0
>>> Raiz(9)
3.0
>>> Raiz(25)
5.0
>>> Raiz(0)
0.0
>>> Raiz(16)
5.0
>>> Raiz(-1)
Traceback (most recent call last):
...
ValueError: a debe ser >= 0
El archivo tiene un error intencional en el cálculo de la raíz cuadrada de 16 que debe dar 4 y se coloco que da 5.
Ahora se construye la imagen con nombre pruebas-doctest
:
docker build -t pruebas-doctest .
Sending build context to Docker daemon 5.12 kB
Step 1 : FROM python:3.4
3.4: Pulling from library/python
fdd5d7827f33: Downloading 11.35 MB
fdd5d7827f33: Pull complete
a3ed95caeb02: Pull complete
0f35d0fe50cc: Pull complete
7b40647e93b7: Pull complete
ce5207842c4c: Pull complete
da7994e536a7: Pull complete
09482b8dda8a: Pull complete
5ba79222c836: Pull complete
Digest: sha256:8bcba46a3dbf4803c80074c0e543d98eeb3cb4f9cc35ff52f88c53cc0a1c30c3
Status: Downloaded newer image for python:3.4
---> c40d327867e9
Step 2 : MAINTAINER Ernesto Crespo
---> Running in de81df2565f3
---> 3b1aced33b5e
Removing intermediate container de81df2565f3
Step 3 : WORKDIR /app
---> Running in f1901c2490d7
---> 7dd09842cf61
Removing intermediate container f1901c2490d7
Step 4 : COPY . /app
---> 788ad6d153ed
Removing intermediate container b32ba65862d9
Successfully built 788ad6d153ed
Ahora se ejecuta la prueba pasando python -m doctest -v raizcuadrada.txt
:
docker run pruebas-doctest python -m doctest -v raizcuadrada.txt
Trying:
from raizcuadrada import Raiz
Expecting nothing
ok
Trying:
Raiz(4)
Expecting:
2.0
ok
Trying:
Raiz(9)
Expecting:
3.0
ok
Trying:
Raiz(25)
Expecting:
5.0
ok
Trying:
Raiz(0)
Expecting:
0.0
ok
Trying:
Raiz(16)
Expecting:
5.0
**********************************************************************
File "raizcuadrada.txt", line 23, in raizcuadrada.txt
Failed example:
Raiz(16)
Expected:
5.0
Got:
4.0
Trying:
Raiz(-1)
Expecting:
Traceback (most recent call last):
...
ValueError: a debe ser >= 0
ok
**********************************************************************
1 items had failures:
1 of 7 in raizcuadrada.txt
7 tests in 1 items.
6 passed and 1 failed.
***Test Failed*** 1 failures.
El resultado es que se logró pasar 6 pruebas y una no paso, se arregla el valor que debe devolver en el archivo raizcuadrada.txt
y se vuelve a ejecutar la construcción y ejecución :
docker build -t pruebas-doctest .
Sending build context to Docker daemon 4.608 kB
Step 1 : FROM python:3.4
---> c40d327867e9
Step 2 : MAINTAINER Ernesto Crespo
---> Using cache
---> 3b1aced33b5e
Step 3 : WORKDIR /app
---> Using cache
---> 7dd09842cf61
Step 4 : COPY . /app
---> 47a9b0467413
Removing intermediate container 8a375d3abc0c
Successfully built 47a9b0467413
docker run pruebas-doctest python -m doctest -v raizcuadrada.txt
Trying:
from raizcuadrada import Raiz
Expecting nothing
ok
Trying:
Raiz(4)
Expecting:
2.0
ok
Trying:
Raiz(9)
Expecting:
3.0
ok
Trying:
Raiz(25)
Expecting:
5.0
ok
Trying:
Raiz(0)
Expecting:
0.0
ok
Trying:
Raiz(16)
Expecting:
4.0
ok
Trying:
Raiz(-1)
Expecting:
Traceback (most recent call last):
...
ValueError: a debe ser >= 0
ok
1 items passed all tests:
7 tests in raizcuadrada.txt
7 tests in 1 items.
7 passed and 0 failed.
Test passed.
Ahora si se logró pasar todas las pruebas de doctest.
¡Haz tu donativo! Si te gustó el artículo puedes realizar un donativo con Bitcoin (BTC) usando la billetera digital de tu preferencia a la siguiente dirección: 17MtNybhdkA9GV3UNS6BTwPcuhjXoPrSzV
O Escaneando el código QR desde la billetera: