单元测试

* 本页面主要介绍Go语言单元测试的相关内容。

单元测试,其实并不是Go语言独有的。在整个编程界,单元测试相信对大部分同学来讲都不陌生。今天,咱们就看看啥是单元测试,以及在Go中,如何实现单元测试。

一、何为单元测试

单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。比如你有一个函数,该函数完成了一个功能。那么你针对这个函数,写了几个小的测试用例来验证某些情况下,函数的功能是否正常。那么,把这些小的测试用例放在一个模块中,其实就组成了一个单元测试。

关于这个单元,具体范围是多大,还要根据项目情况实际分析,不宜过小,当然也不宜过大。

有了单元测试,我们对函数有任何修改之后,都可以跑一遍单元测试。,如果通过,说明我们的修改不会对函数原有的行为造成影响,如果测试不通过,说明我们的修改与原有行为不一致,要么修改代码,要么修改测试。

这种以测试为驱动的开发模式(TDD:Test-Driven Development) 最大的好处就是确保一个程序模块的行为符合我们设计的测试用例。在将来修改的时候,可以极大程度地保证该模块行为仍然是正确的。所以,关于单元测试,我们总结几点如下:

  • 单元测试可以有效地测试某个程序模块的行为,是未来重构代码的信心保证
  • 单元测试的测试用例要覆盖常用的输入组合、边界条件和异常
  • 单元测试代码要非常简单,如果测试代码太复杂,那么测试代码本身就可能有bug
  • 单元测试通过了并不意味着程序就没有bug了,但是不通过程序肯定有bug
二、Go中如何实现单元测试

我们知道了单元测试原来有这么大“益处”,那么在Go语言中如何实现呢?

首先,我们要学会写测试用例。这就要求你知道,如歌测试单个函数或方法,如何做基准测试,如何写出精炼短小的测试代码,如何使用mock等。

其次,要用一些原则来写出可测试的代码。比如高内聚、低耦合,比如单一职责,比如参数类型简单等。

最后,就是结合我们上一节 测试工具 中介绍的方法,写你自己的单元测试吧。接下来,咱们举一个简单的例子:

  package main

  func Add(a int, b int) int {
      return a + b
  }

  func Mul(a int, b int) int {
      return a * b
  } 
  package main

  import "testing"

  func TestAdd(t *testing.T) {
    if ans := Add(1, 2); ans != 3 {
      t.Errorf("1 + 2 expected be 3, but %d got", ans)
    }

    if ans := Add(-10, -20); ans != -30 {
      t.Errorf("-10 + -20 expected be -30, but %d got", ans)
    }
  } 
  $ go test -v
  === RUN   TestAdd
  --- PASS: TestAdd (0.00s)
  === RUN   TestMul
  --- PASS: TestMul (0.00s)
  PASS
  ok      example 0.007s 
  //指定运行单一用例
  $ go test -run TestAdd -v
  === RUN   TestAdd
  --- PASS: TestAdd (0.00s)
  PASS
  ok      example 0.007s 

单元测试相关的内容就总结到这里,你学废了吗?


* 本页内容参考以下数据源:

  • 《Go程序设计语言》
  • https://www.liaoxuefeng.com/wiki/897692888725344/953546675792640
  • https://geektutu.com/post/quick-go-test.html

凯冰科技 · 代码改变世界,技术改变生活
Next Page→