Unity Test Tools

En este post aprenderemos los conceptos básicos de cómo utilizar los assets de testeo de Unity. Una de las partes positivas de esta herramienta es que nos permite realizar los tests sin necesidad de tener un profundo conocimiento del código. Podéis encontrar Unity Test Tools en el assets store (https://www.assetstore.unity3d.com/en/#!/content/13802) e integrarlo en cualquier proyecto existente de Unity. Desde Unity tendréis que ir a Window->Asset Store.

utt

Se os abrirá una ventana con el Asset Store de Unity. En el buscador tendréis que poner el nombre de la herramienta «Unity Test Tools» y una vez dentro de él haced clic en el botón «Download» o «Import» si ya lo tenéis descargado. A continuación se os abrirá otra ventana para importar el asset a vuestro proyecto.

utt2

Ahora tendremos una carpeta en Project con el nombre UnityTestTools. Esta carpeta deberá ser eliminada, así como los componentes de este asset empleados, antes de exportar nuestro juego, ya que su función es únicamente de testeo. No obstante, según la documentación todo lo relacionado con el asset es desactivado cuando compilamos el juego. En dicha carpeta tendremos un enlace con toda la documentación de esta herramienta.

El primer punto que trataremos será el Assertion component. Este componente nos permitirá asegurar si algo es verdadero. Una vez importado el asset Unity Test Tools, este componente se podrá añadir a cualquier objeto en Add Components->Scripts->UnityTest->Assertion Component. Una vez configurado nos mostrará un error en caso de que la afirmación que hemos puesto no se cumpliese. Para facilitar el saber cuándo se produce dicho error podríamos activar Error Pause en Console. Esta opción pausará el juego en el momento en el que aparezca un error en la consola. Por ejemplo, imaginad que queremos asegurar que nuestro personaje se mantendrá siempre en una posición en el eje Y inferior a un valor igual a 4. En la siguiente imagen podéis observar la configuración pertinente para realizar la comprobación. Compararemos una variable tipo float en cada ciclo de Update con una frecuencia de 1 segundo. Dicha variable hará referencia al componente Transform.position.y del objeto Player y comprobará si es menor que un valor constante igual a 4.

assertion_component_1

Si ahora corremos nuestro juego y superamos esa altura con nuestro personaje, el juego se pausará y la consola mostrará un error advirtiendo de que el valor de Player.Transform.position.y ha superado el valor constante de 4 que habíamos marcado como límite.

assertion_component_2

En la documentación viene detallado el uso de Assertion Component (https://bitbucket.org/Unity-Technologies/unitytesttools/wiki/AssertionComponent) y en internet podréis encontrar más información todavía. Este complemento nos permite realizar pruebas sin necesidad de introducir código nuevo dentro de nuestros scripts que posteriormente tendríamos que eliminar.

El siguiente apartado será Integration Test. Este tipo de test comprobará que los objetos interaccionan entre ellos del modo que nosotros esperamos. Lo primero que debemos comprender es que los Integration Tests no se encontrarán en las Scenes de nuestro juego, sino que tendrán su propio «mundo». Cada Integration Test tendrá su propia Scene. Una vez creada una nueva Scene iremos al menú Unity Test Tools->Integration Test Runner (este menú se creará al importar el asset Unity Test Tools). Aparecerá una ventana nueva llamada Integration Tes que podremos integrar al igual que las ventanas Hierarchy, Inspector, Project, etc.

integration_test_runner

Crearemos un nuevo test con el botón Create. Una vez creado tendremos varias opciones. Seleccionaremos un nombre, las plataformas (windows, android, etc) incluídas en el test, cuanto tiempo debe durar (si dura más se considerará fallido), si debe ser ignorado, si deben ser ejecutadas todas las assertions o si habrá alguna excepción. Además se crearán dos objetos: un test runner y otro con el nombre de nuestro test (donde editamos las opciones anteriormente mencionadas).

integration_test_runner_2

Ahora crearemos dentro de nuestro test una esfera en la posición (0, 1.5, 0) y le añadiremos un rigidbody al que le cambiaremos el valor Drag a 20. Crearemos también un plano a partir de un cubo en la posición (0, 0, 0) al que le marcaremos la opción Is Trigger. Procederemos a continuación con un test muy sencillo. Si en un intervalo de tiempo de 3 segundos la esfera no impacta con el plano se superará el test, en caso contrario se considerará como fallido. Para ello crearemos dos Call Testing mediante Add Componet->Scripts->UnityTest->Call Testing. En el primero pondremos la condición para que el test sea un éxito. Le pondremos un valor de 3 segudos y que se dé como válido el test al cumplirse ese número de segundos (Call after seconds). En el segundo pondremos que si algo atraviesa (On trigger enter) el plano se de el test por fallido. Con estas condiciones si ejecutamos el test con clic derecho->Run se superará con éxito y pondrá un signo verde de aprobación al lado de su nombre.

test_pass

Si ahora modificamos el valor de Drag a 0 y ejecutamos el test, podremos observar que ahora el resultado será fallido y tendremos una marca roja en lugar de la verde para indicar que se ha fallado ese test.

test_fail

Existe la opción de realizar los test mediante un script que añadimos en el objeto del test. Esto nos da la posibilidad de realizar test realmente complejos de ser necesarios. Si en el script incluímos la línea IntegrationTest.Pass(gameObject); se dará el test por válido, mientras que con IntegrationTest.Pass(gameObject); se dará por fallido.

Crearemos otro integration test de ejemplo y dentro de él crearemos dos esferas a las que le añadiremos el componente Rigidbody. Si os fijáis, cuando tengáis seleccionado uno de los tests el resto de ellos no serán visibles en la escena. Debajo de la primera esfera crearemos un cubo en el que marcaremos la opción Is Trigger y le añadiremos el siguiente script llamado PowerUp:

using UnityEngine;
using System.Collections;

public class PowerUp : MonoBehaviour {

void OnTriggerEnter (Collider other)
{
var scale = other.transform.localScale;

other.transform.localScale = scale * 2;
}
}

Este script lo que hará es duplicar el tamaño de la primera esfera cuando atraviese al cubo. Ahora le añadiremos al cubo script de Assertion Component que comparará variables tipo float cuando la primera esfera entre en el cubo y se asegurará de si la componente Transform.localScale.x de esa esfera es mayor que la misma componente de la segunda esfera. Puesto que el script PowerUp duplicará el tamaño de la primera esfera cuando atraviese al cubo, el Assertion Component se debería cumplir.

assertion_integration_test_1

Iremos ahora al objeto del test y marcaremos la opción Succeed on assertion. De este modo el test será superado con éxito si se cumplen todas las assertions, mientras que será considerado fallido en el otro caso. Si ahora corremos el segundo test debería dar un resultado exitoso. Si le damos al botón Run All de la ventana de Integration Tes se ejecutarán todos los test que tengamos uno detrás de otro.

assertion_integration_test_2

Podemos incluír tantos test como queramos. Todos ellos se ejecutarán de manera independiente dando los resultados correspondientes de cada uno de ellos. Podéis comprobar los ejemplos incluidos en el asset Unity Test Tools que hay en la carpeta Examples.

El último apartado que trataremos será Unit Test. Este será como un Integration Test pero para probar nuestro código. Empezaremos yendo a Unity Test Tools->Unit Test Runner. Se nos abrirá la ventana Unit Test que podremos poner donde mejor consideremos al igual que hicimos con la ventana Integration Tes. Dentro de esta ventana existen diversos ejemplos ya hechos. Para crear nuestros propios Unit Tests necesitamos aprender NUnit. En la documentación existe más información al respecto (https://bitbucket.org/Unity-Technologies/unitytesttools/wiki/UnitTestsRunner).

unit_test

Os mostraré un ejemplo muy simple a continuación. Crearemos una carpeta a la que llamaremos Editor y dentro un Script al que llamaremos SampleTest. En dicho script borraremos todo y escribiremos el siguiente código:

using System;
using NUnit.Framework;

public class SampleTest
{
[Test]
public void SimpleAddition()
{
Assert.That (2 + 2 == 4);
}
}

Básicamente este test comprobará que 2 + 2 = 4. Obviamente será superado con éxito, pero lo comprobaremos. Creamos una escena nueva. En nuestra ventana Unit Tests tendremos ahora el que acabamos de crear, SampleTest. Si lo ejecutamos nos dirá que ha pasado favorablemente la prueba.

unit_test_2

Con esto acaban las nociones básicas del uso del asset Unity Test Tools, una herramienta muy útil para realizar cualquier tipo de prueba a nuestro juego de una manera más visual sin entrar tanto en el propio código. Recordad recurrir a la documentación para más información (https://bitbucket.org/Unity-Technologies/unitytesttools/wiki/Home).

Un comentario en “Unity Test Tools

Deja un comentario