单元测试

文件命名规则: <file>_test.go
import "testing"

// 单元测试
函数命名规则: Test<fun>(t *testing.T) {}
命令: go test <package>

级联单元测试命令:
go test <package>/...
or
go test <folder>/...

import "github.com/bmizerany/assert"

assert.Equal(t, <yourData>, <testData>)

Error, Errorf, FailNow, Fatal, FatalIf方法可以指定此单元测试未通过
// 性能测试
函数命名规则: Benchmark<fun>(b *testing.B) {}
命令: go test -test.bench <file>.go
go test -test.bench=".*"   // 表示测试全部的压力测试函数

使用这个框架,需要遵循如下几点规则:

1. 含有单元测试代码的go文件必须以_test.go结尾,Go语言测试工具只认符合这个规则的文件
2. 单元测试文件名_test.go前面的部分最好是被测试的方法所在go文件的文件名,比如:
    例子中是main_test.go对应main.go
3. 单元测试的函数名必须以Test开头,是可导出公开的函数
4. 测试函数的签名必须接收一个指向testing.T类型的指针,并且不能返回任何值
5. 函数名最好是Test+要测试的方法函数名,比如:
    例子中是TestAdd,表示测试的是Add这个这个函数

综述

import "testing"
func TestXxx(*testing.T)

实例:

func TestAbs(t *testing.T) {
    got := Abs(-1)
    if got != 1 {
        t.Errorf("Abs(-1) = %d; want 1", got)
    }
}

Subtests

func TestFoo(t *testing.T) {
    // <setup code>
    t.Run("A=1", func(t *testing.T) { ... })
    t.Run("A=2", func(t *testing.T) { ... })
    t.Run("B=1", func(t *testing.T) { ... })
    // <tear-down code>
}

命令:

go test -run ''      # Run all tests.
go test -run Foo     # Run top-level tests matching "Foo", such as "TestFooBar".
go test -run Foo/A=  # For top-level tests matching "Foo", run subtests matching "A=".
go test -run /A=1    # For all top-level tests, run subtests matching "A=1".

实例

demo1:

package main

import "testing"

func TestAdd(t *testing.T) {
    if Add(1,2) == 3 {
        t.Log("1+2=3")
    }

    if Add(1,1) == 3 {
        t.Error("1+1=3")
    }
}

表组测试

有好几个输入,同时对应的也有好几个输出,这种一次性测试很多个输入输出场景的测试,就是表组测试。

例:

func TestAdd(t *testing.T) {
    sum := Add(1,2)
    if sum == 3 {
        t.Log("the result is ok")
    } else {
        t.Fatal("the result is wrong")
    }

    sum=Add(3,4)
    if sum == 7 {
        t.Log("the result is ok")
    } else {
        t.Fatal("the result is wrong")
    }
}