¿Cómo ejecutar casos de prueba en un archivo especificado?

205

Los casos de prueba de mi paquete están dispersos en varios archivos, si lo ejecuto go test <package_name>, ejecuta todos los casos de prueba en el paquete.

Sin embargo, no es necesario ejecutarlos todos. ¿Hay alguna manera de especificar un archivo para go testejecutar, de modo que solo ejecute casos de prueba definidos en el archivo?


fuente

Respuestas:

326

Hay dos maneras. La fácil es usar el-run bandera y proporcionar un patrón que coincida con los nombres de las pruebas que desea ejecutar.

Ejemplo:

$ go test -run NameOfTest

Ver los documentos para más información.

La otra forma es nombrar el archivo específico, que contiene las pruebas que desea ejecutar:

$ go test foo_test.go

Pero hay una trampa. Esto funciona bien si:

  • foo.goestá en package foo.
  • foo_test.goestá en package foo_teste importa 'foo'.

Si foo_test.goy foo.goson el mismo paquete (un caso común), debe nombrar todos los demás archivos necesarios para compilar foo_test. En este ejemplo sería:

$ go test foo_test.go foo.go

Recomiendo usar el -runpatrón. O, donde / cuando sea posible, siempre ejecute todas las pruebas de paquetes.

zzzz
fuente
1
¿te importaría elaborar la primera (fácil) forma con -runpor favor? No puedo encontrar ninguna referencia manual sobre eso.
1
También puede encontrar información al respecto congo help testflag
Jeffrey Martinez
Cuando uso el comando, go test utils.go utils_test.gola salida es ok command-line-arguments 0.002s. No ejecuta la prueba. La razón por la que quiero usar este modo de prueba es porque el paquete contiene muchos archivos y aún no se compilan, excepto las utilidades. Por lo tanto, me gustaría finalizar las utilidades antes de trabajar en otros archivos. Cómo puedo hacer eso ?
chmike
Si desea ver lo que se registra durante la prueba, vale la pena mencionar la -vbandera (detallada). De los documentos-v Verbose output: log all tests as they are run. Also print all text from Log and Logf calls even if the test succeeds.
robstarbuck el
121

La respuesta de @ zzzz es en su mayoría completa, pero solo para evitar que otros tengan que buscar en la documentación referenciada , puede ejecutar una sola prueba en un paquete de la siguiente manera:

go test packageName -run TestName

Tenga en cuenta que desea pasar el nombre de la prueba, no el nombre del archivo donde existe la prueba.

El -runindicador realmente acepta una expresión regular para que pueda limitar la ejecución de la prueba a una clase de pruebas. De los documentos:

-run regexp
    Run only those tests and examples matching the regular
    expression.
TomDotTom
fuente
28
Vale la pena señalar que el nombre del paquete es el nombre completo del paquete, por ejemplo, "github.com/you/stuff/a/b/c"
garbagecollector
1.9.3 acepta la ruta relativa del paquete también.
2
No estoy seguro de por qué, pero por alguna razón, debo especificar "./" antes del nombre del paquete
Roozbeh Zabihollahi
12

Cuando ejecuto una sola prueba, generalmente hago:

go test -run TestSomethingReallyCool ./folder1/folder2/ -v -count 1

-count 1también asegura que la prueba se ejecute cada vez en lugar de ser almacenada en caché. Es útil cuando realiza pruebas en condiciones de carrera y tiene una prueba que falla solo a veces. En las versiones Go que no usan módulos, se puede lograr lo mismo configurando, GOCACHE=offpero esto interactúa mal con los módulos Go.

Francesco Casula
fuente
6

en intelliJ IDEA go-lang plugin (y supongo que en jetbrains Gogland) puede simplemente configurar el tipo de prueba para presentar en ejecución> editar configuraciones

captura de pantalla crear prueba ir en el archivo ir

robert king
fuente
2
En Gogland, puede hacer clic con el botón derecho en el archivo de prueba y elegir "ejecutar foo_test.go", creará el paquete con las pruebas y luego pasará una expresión regular que contenga los nombres de todas las pruebas en ese archivo de prueba al indicador -run. Una característica realmente útil.
Eloff
4
alias testcases="sed -n 's/func.*\(Test.*\)(.*/\1/p' | xargs | sed 's/ /|/g'"

go test -v -run $(cat coordinator_test.go | testcases)
usuario2865442
fuente
2
go test -v ./<package_name> -run Test

Evita el almacenamiento en caché de los resultados de la prueba.

go test -count=1 ./<package_name> -run Test
Siglo de dele
fuente
0
go test -v -timeout 30s <path_to_package> -run ^(TestFuncRegEx)
  • TestFunc debe estar dentro de un goarchivo de prueba en ese paquete
  • Podemos proporcionar una expresión regular para que coincida con un conjunto de casos de prueba o simplemente la función de caso de prueba exacta para ejecutar un solo caso de prueba. Por ejemplo-run TestCaseFunc
Abhishek Srivastava
fuente