Cómo hacer Testing en go

in #programming7 years ago (edited)

Estoy convencido de que la mejor forma de entender un concepto es explicarlo con un ejemplo muy sencillo y una vez que lo entendido puedo pasar a un ejemplo más sofisticado.
Eso es lo que pretendo con este post.

Voy a empezar con las siguientes operaciones:

Una suma de 2 números
2 + 3 = 5

Una resta de 2 números
2 - 3 = - 1

Y una multiplicación de 2 números
2 x 3 = 6

Si estas 3 operaciones, las pongo en una librería de go como funciones, de tal manera que las entradas de esas funciones sean 2 números cualquiera, puede quedar de la siguiente manera:

package operations

func Suma( a, b int) int {
    return a + b
}

func Resta( a, b int) int {
    return a - b
}

func Multiplicacion( a, b int) int {
    return a * b
}

El código anterior lo voy a poner en un archivo que se llame operaciones.go

Ahora el siguiente paso es crear el archivo de testing y para qué funcione se tiene qué llamar operaciones_test.go. Aquí es importante notar la terminación _test en el nombre del archivo, esa es la regla para qué funcione, es decir qué si mi archivo se llama manzanas.go el nombre del archivo de testing debería ser manzanas_test.go.
Otro cosa qué tengo qué recordar es qué los 2 archivos operaciones.go y operaciones_test.go deben estar en el mismo directorio

El archivo operaciones_test.go va a quedar de la siguiente manera:

package operations

import (
    "testing"
)

func TestSuma(t *testing.T) {
    input1 := 2
    input2 := 3
    expected := 5
    result := Suma(input1, input2)
    if result != expected {
        t.Errorf("TestSuma Result: %d, Expected: %d", result, expected)
    }
}

func TestResta(t *testing.T) {
    input1 := 2
    input2 := 3
    expected := -1
    result := Resta(input1, input2)
    if result != expected {
        t.Errorf("TestResta Result: %d, Expected: %d", result, expected)
    }
}

func TestMultiplicacion(t *testing.T) {
    input1 := 2
    input2 := 3
    expected := 6
    result := Multiplicacion(input1, input2)
    if result != expected {
        t.Errorf("TestMultiplicacion Result: %d, Expected: %d", result, expected)
    }
}

Una de las primeras cosas qué tengo qué notar es qué en los 2 archivos operaciones.go y operaciones_test.go pertenecen al mismo paquete qué se llama operaciones o dicho de otra manera los 2 archivos inician con la línea de código:

package operations

Ahora voy a explicar el archivo operaciones_test.go por partes.
La siguiente línea qué debe de tener un archivo de testing es:

import (
   "testing"
)

Para probar la función suma:

func Suma( a, b int) int {
    return a + b
}

Tengo qué crear la siguiente función dentro del archivo operaciones_test.go

func TestSuma(t *testing.T) {
    input1 := 2
    input2 := 3
    expected := 5
    result := Suma(input1, input2)
    if result != expected {
        t.Errorf("TestSuma Result: %d, Expected: %d", result, expected)
    }
}

Si voy a probar la función Suma, la función de prueba deberá tener el nombre TestSuma, es decir con el prefijo Test.

Todas Las funciones de prueba llevan como argumento: t *testing.T

Como la función Suma tiene 2 argumentos a y b de tipo int, tengo qué definir 2 variables de entrada qué también sean de tipo int qué son las siguientes:

 input1 := 2
 input2 := 3

En otra tercer variable voy a poner el resultado esperado de la suma 2 +3 qué es 5, qué es lo siguiente:

expected := 5

Lo qué sigue es llamar a la función Suma, pasarle como parámetros las 2 variables de entrada input1 := 2 e input2 := 3 y el resultado guardarlo en un cuarta variable qué se va a llamar result y eso va a quedar de la siguiente manera:

 result := Suma(input1, input2)

Y finalmente viene la parte donde se prueba la función:

    if result != expected {
        t.Errorf("TestSuma Result: %d, Expected: %d", result, expected)
    }

Si el valor qué guarda la variable result es diferente del valor qué guarda la variable expected no pasa la prueba. Y de igual manera hago lo respectivo para las funciones Resta y Multiplicación.

Para correr la prueba lo hago con el siguiente comando:

go test -v

Y lo qué se muestra en pantalla es algo como lo siguiente:

=== RUN   TestSuma
--- PASS: TestSuma (0.00s)
=== RUN   TestResta
--- PASS: TestResta (0.00s)
=== RUN   TestMultiplicacion
--- PASS: TestMultiplicacion (0.00s)
PASS
ok      github.com/hectorgool/operaciones      0.001s

Así de simple.

En un siguiente post voy a explicar como hacer un test pero para un servicio rest, donde todo esto se complica, pero aquí lo importante es entender las bases y los conceptos para poder dar ese gran salto al servicio rest.

Coin Marketplace

STEEM 0.24
TRX 0.26
JST 0.041
BTC 95868.85
ETH 3448.93
USDT 1.00
SBD 3.40