Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

go test can't find function in a same package

Tags:

go

The directory structure is :

src src/pkg src/pkg/t1.go src/pkg/t1_test.go 

t1.go

package pkg  import ( "fmt" )  func SayHI(){     fmt.Println("this is t1") } 

t1_test.go

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


error:

./t1_test.go:8: undefined: SayHI FAIL    command-line-arguments [build failed] 

but the function is there

thanks for any hints

like image 863
davyzhang Avatar asked Feb 06 '13 06:02

davyzhang


People also ask

Should tests be in the same package Golang?

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.

How do you test a function in go?

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.

How do I run a specific test case in Golang?

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.

Are Golang tests run in order?

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.

How do I add a test function to a package?

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.

What are the arguments required for Go test?

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.

Is it okay to use Go test PKG?

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.

How to select which tests to run in Golang?

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.


2 Answers

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 
like image 199
zzzz Avatar answered Sep 28 '22 19:09

zzzz


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.

like image 31
Thomas Modeneis Avatar answered Sep 28 '22 17:09

Thomas Modeneis