2012-12-13 56 views
3

我有一些运行_test案例所需的二进制文件。Go中的资源文件

当前,这些文件的相对路径被硬编码到测试中,我不喜欢,因为如果在文件夹层次结构中更改任何内容并使测试变得脆弱,测试会中断。

是否有一个首选的最佳做法来处理这个问题,以及一般的资源文件?

+0

虽然我在@jnml上,似乎有[在模拟资源](http://stackoverflow.com/a/12483181/720999)编译的Go文件中使用'go-binary'包。不过这是外部依赖。 – kostix

回答

4

测试资源名称可能是硬编码的,但路径不一定是。

(09:13) [email protected]:~/src/tmp/SO/13854048$ ls -a 
. .. a_test.go 
(09:13) [email protected]:~/src/tmp/SO/13854048$ cat a_test.go 
package foo 

import (
     "testing" 
     "io/ioutil" 
) 

func Test(t *testing.T) { 
     b, err := ioutil.ReadFile("foo") 
     if err != nil { 
       t.Fatal(err) 
     } 

     t.Logf("resource content is: %s", b) 
} 
(09:13) [email protected]:~/src/tmp/SO/13854048$ go test -v 
=== RUN Test 
--- FAIL: Test (0.00 seconds) 
a_test.go:11:   open foo: no such file or directory 
FAIL 
exit status 1 
FAIL  tmp/SO/13854048  0.005s 
(09:14) [email protected]:~/src/tmp/SO/13854048$ 

正确,没有这样的资源(还)。让我们来创建它。

(09:14) [email protected]:~/src/tmp/SO/13854048$ echo blah > foo 
(09:14) [email protected]:~/src/tmp/SO/13854048$ go test -v 
=== RUN Test 
--- PASS: Test (0.00 seconds) 
a_test.go:14:   resource content is: blah 
PASS 
ok   tmp/SO/13854048  0.007s 
(09:14) [email protected]:~/src/tmp/SO/13854048$ cd 
(09:14) [email protected]:~$ go test -v tmp/SO/13854048 
=== RUN Test 
--- PASS: Test (0.00 seconds) 
a_test.go:14:   resource content is: blah 
PASS 
ok   tmp/SO/13854048  0.005s 
(09:14) [email protected]:~$ 

注意(在上面的最后一次运行)的CWD是即使go test是从其他地方调用正确的。

+0

但在这种情况下,资源文件必须位于源文件夹中,据我所知。 –

+0

是的,这是正确的。 – zzzz