搞定Go单元测试(三)—— 断言(testify)

在上一篇,介绍了表格驱动测试方法和gomock测试框架,大大提高了测试效率与质量。本篇将介绍在测试中引入断言(assertion),进一步提高测试效率与质量。git

为何须要断言库

咱们先来看看Go标准包中为何没有断言,官方在FAQ里面回答了这个问题。程序员

golang.org/doc/faq#ass…github

整体归纳一下大意就是:“Go不提供断言,咱们知道这会带来必定的不便,其主要目的是为了防止大家这些程序员在错误处理上偷懒。咱们知道这是一个争论点,可是咱们以为这样很coooool~~。”因此,咱们引入断言库的缘由也很明显了:偷懒,引入断言能为咱们提供便利——提升测试效率,加强代码可读性。golang

testify

在断言库的选择上,咱们彷佛没有过多的选择,从start数和活跃度来看,基本上是testify一枝独秀。bash

github.com/stretchr/te…框架

没有对比就没有伤害,先来看看使用testify以前的测试方法:单元测试

func TestSomeFun(t *testing.T){
...
    if v != want {
        t.Fatalf("v值错误,指望值:%s,实际值:%s", want, v)
    }
    if err != nil {
        t.Fatalf("非预期的错误:%s", err)
    }
    if objectA != objectB {
        if objectA.field1 !=  objectB.field1 {
            // t.Fatalf() field1值错误...bla bla bla
        }
         if objectA.field2 !=  objectB.field2 {
            // t.Fatalf() field2值错误...bla bla bla
        }
        // 遍历object全部值... bla bla bla
    }
...
}
复制代码

上述代码充斥着大量if...else..判断,大段错误信息拼装(真·体力活...),运气很差碰到结构体判断要得将其遍历一遍——不直观,低效,实在是不fashion。
如今,咱们使用testify来改造一下上面的测试示例:测试

func TestSomeFun(t *testing.T){
    a := assert.New(t)
...
    a.Equal(v, want)
    a.Nil(err,"若是你仍是想输出本身拼装的错误信息,能够传第三个参数")
    a.Equal(objectA, objectB)
...
}
复制代码

三行搞定,测试含义一目了然——直观,高效,简短,fashion。spa

总结一下

testify使用简单,提高显著,可谓是用一次就会爱上的懒人神器。在结合表格驱动测试,gomock和testify后,咱们已经能写出一手优雅漂亮的单元测试代码了。不过,光测试代码优雅还不够,咱们还须要帮main.go也打扮打扮。在下一篇,也是本系列最后一篇文章中,咱们将介绍wire依赖注入框架,帮main.go减肥瘦身。code

相关文章
相关标签/搜索