The directory structure is :
src src/pkg src/pkg/t1.go src/pkg/t1_test.go
package pkg import ( "fmt" ) func SayHI(){ fmt.Println("this is t1") }
package pkg import ( "testing" ) func TestXYZ(t *testing.T) { SayHI() }
Invoke go test from command line at dir src/pkg
go test t1_test.go
./t1_test.go:8: undefined: SayHI FAIL command-line-arguments [build failed]
but the function is there
thanks for any hints
Test Files and Test PackagesWithin a single folder, all Go files must be in the same package. The one exception is test files: those with a _test.go suffix. There is a really good reason for that: your test files should always be in a different package.
At the command line in the greetings directory, run the go test command to execute the test. The go test command executes test functions (whose names begin with Test ) in test files (whose names end with _test.go). You can add the -v flag to get verbose output that lists all of the tests and their results.
Use the go test -run flag to run a specific test. The flag is documented in the testing flags section of the go tool documentation: -run regexp Run only those tests and examples matching the regular expression.
You can't / shouldn't rely on test execution order. The order in which tests are executed is not defined, and with the use of testing flags it is possible to exclude tests from running, so you have no guarantee that they will run at all.
This requires: lib.go to exist in a folder with the same name as the new package ( e.g., myLibs). Adding the package name to lib.go (package myLibs). The function signature of the test function should be func Test (t *testing.T) { Ideally, the Test function should have a name that reflects what it is testing, like TestPrinting.
By default, go test needs no arguments. It compiles and tests the package with source in the current directory, including tests, and runs the tests. The package is built in a temporary directory so it does not interfere with the non-test installation.
go test pkg (assuming $GOPATH is ~ and the package is in ~/src/pkg) is okay. go test whatever_test.go is not okay as that is not supported as documented above.
To select which tests to run use the -run <regular_expression> flag (where the <regular_expression> is interpreted as having wildcards on either end, like .*<regular_expression>.* ). For example Show activity on this post. This is somewhat strange in Golang. To be honest it took me some time to figure a way out.
It is working as intended.
jnml@fsc-r630:~/src/pkg$ go help test usage: go test [-c] [-i] [build flags] [packages] [flags for test binary] 'Go test' automates testing the packages named by the import paths. It prints a summary of the test results in the format: ok archive/tar 0.011s FAIL archive/zip 0.022s ok compress/gzip 0.033s ... followed by detailed output for each failed package. 'Go test' recompiles each package along with any files with names matching the file pattern "*_test.go". These additional files can contain test functions, benchmark functions, and example functions. See 'go help testfunc' for more. By default, go test needs no arguments. It compiles and tests the package with source in the current directory, including tests, and runs the tests. The package is built in a temporary directory so it does not interfere with the non-test installation. In addition to the build flags, the flags handled by 'go test' itself are: -c Compile the test binary to pkg.test but do not run it. -i Install packages that are dependencies of the test. Do not run the test. The test binary also accepts flags that control execution of the test; these flags are also accessible by 'go test'. See 'go help testflag' for details. For more about build flags, see 'go help build'. For more about specifying packages, see 'go help packages'. See also: go build, go vet. jnml@fsc-r630:~/src/pkg$
In other words:
go test
is okay.go test pkg
(assuming $GOPATH is ~ and the package is in ~/src/pkg) is okay.go test whatever_test.go
is not okay as that is not supported as documented above.To select which tests to run use the -run <regular_expression>
flag (where the <regular_expression>
is interpreted as having wildcards on either end, like .*<regular_expression>.*
). For example
$ go test -run Say # from within the package's directory
or
$ go test -run Say my/package/import/path # from anywhere
This is somewhat strange in Golang. To be honest it took me some time to figure a way out.
A simple work-around is to include them in the command, eg: go test src/pkg/t1.go src/pkg/t1_test.go
IMHO, The best way is to keep it clean. So avoid having more than 1 file as dependency per test file. If you are using +1 file as dependency, consider creating a black-box test with a _test
package and do not make use of any lowerCase internal vars.
This will avoid you having to deal with complicated dependencies on your day to day testing.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With