原文:https://gocn.io/article/366
GolANG测试时,可以用匿名对象填充测试序列,但是如果没有带堆栈的errors,那么会造成出现错误时无法排查。
先看测试序列的填充,参考tricks-2015这个文章,怕你翻不了墙,我把内容粘贴过来就是:
Anonymous structs: test cases (1/2)
These propertIEs enable a nice way to express test cases:
func TestIndex(t *testing.T) { var tests = []struct { s string sep string out int }{ {"","",0},{"","a",-1},{"fo","foo",{"foo",{"oofofoofooo","f",2},// etc } for _,test := range tests { actual := strings.Index(test.s,test.sep) if actual != test.out { t.Errorf("Index(%q,%q) = %v; want %v",test.s,test.sep,actual,test.out) } }}
是的,看起来很方便,出错时也知道哪里的问题,但是实际上如果序列中有函数,那就悲剧了。让我们来试试,考虑一个包头的定义,它就是两个字段,然后序列化成[]byte
:
type Myheader struct { Version uint8 Size uint16}func (v Myheader) MarshalBinary() ([]byte,error) { return []byte{byte(v.Version),0,0},nil // Failed.}
为了测试设置不同的值,得到不同的字节,我们用两个函数来填充测试序列:
func TestMyheader_MarshalBinary(t *testing.T) { mhs := []struct { set func(h *Myheader) compare func(p []byte) error }{ {func(h *Myheader) { h.Size = 1 },func(p []byte) error { if p[1] != 0x01 { return fmt.Errorf("p[1] is %v",p[1]) // line 194 } return nil }},{func(h *Myheader) { h.Size = 2 },func(p []byte) error { if p[1] != 0x02 { return fmt.Errorf("p[1] is %v",p[1]) // line 200 } return nil }},} for _,mh := range mhs { h := &Myheader{} mh.set(h) if b,err := h.MarshalBinary(); err != nil { t.Errorf("error is %+v",err) } else if err = mh.compare(b); err != nil { t.Errorf("invalID data,err is %+v",err) // line 211 } }}
结果我们就懵逼了,出现的错误行数都是在error那个地方211
行是不够的,还需要知道是194还是200出问题了:
--- FAIL: TestMyheader_MarshalBinary (0.00s) iprouter_test.go:211: invalID data,err is p[1] is 0 iprouter_test.go:211: invalID data,err is p[1] is 0
怎么办呢?把堆栈信息带上,参考错误最佳实践,改成这样:
import oe "github.com/ossrs/go-oryx-lib/errors"
创建error时用这个package:
if p[1] != 0x01 { return oe.Errorf("p[1] is %v",p[1]) // line 194 } if p[1] != 0x02 { return oe.Errorf("p[1] is %v",p[1]) // line 200 }
结果可以看到详细的堆栈:
iprouter_test.go:211: invalID data,err is p[1] is 0 _/Users/winlin/git/test/src/core.TestMyheader_MarshalBinary.func4 /Users/winlin/git/test/src/core_test.go:200 _/Users/winlin/git/test/src/core.TestMyheader_MarshalBinary /Users/winlin/git/test/src/core_test.go:210 testing.tRunner /usr/local/Cellar/go/1.8.1/libexec/src/testing/testing.go:657 runtime.goexit /usr/local/Cellar/go/1.8.1/libexec/src/runtime/asm_amd64.s:2197
这样可以嵌套非常多的函数做测试了。
总结以上是内存溢出为你收集整理的GOLANG测试必须用带堆栈的errors全部内容,希望文章能够帮你解决GOLANG测试必须用带堆栈的errors所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)