= !RunTest = !RunTest es un script simple para ejecutar pruebas de manera automatizada. El código actual se encuentra en source:branches/version2/runtest Una vez instalado, es decir, una vez que se ha copiado el ejecutable a algún directorio del path como /usr/local/bin, se accede al directorio de tests a probar y se ejecuta sin argumentos. Por ahora es necesario que se ejecute en el mismo directorio donde los test se encuentran. == Dependencias == Lo único que necesita es Python3. Instalando el paquete en Ubuntu o Debian, que no sobreescribe al anterior python (sólo añade el ejecutable python3); ya se debe ejecutar sin problemas. == Tipos de tests == Por ahora sólo se encuentran los siguientes: 1. test de script: es un test basado en cualquier tipo de archivo ejecutable. Deben tener permiso de ejecución y puede tener cualquier extensión. Su funcionamiento es el siguiente: * Se ejecuta el script. * Si el script a devuelto 0 se considera que se ha ejecutado correctamente. * No imprime nada. * Sino se considera que ha habido error: * Muestra por pantalla la salida estandar que ha tenido el script. * Muestra por pantalla la salida de error que ha tenido el script. 1. test de python: en este caso no son unos ejecutables, sino un fichero de doctest de python. Si se encuentra errores se considera que ha fallado el test. Su extensión deben ser ''.pytest''. Más sobre los test de python en ficheros en: http://docs.python.org/library/doctest.html#simple-usage-checking-examples-in-a-text-file 1. test de shell: sacada la idea de python sea programado en el mismo RunTest la misma idea para bash. Su extensión deben ser ''.shtest'' y no deben tener permiso de ejecución. Para saber más sobre test de bash:[wiki:RunTest#Test_de_Shell Test de Shell]. 1. pre-test: no son realmente tests pero tiene exactamente el mismo funcionamiento que test de script. Se usan para preparar cosas para el test. Son scripts que se ejecutan antes un test. Tienen el mismo nombre que el test pero se añade la extensión ''.pre''. Deben tener permiso de ejecución. Si fallan el test no se ejecutará. No son necesarios para el test. 1. post-test: iguales que los anteriores pero se ejecutan después del test y tienen extensión ''.post''. No son necesarios para el test. 1. prepare: tampoco son realmente test. Funcionan igual que los tests de script. El fichero debe llamarse prepare o prepare.* (siendo asterisco cualquier extensión). Sino lo encuentra lo obvia. Pueden existir errores y en tal caso no se ejecutará ningún test. Sirve para preparar algo en común para todos los tests. 1. cleanup: hace la función inversa que el prepare. Es un script llamado cleanup o cleanup.*; sino lo encuentra lo obvia. == Cronología == 1. Intenta ejecutar el prepare. Sino lo encuentra continua sin errores. 1. Ejecutar los test por orden alfabético: 1. Busca si tiene pre-test sino lo obvia. Si existe errores en el pre-test el test no se ejecuta. 1. Ejecuta el test sea del tipo que sea. 1. Si encuentra post-test este se ejecuta siempre. Pueden existir errores. 1. Por último, si cleanup es encontrado se ejecuta. == Errores == Cuando cualquier script devuelve algo distinto de 0 se considerá que ha fallado, se lee su salida estándar y su salida de errores para mostrarlo por pantalla. En caso de que devuelva 0 no se mostrará nada, aunque el script haya escrito en la salida estándar o de errores y se considerará que no ha habido errores. == Valor de retorno == El script devuelve el número de test que han fallado. Si no ha habido errores devolverá 0 y no mostrará nada. Si los ha habido entonces mostrará toda la información que el test o el script haya proporcionado, además de dónde ha fallado. == Test == !RunTest también tiene tests que comprueban su funcionamiento. Vamos a la carpeta test del y ejecutamos RunTest allí. También es útil para entender el funcionamiento de RunTest. {{{ alex@Huevo ~/projects/opengnsys $ cd branches/version2/runtest/tests/ alex@Huevo ~/projects/opengnsys/branches/version2/runtest/tests $ ../runtest.py alex@Huevo ~/projects/opengnsys/branches/version2/runtest/tests $ }}} === Test de Shell === La estructura del fichero es bastante simple. Runtest considera un comando la linea que comience por el carácter '$'. Cuando encuentra un comando las lineas siguiente son el resultado que el comando, al ejecutarse, va a mostrar. Se consideran resultado todas las lineas hasta que: * O se encuentre una vacía. * O se encuentre otro comando. * O se llegue al final del fichero. Cualquier otra linea que no cumpla el criterio de comando o resultado será considerado como un comentario, que pueden ser usado para explicar en que consiste el test y que se espera comprobar con él. En el caso que se necesitará tener lineas en blanco en el resultado de un comando sustituirlas por : {{{ $ cat fichero_cualquiera Esto es un fichero que tiene varias líneas vacías. }}} Para ver un ejemplo completo se puede mirar el test14 de los tests del propio Runtest. === Sobre las excepciones === Según la versión de Python las excepciones pueden mostrarse de manera distinta. Actualmente se usa Python 3.2 que es la última estable de Python. Puede que los test de Runtest muestren errores por esa razón pero no es debido a un mal funcionamiento del script.