En el articulo anterior, presentamos la instalación de PHPUNIT, así como las razones para utilizarlo, y ahora ha llegado el momento para ver como escribimos ese primer test
Anteriormente vimos como íbamos a crear una estructura paralela de paquetes/carpetas en la carpeta test, que esta al mismo nivel que la src, y , tambien dijimos que, íbamos a utilizar Eclipse para este ejercicio. Bien, nosotros tenemos esta estructura
Aquí podéis ver la estructura completa del proyecto, junto con la clase para la que vamos a preparar el test, os invito a que os situéis con el ratón sobre dicha clase y utilicemos el botón derecho de ratón
Ahora ya podemos pulsar el botón izquierdo para conseguir esta pantalla
En donde deberemos indicar la clase que deseemos testear, para lo que nos facilita también un buscador. Automáticamente, el rellenara el nombre de la clase de test y el fichero en donde se ubicara, si bien nosotros deberemos indicarle correctamente ca carpeta, y para eso subimos dos niveles y le indicamos la carpeta
../../test/modelos/<nombre_de_la_clase>
Tras esto, se nos crea la clase indicada con los métodos mínimos necesarios. Esto es, para cada método existente en la clase bajo test, se crea un método en esta, anteponiendo la partícula «test», y lo deja como no implementado; a partir de este fuente, iremos creando los métodos de test que deseemos
Los métodos setup() y tearDown()
Estos dos métodos son invocados antes y después de cada test, por lo que son ideales para preparar un entorno de ejecución antes de hacer el test, y para limpiar dicho entorno una vez realizado.
En este ejemplo, vamos a probar un modelo, por lo que necesitaremos una instancia de dicho modelo, para poder hacer la pruebas, y es qui donde podemos crearlo.
Y como para algunos test, necesito un array, también la creo aquí,
En la línea 48, tenemos una llamada al parent que ya nos ha dejado el generador, y que deberemos respetar; a partir de ahí, creamos el objeto Co_usuario con unos datos que hemos definido como constantes
Normalmente, me veréis utilizar constantes definidas, ya que estaré continuamente dando la orden de carga, y luego comprobando el valor…y eso es mucho mas seguro si utilizo constantes…¿verdad?
El otro método (tearDown()), quedamos que se ejecutara cuando termine cada test, con lo que destruimos el objeto, y habremos cerrado la secuencia
Los métodos de test
Para realizar el test, debemos invocar a uno de los métodos del objeto a testear y comprobar si nos devuelve el valor previsto, por ejemplo.
Para realizar esta comprobación, podemos apoyarnos en unos métodos que hemos heredado de TestCase y podéis encontrarlos resumidos aquí
Por ejemplo: uno de los métodos que nos ofrece el modelo es getId(), este método debe devolver el valor del id, i recordad que según cargamos el modelo en la línea 50 su valor debe ser ID
Pues este método funcionará bien si recibimos ese valor, y para comprobarlo podríamos hacer
En efecto, todo estará bien si conseguimos que $this->co_usuarios->getid() nos devuelva self::ID cosa que afirmamos con el assertEquals
Recordad que, según vimos, el método setup() se ejecuta antes de cada test, por lo que el objeto co_usuarios que cargamos allí, lo tendremos disponible en todos los tes…y con los valores iniciales, por lo que si todo funciona bien, el equals se tiene que cumplir
Y, con ese mismo razonamiento, podemos ir escribiendo nuestros test. Solo recordad que las líneas
Hacen que el metodo (la prueba) quede marcada como «no implementada», por lo que los deberemos ir borrando a medida que implementemos las pruebas
Y solo un ejemplo mas como podemos hacer, por ejemplo, las pruebas de «set»?… pues simplemente, cargando un valor distinto con el método bajo prueba y comprobando que lo que nos de ahora el «get» es ese nuevo valor….
¿Sencillo, verdad?, Pues ahora a completar todas y cada una de las pruebas para probar todos los métodos del objeto; y acordaros de hacerlo lo mas exhaustivo que se os ocurra. (valores nulos, vacíos, negativos, positivos, largos, cortos) Aseguraros que cubrís todas las posibilidades de error y de correcto….
Cuando estéis preparados, podéis lanzar la ejecución, utilizando el botón derecho de ratón en el modulo de test
y en la consola de Eclipse, os encontrareis con una información semejante a esta:
En donde vemos un punto por cada método de test que ha funcionado correctamente, ,una «E» para cada uno que haya dado error, o una «I» por cada uno que no este implementado, y al lado el numero de test encontrados y el numero de test realizados
Con un simple vistazo, os podéis hacer rápidamente una idea de como funciona vuestro módulo… Ahora si queréis conseguir información mas detallada, solo tenéis que pasar a la ventana de salida del PHPUnit
Y recibiréis información bastante mas detallada, ya que os indica el nombre del método, el tiempo que ha costado realizar el test, una banda verde si todos han ido bien, y en los que falle, tendréis la información del fallo en la pestaña «Trace failure» y las diferencias entre el valor esperado y el valor recibido, en «Object Diff»
Espero que con esto, os podáis hacer una idea mas clara de las ventajas que aporta escribir test para nuestro desarrollo, y de lo simple que puede ser, asegurarnos de que nuestro módulo se comporta según lo previsto
Os adjunto un enlace al repositorio por si os lo queréis bajar para jugar un poco con él.