golang进阶(七)——go语言的几种测试方法
前言用了go的测试框架,再想下junit的,虽然已经Junit5,那丑陋程度还是依然。 java出来的时候,还没有很多软件工程的概念,语言先出来了,因此需要通过不同的插件慢慢补。 go就很幸运,出来的时候很多软件工程的概念已经基本定了下来,可以加到语言特性之中,go的测试就简便很多,不愧是为工程而生的语言 需要测试的程序我们需要测试的程序文件叫做 func Reverse(s string) string {
r := []rune(s)
for i,j := 0,len(r)-1; i < len(r)/2; i,j = i+1,j-1 {
r[i],r[j] = r[j],r[i]
}
return string(r)
}
单元测试go的testing包可以基于包进测试,意思是执行 新建一个测试的文件,要以 我们新建 func TestReverse(t *testing.T) {
if testing.Short() {
t.Skip("skipping test in short mode.")
}
cases := []struct {
in,want string
}{
{"Hello,world","dlrow,olleH"},{"Hello,世界","界世,{"",""},}
for _,c := range cases {
got := Reverse(c.in)
if got != c.want {
t.Errorf("Reverse(%q) == %q,want %q",c.in,got,c.want)
}
}
}
第一个if表示如果有 示例验证还有一种可以当做测试的方法就是使用示例验证程序,做一个示例在go语言也非常简单,告别写点示例程序就得写好多main方法的时代吧,格式要以Example开头,执行 还有一点注意的是,会自动trim,而忽略前后的空格比较。 func ExampleReverse() {
fmt.Println(Reverse("Hello,世界"))
// Output: 界世,olleH
}
可以验证输出是否与想要的一致,还有一些情况下,比如多线程的情况下,输出顺序是随机的,这点go也考虑到了, func ExampleReverse() {
fmt.Println(Reverse("Hello,world"))
fmt.Println(Reverse("Hello,世界"))
// Unordered Output: 界世,olleH
// dlrow,olleH
// AA
}
用 基准测试基准测试以
基准测试并不会默认执行,他需要增加 func BenchmarkReverse(b *testing.B) {
b.ResetTimer()
for i := 0; i < b.N; i++ {
Reverse("s string")
}
}
基准测试也可以开启并行测试,需要执行 个人意见只写并行测试就ok了,如果想非并行可以指定cpu数量为1,例如 func BenchmarkReverseParallel(b *testing.B) {
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
Reverse("s string")
}
})
}
子测试和子基准测试还可以通过 每个子测试都有一个唯一的名字,以父测试用 还有一个特点就是所有子测试完成,父测试才算完成,而且所有测试都是并行的,这样可以把一些需要同步完成的操作来进行分组测试。 func TestTeardownParallel(t *testing.T) {
// This Run will not return until the parallel tests finish.
t.Run("group",func(t *testing.T) {
t.Run("Test1",parallelTest1)
t.Run("Test2",parallelTest2)
t.Run("Test3",parallelTest3)
})
// <tear-down code>
}
Main测试还有一个可以做一些初始化的地方就是main测试了,代码也相对简单。 要注意的testmain是在主协程运行的, func TestMain(m *testing.M) {
fmt.Println("init")
os.Exit(m.Run())
}
附带揭露一下滴滴的jsoniter为了kpi连基准测试都要作弊吗? 可见自己会写基准测试很重要,不会被人忽悠瘸了 来看我的基准测试 type ColorGroup struct {
ID int
Name string
Colors []string
}
var group = ColorGroup{
ID: 1,Name: "Reds",Colors: []string{"Crimson","Red","Ruby","Maroon"},}
func BenchmarkStdJson(b *testing.B) {
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
b,err := json.Marshal(group)
if err != nil {
fmt.Println(b)
}
}
})
}
func BenchmarkIterJson(b *testing.B) {
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
b,err := jsoniter.Marshal(group)
if err != nil {
fmt.Println(b)
}
}
})
}
测试结果: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |