GO语言 单元测试

注:go的测试文件需要和被测试的文件处于同一个包内。并且测试文件需要以_test.go结尾,测试文件内测试函数的书写方式为Testxxx(以Test开头

1.普通测试

这个用于编写基本的测试函数。来看实例

假设我们在main函数里面有一个求和函数,我想测试一下这个求和函数是否可以正常运行并计算正常结果

复制代码
func GetSum(j, k int) int {
    return j + k
}

我们需要创建一个main_test.go函数,这个命名规则没有硬性要求,主要看后缀。我们一般测试哪个文件就用那个文件_test.go命名。

在main_test.go文件中,我们不需要main函数。直接编写测试函数即可,这里我的被测试函数是GetSum,我就写一个TestGetSum(t *testing.T){}函数,函数具体编写如下:

复制代码
func TestGetSum(t *testing.T) {
    re := GetSum(1, 3)
    if re != 40 {
       t.Errorf("getsum(1,3) = %d; want 4", re)
    }
}

其实测试函数就是在函数内部调用被测试函数,通过预设的实参来检测返回值是否与我们预期的相符。如果不符合就调用t的方法来输出结果

t的方法最常用的是t.Errorf("")格式化输出错误信息,

复制代码
t.Errorf("getsum(1,3) = %d; want 4", re)

这条语句的作用就是输出:getsum(1,3)=变量re的值;want 4

这就是最简单的单元测试运用实例

2.跳过部分测试内容

如果在单元测试中有的部分我们不想测试的话,可以通过一些设置进行跳过。也就是说正常来说一个单元内有十个被测元素,正常顺序是从一到十一个一个来。我么可以通过t.Skip()进行跳过

假设测试函数内我们有步骤

1

22

333

4444

55555

五个步骤,如果在2前面加一个t.Skip()那么2345都不会执行,这个有点类似于普通函数里面的return,一旦遇到就结束函数。

跳过的设置有两种,一种是无论什么情况都跳过。第二种是只有在终端运行go build -short的时候才会跳过

第一种

复制代码
func TestGetSum2(t *testing.T) {
    t.Skip("跳过本测试函数testgetsum2")
    re := GetCheng(5, 5)
    if re != 250 {
       t.Errorf("getsum(5,5) = %d; want 25", re)
    }
}

这种情况,无论怎么运行go test都会跳过这个函数,并且在终端输出跳过本次测试函数信息

有的时候可能会遇到没有输出的情况,这时候我们需要运行的命令时:go text -v这个命令会输出完整的信息

第二种

复制代码
func TestGetSum2(t *testing.T) {
    if testing.Short() {
       t.Skip("跳过本测试函数testgetsum2")
    }

    re := GetCheng(5, 5)
    if re != 250 {
       t.Errorf("getsum(5,5) = %d; want 25", re)
    }
}

这种情况要注意的是只有在终端运行:go test -short的时候testing.Short()才会返回true才会跳过测试信息。如果没有-short后缀就会返回false,则测试函数正常运行

而且如果在ide里面运行函数而不是通过终端的话,ide命令默认的是不带-short后缀的

3.多组数据测试

如果一个测试函数内需要用到多组数据进行测试,我们要是单独的为每一组数据写一个测试函数是很麻烦的。这时候我们可以定义一个结构体,结构体内字段是输入值和结果值。然后遍历这个结构体,每一次遍历的时候都进行一次测试。如果有一次测试不合格,就说明函数有问题

复制代码
func TestGetSum2(t *testing.T) {
    var dataTable = []struct {
       a   int
       b   int
       out int
    }{
       {1, 1, 2},
       {1, 2, 3},
       {100, 100, 200},
    }

    for _, data := range dataTable {
       re := GetSum(data.a, data.b)
       if re != data.out {
          t.Errorf("getsum(%d, %d) = %d; want %d", data.a, data.b, re, data.out)
       }
    }
}

这个的实现是非常简单的,主要是能想到这一点是比较难的。

相关推荐
郝YH是人间理想18 分钟前
Python面向对象
开发语言·python·面向对象
大土豆的bug记录2 小时前
鸿蒙进行视频上传,使用 request.uploadFile方法
开发语言·前端·华为·arkts·鸿蒙·arkui
声声codeGrandMaster3 小时前
Django项目入门
后端·mysql·django
千里码aicood3 小时前
【2025】基于springboot+vue的医院在线问诊系统设计与实现(源码、万字文档、图文修改、调试答疑)
vue.js·spring boot·后端
yang_love10114 小时前
Spring Boot 中的 @ConditionalOnBean 注解详解
java·spring boot·后端
hhw1991124 小时前
c#知识点补充3
开发语言·c#
Antonio9154 小时前
【Q&A】观察者模式在QT有哪些应用?
开发语言·qt·观察者模式
Pandaconda4 小时前
【后端开发面试题】每日 3 题(二十)
开发语言·分布式·后端·面试·消息队列·熔断·服务限流
mqwguardain5 小时前
python常见反爬思路详解
开发语言·python
鱼樱前端5 小时前
mysql事务、行锁、jdbc事务、数据库连接池
java·后端