Automatizando con Tox

Hace unos días me encontré con Tox y realmente me llamó la atención, pero...

¿Qué es Tox?

Tox es un gestor de virtualenvs y una herramienta para realizar tests en linea de comandos. Según su documentación se puede utilizar para:
  • Probar que tu paquete se instala correctamente con diferentes versiones de Python.
  • Ejecutar los tests de tu proyecto en cada uno de los entornos.
  • Integración Continua (CI = Continuous Integration).

No me ha quedado claro, ¿Cual es el objetivo?

El objetivo de tox es automatizar el arte de empaquetado, testeo e instalación de software Python ya sea desde tu consola o desde tu servidor de CI (Integración Continua).

Lo quiero probar, ¿cómo lo instalo?

Es muy fácil, solamente se necesita ejecutar la siguiente instrucción:
pip install tox

Instalado, pero ¿cómo hago una primera prueba?

Se necesita crear un fichero llamado tox.ini que debe estar en el mismo directorio quesetup.py cuyo contenido puede ser algo como:
[tox]
envlist = py26,py27
[testenv]
deps =
    unittest2
    pytest
commands=python bin/test

¿Y ahora qué hago?

Una vez creado el fichero tox.ini solamente será necesario ejecutar:

tox

Será entonces cuando tox comienze a:

  1. empaquetar las fuentes del proyecto en un fichero zip
  2. creará un virtualenv por cada uno de los interpretes especificados, en este caso un virtualenv para Python-2.6 y otro para Python-2.7, cuyos nombres serán py26 y py27 respectivamente.
  3. instalará las dependencias especificadas (en este caso de ejemplo,unittest2 y pytest).
  4. por último se ejecutarán los comandos especificados, en nuestro ejemplo solamente uno, python bin/test.
Importante: los intérpretes de Python deben estar previamente instalados en el sistema.tox no instala ningún intérprete de Python y en caso de no encontrar alguno de los especificados, informará de ello mostrando un error en linea de comandos.

Si ejecutamos tox por segunda vez podremos comprobar que la ejecución durará mucho menos puesto que no necesita resolver de nuevo las dependencias.

¿Y si sólo quiero ejecutar los tests en uno de los intérpretes?

Bastaría con ejecutar la siguiente instrucción:
tox -e py27

¿Dónde se almacena el resultado de la ejecución de tox?

tox crea un directorio oculto llamado .tox que tiene la siguiente estructura:
.tox
├── dist
├── _download
├── log
└── py27
    ├── bin
    ├── include
    ├── lib
    └── log
  • dist: directorio donde se almacenan las fuentes del proyecto comprimidas en formato zip.
  • _download: directorio de descarga de todas las dependencias de Python.
  • log: directorio donde se almacenan los ficheros de log de la ejecución.
  • py27: directorio del virtualenv creado para instalar el proyecto utilizando python2.7.

... y eso es todo amig@s! Podéis aprender más acerca de tox consultando la documentación oficial en http://tox.readthedocs.org

Un saludo!