How to test the main package functions in golang?
我想测试主包中包含的一些函数,但我的测试似乎无法访问这些函数。
我的main.go示例文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 | package main import ( "log" ) func main() { log.Printf(foo()) } func foo() string { return"Foo" } |
我的主 est.go文件如下:
1 2 3 4 5 6 7 8 9 | package main import ( "testing" ) func Foo(t testing.T) { t.Error(foo()) } |
当我运行
1 2 3 | # command-line-arguments .\main_test.go:8: undefined: foo FAIL command-line-arguments [build failed] |
据我所知,即使我将测试文件移到别处并尝试从main.go文件导入,我也无法导入它,因为它是
构建此类测试的正确方法是什么?我应该将
型
在命令行上指定文件时,必须指定所有文件
这是我的跑步记录:
1 2 3 4 | $ ls main.go main_test.go $ go test *.go ok command-line-arguments 0.003s |
注意,在我的版本中,我在命令行上同时运行了main.go和main_test.go。
另外,您的测试文件并不完全正确,您需要将您的测试函数称为testxxx,并获取一个指向testing.t的指针。
以下是修改后的版本:
1 2 3 4 5 6 7 8 9 | package main import ( "testing" ) func TestFoo(t *testing.T) { t.Error(foo()) } |
号
修改后的输出:
1 2 3 4 5 | $ go test *.go --- FAIL: TestFoo (0.00s) main_test.go:8: Foo FAIL FAIL command-line-arguments 0.003s |
型
单元测试只进行到目前为止。在某个时刻,你必须实际运行程序。然后测试它是否与真实的输入一起工作,从真实的来源,产生真实的输出到真实的目的地。真的。
如果你想对一个东西进行单元测试,把它移出main()。
型
这不是对OP问题的直接回答,我一般同意事先的回答和评论,敦促
百万千克1使用一个延迟函数写入
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | func main() { // Ensure we exit with an error code and log message // when needed after deferred cleanups have run. // Credit: https://medium.com/@matryer/golang-advent-calendar-day-three-fatally-exiting-a-command-line-tool-with-grace-874befeb64a4 var err error defer func() { if err != nil { log.Fatalln(err) } }() // Initialize and do stuff // check for errors in the usual way err = somefunc() if err != nil { err = fmt.Errorf("somefunc failed : %v", err) return } // do more stuff ... } |
。
在
1 2 3 4 5 6 7 8 9 10 | func TestBadArgs(t *testing.T) { var err error cmd := exec.Command(yourprogname,"some","bad","args") out, err := cmd.CombinedOutput() sout := string(out) // because out is []byte if err != nil && !strings.Contains(sout,"somefunc failed") { fmt.Println(sout) // so we can see the full output t.Errorf("%v", err) } } |
注意,来自
1 2 3 4 5 6 7 8 9 10 | func TestMain(m *testing.M) { // call flag.Parse() here if TestMain uses flags os.Mkdir("test", 0777) // set up a temporary dir for generate files // Create whatever testfiles are needed in test/ // Run all tests and clean up exitcode := m.Run() os.RemoveAll("test") // remove the directory and its contents. os.Exit(exitcode) |
。
型
在两个源中将包名称从MAIN更改为FOOBAR。将源文件移到src/foobar下。
1 2 | mkdir -p src/foobar mv main.go main_test.go src/foobar/ |
。
确保将gopath设置为src/foobar所在的文件夹。
1 | export GOPATH=`pwd -P` |
用测试它
1 | go test foobar |
。