Integración continua en Unity. Pruebas en el lado del cliente – Parte 1



Qué vamos a ver

Las pruebas son una parte importante, y a veces olvidada, del desarrollo de videojuegos. Es cierto que es tedioso estar acordándonos continuamente de ejecutar las pruebas y de mantenerlas, y a veces, cuando nos damos cuenta de su utilidad o queremos acometerlas, ya es demasiado tarde para ello.

La integración continua propone y permite la automatización de procesos para así encontrar fallos lo antes posible.

En este post veremos cómo ejecutar pruebas unitarias (las llamadas en Unity “Edit Mode Tests”) cada vez que realicemos un commit con Sourcetree. En caso de pasar las pruebas el commit se realizará de forma correcta, y en caso contrario cancelará el commit con un mensaje.


Programas necesarios

Los programas que hemos utilizado y en los que se ha comprobado la correcta utilización son los siguientes:

Bitbucket Cloud

  • Windows 8.1:

Sourcetree 1.9.13.7
Unity 5.5.1p2, Unity 2017.4.3f1, Unity 2018.2.0b4

  • macOS High Sierra 10.13.4:

Sourcetree 2.7.3
Unity 2017.4.3f1

Entrando en materia

Lo primero que tenemos que hacer es crear nuestras pruebas unitarias si aún no tenemos ninguna. Aunque en otras versiones de Unity es ligeramente distinta la creación, tomaremos de referencia la versión de Unity 2017.4.3f1.

Nos vamos a “Window” -> “Test Runner” y pulsamos en “Create EditMode Test”.

Esto nos creará un script modelo en la carpeta “Editor” que nosotros modificamos ligeramente para  que genere un fallo o no a nuestro gusto (esto simplemente es para hacer las pruebas), dejándolo tal que así:

Con esto listo y nuestro repositorio de bitbucket configurado en sourcetree, creamos dentro de la ruta de nuestro proyecto “.git/hooks” un archivo llamado “pre-commit”. *
* Nota 1: La carpeta “.git” está oculta por lo que tendrás que mostrarlas a través de la opción “Elementos ocultos” de Windows o, por ejemplo, con la aplicación Funter en macOS.
** Nota 2: Para que el hook funcione de forma correcta en macOS tendrás que darle permisos de ejecución al archivo con el comando “chmod +x filename”.

Y empezamos a crear nuestro hook el cual se ejecutará siempre antes de realizarse el commit.

En primer lugar definimos las rutas de carpetas y ficheros que vamos a necesitar en la ejecución, y una función de ayuda que más adelante usaremos para saber si estamos en un sistema operativo Windows o no.

A continuación lanzamos las pruebas y recogeremos el valor de esta ejecución.

Según el valor retornado, tenemos los siguientes casos:

  • 0 – La ejecución ha sido correcta y todas las pruebas han pasado correctamente.
  • 1 – Ha habido un fallo en la ejecución. Esto suele pasar, por ejemplo, si se tiene el proyecto abierto con Unity y por lo tanto está bloqueado (más adelante veremos cómo solucionar esto).
  • 2 – Al menos una de las pruebas ha fallado en su ejecución.
  • 3 – Error en la ejecución del comando. Probablemente el proyecto no compila o se le ha pasado una ruta errónea.
  • >3 – Otros errores.

Como hemos dicho antes, si devuelve la ejecución con un 1, lo más probable es que tengamos abierto el proyecto con Unity y por lo tanto bloqueado mediante el archivo “UnityLock”, así que creamos una copia del proyecto * en la ruta definida en la variable “COPY_FOLDER” y volvemos a lanzar la comprobación de los test y a recoger el valor.
* Nota 1: Como podemos observar la copia de los directorios difiere según el sistema operativo.

Después de esto mostramos el mensaje correspondiente en función del retorno.

Y limpiamos los archivos auxiliares (en caso de que se hayan generado).

Por último terminamos la ejecución con el valor de retorno.

Para SourceTree salir con un valor de ejecución distinto a cero ocasionará que se cancele el commit que se iba a realizar.

Por lo tanto si ha fallado alguna de las pruebas o ha ocurrido algún error durante la ejecución se cancelará el commit.

Si se da el caso, lo más probable es que tengamos que ir a Unity porque habremos roto algo en el código y/o tengamos que actualizar alguna prueba (u otros posibles fallos).

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *