unit tutorial test golang files benchmark unit-testing testing import go main

unit testing - tutorial - ¿Cómo probar las principales funciones del paquete en golang?



spy golang (3)

Cambie el nombre del paquete de main a foobar en ambas fuentes. Mueva los archivos de origen en src / foobar.

mkdir -p src/foobar mv main.go main_test.go src/foobar/

Asegúrese de establecer GOPATH en la carpeta donde reside src / foobar.

export GOPATH=`pwd -P`

Probarlo con

go test foobar

Quiero probar algunas funciones que se incluyen en mi paquete principal, pero mis pruebas no parecen poder acceder a esas funciones.

Mi archivo main.go de muestra se ve como:

package main import ( "log" ) func main() { log.Printf(foo()) } func foo() string { return "Foo" }

y mi archivo main_test.go se ve como:

package main import ( "testing" ) func Foo(t testing.T) { t.Error(foo()) }

cuando corro go test main_test.go me sale

# command-line-arguments ./main_test.go:8: undefined: foo FAIL command-line-arguments [build failed]

Según tengo entendido, incluso si moviera el archivo de prueba a otro lugar e intenté importar desde el archivo main.go, no podría importarlo, ya que es el package main .

¿Cuál es la forma correcta de estructurar tales pruebas? ¿Debo eliminar todo del paquete main además de una función principal simple para ejecutar todo y luego probar las funciones en su propio paquete, o hay alguna forma de que llame a esas funciones desde el archivo principal durante la prueba?


Las pruebas unitarias solo van tan lejos. En algún momento tienes que ejecutar el programa. Luego prueba que funciona con entrada real, desde fuentes reales, produciendo salida real a destinos reales. De verdad.

Si desea realizar una prueba unitaria, retírela del main ().


cuando especifica archivos en la línea de comando, debe especificarlos todos

Aquí está mi carrera:

$ ls main.go main_test.go $ go test *.go ok command-line-arguments 0.003s

nota, en mi versión, corrí con main.go y main_test.go en la línea de comandos

Además, su _test archivo no es del todo correcto, necesita que su función de prueba se llame TestXXX y lleve un puntero a testing.T

Aquí está la versión modificada:

package main import ( "testing" ) func TestFoo(t *testing.T) { t.Error(foo()) }

y la salida modificada:

$ go test *.go --- FAIL: TestFoo (0.00s) main_test.go:8: Foo FAIL FAIL command-line-arguments 0.003s