Go学习笔记(day4) | 青训营笔记

80 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第4天

笨人纯小白,笔记包括一些上课学到的知识和课外总结的内容,如有错误请指正!

六、Golang单元测试

单元测试,是指对软件中的最小可测试单元进行检查和验证,对于单元测试中单元的含义,一般要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。

单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。

6.1 单元测试概述

  1. 要开始一个单元测试,需要准备一个go源码文件,在命名文件时需要让文件以_test结尾
  2. 单元测试源码文件可以由多个测试用例组成,每个测试用例函数需要以Test为前缀;
    func TestXXX( t *testing.T )
  1. 测试用例文件不会参与正常源码编译,不会被包含到可执行文件中;
  2. 测试用例文件使用go test指令来执行,没有也不需要main()作为函数入口,所有在以_test结尾的源码内以Test开头的函数会自动被执行;
  3. 测试用例可以不传入*testing.T参数;
  4. 新建的测试问卷一般和源文件放同一目录;
  5. go单元测试,引入包testing。

示例:

hello.go文件:

image.png

hello_test.go测试文件:

image.png

6.2 单元测试命令

  1. 单个文件进入到测试文件所在目录;执行go test xx_test.go xx.go
  2. 如果该目录有go.mod存在,直接go test image.png PASS表示测试成功

6.3 运行指定单元测试用例

go test默认执行文件内的所有测试用例;也可以使用-run参数选择需要的测试用例单独执行

    //以下文件还有多个测试用例
 
    package code11_3
    import "testing"
     
    func TestA(t *testing.T) {
        t.Log("A")
    }
     
    func TestAK(t *testing.T) {
        t.Log("AK")
    }
     
    func TestB(t *testing.T) {
        t.Log("B")
    }
    func TestC(t *testing.T) {
        t.Log("C")
    }

这里指定TestA进行测试:

    $ go test -v -run TestA select_test.go
    === RUN   TestA
    --- PASS: TestA (0.00s)
            select_test.go:6: A
    === RUN   TestAK
    --- PASS: TestAK (0.00s)
            select_test.go:10: AK
    PASS
    ok          command-line-arguments        0.003s

TestA和TestAK的测试用例都被执行,原因是-run跟随的测试用例的名称支持正则表达式,若使用-run TestA$ 即可只执行TestA测试用例。

6.4 标记单元测试结果

当需要终止当前测试用例时,可以使用FailNow

    func TestFailNow(t *testing.T) {
        t.FailNow()
    }

还有一种只标记错误不终止测试的方法,代码如下:

    func TestFail(t *testing.T) {
        fmt.Println("before fail")
        t.Fail()
        fmt.Println("after fail")
    }

测试结果如下:

    === RUN   TestFail
    before fail
    after fail
    --- FAIL: TestFail (0.00s)
    FAIL
    exit status 1
    FAIL        command-line-arguments        0.002s

从日志中看出,第三行调用Fail()后测试结果标记为失败,但是第四行依然被程序执行了。