La semana pasada se ha visto una pequeña introducción a la creación de pruebas automáticas en un paquete de R. Esta semana vamos a ver unos conceptos para crear pruebas avanzadas con testthat cómo son las funciones setup y teardown. En esta entrada no hablaremos de mocks ya que es un tema del que hemos hablado anteriormente en el blog. Si necesitamos probar servicios externos que pueden cambiar con el tiempo, como los datos de un servicio web, el uso de mocks es la opción a tomar.
Esta entrada forma parte de la serie “Creación de paquetes en R” cuyo código se puede encontrar en el repositorio y consta de las siguientes ocho entradas:
- Creación de paquetes en R
- El archivo DESCRIPTION
- Pruebas automáticas con testthat
- Pruebas avanzadas con testthat
- Medir la cobertura de las automáticas unitarias
- Documentación de los paquetes
- Creación de vignette
- Validación y distribución de los paquetes
Inicialización de entornos con setup()
y teardown()
.
En algunas ocasiones puede ser que necesitemos preparar el entorno antes de ejecutar una prueba, por ejemplo, si necesitamos crear un archivo para probar el funcionamiento de una un método que trabaja con ellos. Para estas situaciones una buena práctica es que el código cree el archivo antes de lanzar la prueba y lo elimine una vez terminado. Además, para garantizar que el orden de ejecución de las pruebas no afecte a los resultados la mejor opción es realizar las operaciones de configuración antes de ejecutar cada prueba. Tareas que se pueden realizar mediante el uso de las funciones setup()
y teardown()
.
La función setup()
El paquete testthat, al igual que la mayoría de frameworks de para la creación de pruebas automáticas, dispone de una serie de herramientas para inicializar el entorno de pruebas. Funciones que se ejecutarán inmediatamente antes de una cada una de las pruebas e inmediatamente después, evitando que sea necesario repetir el código en cada una de las pruebas.
En testthat el código que se escriba en la función setup()
en cada uno de los archivos se ejecutará inmediatamente antes de cada prueba. Permitiendo crear el entorno para evitar que un cambio en el orden de ejecución de las pruebas afecte los resultados. Por ejemplo, si hay una prueba que modifica el archivo y se ejecuta antes que uno que lo lee.
La función teardown()
Al igual que existe una función que se ejecuta inmediatamente antes de cada prueba, también existen una función para ejecutar inmediatamente después. En la que se deberían incluir las tareas de limpieza del entorno. Por ejemplo para borrar archivos o servicios que se hubiese lanzado a través de setup()
.
Ejemplo: trabajo con archivos
En el siguiente ejemplo se muestra cómo utilizar las funciones setup()
y teardown()
para trabajar con archivos temporales que se borran una vez finalizado el trabajo.
context("Setup and teardown") tmp <- tempfile() df <- data.frame(Column1 = c(1,2,3), Column2 = c(3,2,2)) # Creación de un archivo temporal setup(write.csv(df, tmp)) # Borrado del archivo teardown(unlink(tmp)) test_that("Setup and teardown", { file.df <- read.csv(tmp) expect_equal(file.df$Column1, df$Column1) expect_equal(file.df$Column2, df$Column2) })
En esta prueba lo primero que se hace es definir un archivo temporal, para lo que se usa la función tempfile()
. Además de esto se crea un objeto dataframe. En la función setup()
se guarda en un archivo CSV temporal el contenido del dataframe. Esto se realizará inmediatamente antes de ejecutar cada una de las pruebas automáticas dentro de este archivo. Por otro lado, en la función teardown()
nos aseguramos de borrar el archivo, para evitar que dejar residuos tras la ejecución de las pruebas.
Finalmente, en el código tenemos es una prueba en la que se comprueba que el al cargar el archivo se obtiene los mismos valores que existan en el dataframe.
Conclusiones
En esta entrada hemos visto como configurar entornos a la hora de crear pruebas automáticas mediante el uso de las funciones setup()
y teardown()
. Lo que nos permite configurar pruebas avanzadas con testthat en las que se puede probar diferentes configuraciones. La semana que viene continuaremos con las pruebas automáticas, en este caso mediremos el grado de cobertura en nuestro paquete de R.
Deja una respuesta