源代码目录结构

我们在gotest包中创建两个文件,目录结构如下所示:

  1. [GoExpert]
  2. |--[src]
  3. |--[gotest]
  4. |--unit.go
  5. |--unit_test.go

其中unit.go为源代码文件,unit_test.go为测试文件。要保证测试文件以“_test.go”结尾。

源代码文件

源代码文件unit.go中包含一个Add()方法,如下所示:

  1. package gotest
  2. // Add 方法用于演示go test使用
  3. func Add(a int, b int) int {
  4. return a + b
  5. }

Add()方法仅提供两数加法,实际项目中不可能出现类似的方法,此处仅供单元测试示例。

测试文件

测试文件unit_test.go中包含一个测试方法TestAdd(),如下所示:

  1. package gotest_test
  2. import (
  3. "testing"
  4. "gotest"
  5. )
  6. func TestAdd(t *testing.T) {
  7. var a = 1
  8. var b = 2
  9. var expected = 3
  10. actual := gotest.Add(a, b)
  11. if actual != expected {
  12. t.Errorf("Add(%d, %d) = %d; expected: %d", a, b, actual, expected)
  13. }
  14. }

通过package语句可以看到,测试文件属于“gotest_test”包,测试文件也可以跟源文件在同一个包,但常见的做法是创建一个包专用于测试,这样可以使测试文件和源文件隔离。GO源代码以及其他知名的开源框架通常会创建测试包,而且规则是在原包名上加上”_test”。

测试函数命名规则为”TestXxx”,其中“Test”为单元测试的固定开头,go test只会执行以此为开头的方法。紧跟“Test”是以首字母大写的单词,用于识别待测试函数。

测试函数参数并不是必须要使用的,但”testing.T”提供了丰富的方法帮助控制测试流程。

t.Errorf()用于标记测试失败,标记失败还有几个方法,在介绍testing.T结构时再详细介绍。

执行测试

命令行下,使用go test命令即可启动单元测试,如下所示:

  1. E:\OpenSource\GitHub\RainbowMango\GoExpertProgrammingSourceCode\GoExpert\src\gotest>go test
  2. PASS
  3. ok gotest 0.378s
  4. E:\OpenSource\GitHub\RainbowMango\GoExpertProgrammingSourceCode\GoExpert\src\gotest>

通过打印可知,测试通过,花费时间为0.378s。

总结

从上面可以看出,编写一个单元测试并执行是非常方便的,只需要遵循一定的规则:

  • 测试文件名必须以”_test.go”结尾;
  • 测试函数名必须以“TestXxx”开始;
  • 命令行下使用”go test”即可启动测试;