Pester framework

Hace bastante tiempo que estoy por escribir sobre Pester. Si bien es un tema que ya conocía, todavía no había puesto en marcha su uso para mis scripts. Es por eso que decidí ponerme al día con este tema. Aquí les comparto una pequeña guía sobre los fundamentos de Pester y que podemos llegar a hacer con este framework.

Que es Pester?

Pester es un unit testing framework para PowerShell. Básicamente, unit testing (pruebas unitarias) es una forma de comprobar el correcto funcionamiento de un módulo de código de forma aislada.

Lo que nos permite este framework es poder mejorar la calidad de nuestros scripts a la vez que nos genera mayor tranquilidad a la hora de comprobar la funcionalidad de nuestros scripts.

Cómo empezar?

Suponiendo que la versión de PowerShell en nuestro sistema es 5.0 o superior, les comento que contamos con todo lo necesario para comenzar a trabajar!

Ahora bien, si ese no es nuestro caso, vamos a tener que realizar alguno de los siguientes caminos:

La opción más accesible y fácil de poder acceder a Pester es usar el Package Management desde la consola con permisos elevados:

Find-Module Pester | install-module

La segunda opción es descargar el zip desde la página de Github del proyecto: enlace. Luego de la descarga, extraer los archivos dentro de la carpeta de módulos que utilizamos usualmente (‘C:\Program Files\WindowsPowerShell\Modules’).

Como última opción es realizar un fork del proyecto en Github, en donde puede resultar un poco confuso si no se tiene experiencia, pero es la mejor manera de poder colaborar con el proyecto.

Estructura

Para comenzar vamos a escribir nuestro primer test. Y qué es un test? un test no es más que un script (o función) en PowerShell. Por convención (no es obligatorio) se utiliza la siguiente estructura:

ScriptName.Tests.ps1

Un ejemplo: si nuestro script se llama Get-SystemInfo.ps1 de acuerdo con lo que se comentó anteriormente nuestro test de pester se llamará Get-SystemInfo.Tests.ps1.

Existe un cmdlet llamado New-Fixture que pertenece al módulo de pester que permite crear un script vacío junto con el test correspondiente (en blanco también) de la siguiente manera:

#Invocamos el cmdlet para crear nuestros archivos
New-Fixture -Path .\ -Name PesterExample

New-Fixture (Pester)

Hola Mundo!

Como comentario me gustaría compartir que si bien la función New-Fixture ayuda a crear nuestro script y test, no es del todo útil ya que el archivo del test contiene una estructura que nos es la más adecuada en la mayoría de los casos en el mundo real.

Vamos a ver como luce el archivo PesterExample.Tests.ps1:

Pester test

En primer lugar tenemos la estructura Describe que básicamente separa los tests dentro de nuestro script (similar a lo que hace una región, por decirlo de alguna manera). Luego tenemos el bloque It que no es más que el test en sí. Por último se presenta el mecanismo Should donde la expresión va a ser evaluada obteniendo un precioso mensaje verde en consola si todo va bien, o en su defecto de color rojo.

Toca modificar el script de la función para hacer un ejemplo simple, de la siguiente manera:

#PesterExample.ps1
function PesterExample($value) {
    return $value
}

Un función muy muy simple que solo retorna el valor ingresado.

Ahora con nuestro “ script” , vamos a modificar nuestro test, de la siguiente manera:

#PesterExample.Tests.ps1
$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path) -replace '\.Tests\.', '.'
. "$here\$sut"

Describe "PesterExample" {
    It "Print text correctly" {
        PesterExample 2 | Should Be 2
    }
}

Si prestan atención verán que el string de la estructura It fué modificado para que imprima información relacionada con las pruebas que queremos realizar; como nuestra función imprime texto, es relevante que la prueba indique si cumple el objetivo o no. Como segundo dato se modificó la expresión Should Be en donde se invoca la función PesterExample con un valor definido y el resultado esperado.

Para ejecutar el test, basta con ejecutar el archivo PesterExample.Tests.ps1 o pulsar la tecla F5 si estamos en el ISE. Así se vería el resultado de ejutar lo anterior:

Resultado del test

En próximas entregas vamos a ver diferentes secciones que son utilizadas en Pester y ejemplos más complejos.

Happy scripting!

Comments