Anuncios

Bienvenidos sean a este post, en el post anterior vimos como es la antatomia de un testeo pero hoy nos centraremos en el test de unidad.

Anuncios

En este post veremos como se hace un test de unidad sin seguir ninguna teoria o escuela en particular pero es una forma mas practica de utilizarlo, estas toman el nombre en base a su forma de trabajar dado que lo hacen sobre pequeñas unidades de codigo, vamos a ver un pequeño ejemplo para entender el concepto:

def get_datos_limpios(fuente):
    datos = cargar_datos(fuente)
    datos_limpios = limpiar_datos(datos)
    return datos_limpios
Anuncios

Esta funcion sera para obtener unos datos limpios de una fuente X, en este caso obtenemos los datos por medio de cargar_datos desde la fuente que informamos, una vez obtenidos procederemos a limpiarlos, es decir eliminar la informacion innecesaria en ellos, por ultimo devolvemos estos datos sin la informacion innecesaria, con esta funcion creada como hacemos para testearla?

Anuncios

Una de las formas es asegurarnos que cargar_datos sea llamado una sola vez con fuente como su unico argumento, lo siguiente es verificar que limpiar_datos se ejecute una sola vez con los valores obtenidos anteriormente y por ultimo asegurarnos que el dato obtenido anteriormente sea devuelto por la funcion, para hacer todo esto necesitamos configurar la fuente y correr este codigo pero tenemos un inconveniente con la regla de oro de testeo de unidad:

Todo aquello que cruce los limites de la aplicacion debe ser simulado

El Tinchicus
Anuncios

Para los test no queremos hablar con una fuente de datos real ni tampoco ejecutar funciones reales si estas se comunican con algo que no esta contenido en nuestra aplicacion, algunos ejemplos serian:

  • Base de datos
  • Un servicio de busqueda
  • Una API externa
  • Un archivo
Anuncios
Anuncios

Esto es necesario para que trabaje como un escudo asi podemos correr siempre nuestros test sin ningun riesgo de destruir algo de la fuente de datos reales, otra razon tambien es que puede ser dificultoso reproducir toda la arquitectura en su box, dado que necesitamos configurar bases de datos, APIs, servicios, archivos y directorios y esto no solamente sera dificultoso, nos consumira mucho y en la mayoria de los casos no sera posible crear todo esto, por lo tanto debemos simular todo esto de alguna manera, es decir que cualquier desarrollador puede correr los tests de unidad sin la necesidad de todo el sistema configurado en su box.

Anuncios
Anuncios

Un enfoque diferente es simular entidades sin el uso de objetos falsos pero en su lugar usando objetos de test para propositos especiales, por ejemplo si necesitamos una base de datos en lugar de falsificar todas las funciones, metodos que hablan con la base de datos y tambien programar los objetos falsos para que devuelvan lo que harian los reales, en su lugar seria preferible crear una base de datos de prueba, configurar las tablas y datos que se necesitan y luego parchear las configuraciones de conexion asi los test ejecutan codigo real pero contra las base de prueba sin causar ningun daño, otra buena opcion para estos casos son las bases de datos en memoria que vimos en este post, pero algunas veces esto tampoco se puede hacer y debemos recurrir a los falsos objetos, veamos algunos.

Anuncios

Objetos Mock y parcheos

En python estos objetos falsos son llamados mock, hasta la version 3.3 era una libreria externa de terceros y se debia instalar via pip pero a partir de esta version se convirtio en una libreria estandar y se incluye en el modulo unittest. El acto de reemplazar un objeto o una funcion con un mock se llama parcheo (patching), dado que la libreria mock nos provee la herramienta patch la cual puede trabajar como una funcion o un decorador o incluso como un manejador de contexto, que puede ser usado para simular las cosas por fuera, una vez que hayas reemplazado todo con los mocks adecuados podras pasar a la segunda fase del test y correr el codigo que estas verificando, despues de la ejecucion seras capaz de chequear estos mocks para verificar que el codigo se ejecuto correctamente.

Anuncios

Assertion

La fase de verificacion se hace a traves del uso de afirmaciones (Assertion), una afirmacion es una funcion o metodo que se puede usar para verificar la igualdad entre objetos, asi como otras condiciones y cuando una condicion no se cumple la afirmacion llamara a una excepcion que hara fallar al test, dentro de la documentacion del modulo unittest se puede encontrar una lista de afirmaciones (assertions) sin embargo cuando usemos a pytest terminaremos utilizando al mas generico como es assert el cual nos facilita las cosas.

Anuncios

En resumen, hoy hemos visto una introduccion al test de unidad, hemos hablado sobre como debemos pensar para poder trabajar, como podemos usar tanto un entorno simulado como objetos falsos derivados de una libreria de un modulo creado para ello y una funcion que utilizaremos para la fase de verificacion, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50