Pruebas de Golang en el subdirectorio

121

Quiero crear un paquete en Go con pruebas y ejemplos para el paquete como subdirectorios para mantener el espacio de trabajo más limpio. ¿Es posible? y si lo es, ¿cómo?

Toda la documentación siempre coloca el código de prueba en el mismo lugar que el otro código, ¿es esto mejor de alguna manera o solo una convención?

El pingüino agraciado
fuente
5
Nota: go test ./...ejecutará pruebas en la carpeta actual y todas las subcarpetas. Vea mi respuesta a continuación
VonC
¿Posible duplicado de Cómo "probar" todas las pruebas en mi proyecto?
Matthew Rankin
estaba pensando lo mismo. tener problemas para poner las pruebas en un directorio separado porque el director en el mismo nivel tiene subdirectorios.
filthy_wizard

Respuestas:

203

Tenga en cuenta que puede ejecutar go test"recursivamente": debe enumerar todos los paquetes que desea probar .

Si está en la carpeta raíz de su proyecto Go, escriba:

go test ./...

La ./...notación ' ' se describe en la sección " Descripción de listas de paquetes " del comando "go ":

Una ruta de importación es un patrón si incluye uno o más "... " comodines, cada uno de los cuales puede coincidir con cualquier cadena, incluida la cadena vacía y las cadenas que contienen barras.

Dicho patrón se expande a todos los directorios de paquetes que se encuentran en el GOPATH árboles con nombres que coinciden con los patrones.

Como caso especial, x/...partidos x, así como xlos subdirectorios 's.
Por ejemplo, se net/...expande nety se empaqueta en sus subdirectorios.


Si mantiene sus _test.goarchivos en una subcarpeta, el go test ./...comando ' ' podrá recogerlos.
Pero:

  • deberá anteponer sus variables y funciones exportadas (utilizadas en sus pruebas) con el nombre de su paquete, para que el archivo de prueba pueda acceder al contenido exportado del paquete.
  • no accedería a contenido no exportado.

Dicho esto, preferiría mantener el _test.goarchivo justo al lado del archivo fuente principal: es más fácil de encontrar.

VonC
fuente
4
Algunos podrían argumentar que la falta de acceso a cosas privadas es una prueba normal de caja negra y mejor. En cuanto a tener que calificar los símbolos públicos, siempre puede importar _ "...".
ddevienne
15

Coloque sus pruebas junto con su código en el mismo directorio en un archivo llamado file_test.go donde "archivo" es el nombre del archivo de código fuente que está probando. Esto es una convención y he encontrado que es mejor en mi propia experiencia.

Si la go testherramienta no es lo suficientemente automatizada para usted, puede buscar en GoConvey , que tiene una interfaz de usuario web que actualizará y ejecutará automáticamente las pruebas tradicionales de Go, así como las pruebas de GoConvey (que se basan en el comportamiento y son más autodocumentadas). que las pruebas tradicionales de Go).

Mate
fuente
2
GoConvey es increíble (y estoy esperando la nueva interfaz de usuario con mucha anticipación). Lo estoy usando en mi proyecto actual como en github.com/VonC/asciidocgo/blob/master/abstractNode_test.go , por ejemplo). Sin embargo, go testtambién puede funcionar para subcarpetas. Vea mi respuesta a continuación
VonC
Estás en lo correcto. De hecho, probablemente sea más relevante que mi respuesta a esta pregunta.
Matt
10

EDITADO

Basado en la respuesta de VonC,

Esta respuesta es válida en go1.11. Aún no probado en la parte superiorgo versiones .

Para aquellos de ustedes a quienes les gusta mantener sus pruebas en una subcarpeta, digamos test, luego ejecutando

go test ./...

intentará ejecutar pruebas en todas las carpetas, incluso aquellas que no contengan ninguna prueba, por lo que tendrá un ?informe posterior para las carpetas que no sean de prueba.

Corriendo

go test ./.../test

en cambio, apuntará solo a sus testcarpetas, por lo que tendrá un informe limpio centrado solo en sus carpetas de pruebas.

PRECAUCIÓN

Tenga en cuenta que el uso de subcarpetas de prueba evitará el cálculo del informe de cobertura. La filosofía de go es dejar archivos de prueba en las carpetas del paquete.

avi.elkharrat
fuente
1
Buen consejo, además de mi respuesta de cinco años. Votación a favor
VonC
querida anna, por favor explica lo que no funciona y cuál es tu versión de go? ¿que estás tratando de hacer? Luego me di cuenta de que este método no permite calcular la cobertura del código, lo cual es una lástima. ¿Es esto lo que quieres decir?
avi.elkharrat
1
go test ./.../testdevuelve go: warning: "./.../test" matched no packages// no solo apunta a las carpetas de prueba. go versión go1.13 darwin / amd64
anna
1
@Madeo, esto tendría sentido, porque golang no fomenta la segregación de pruebas y código. La anomalía fue permitirlo en versiones anteriores.
avi.elkharrat
1
@ avi.elkharrat y, de hecho, he decidido no seguir con este enfoque, aunque me gustaba mantener mis pruebas en un paquete / carpeta separada = (
Madeo
-4

Normalmente no hago pruebas, pero puede agrupar su archivo en directorios y usar la importación como

import "./models"si es un nivel hacia fuera
import "../modelssi es un nivel hacia fuera y un nivel hacia adentro

Por ejemplo, para:
./models/todo.go
./test/todo_test.go

a prueba todo.gode todo_test.go, a su importación en el todo_test.goserá

import "../models"

Felix Zilla
fuente
Este método de importar el código solo funciona para funciones expuestas. No parece comportarse como si estuvieran en el mismo paquete, incluso aunque los haya puesto explícitamente en el mismo paquete. Por tanto, esta solución no resuelve realmente el problema de las pruebas unitarias.
The Graceful Penguin