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)
       }
    }
}

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

相关推荐
卷Java10 分钟前
GPTQ vs AWQ vs GGUF:模型量化工具横向测评
开发语言·windows·python
charlie11451419129 分钟前
嵌入式C++工程实践第20篇:GPIO 输入模式内部电路 —— 芯片是如何“听“到外部信号的
开发语言·c++·stm32·单片机
消失的旧时光-194332 分钟前
Spring Boot 工程化进阶:统一返回 + 全局异常 + AOP 通用工具包
java·spring boot·后端·aop·自定义注解
xinhuanjieyi1 小时前
极语言让ai学习的方法
开发语言·学习
xiaogutou11211 小时前
2026年历史课件PPT模板选购指南:教师备课效率与精度的平衡方案
开发语言·c#
追风筝的人er1 小时前
SpringBoot+Vue3 企业考勤如何处理法定假期?节假日方案、调休补班与工作日判断链路拆解
前端·vue.js·后端
StockTV2 小时前
印度股票实时数据 NSE和BSE的实时行情、K 线及指数数据
java·开发语言·spring boot·python
chaofan9802 小时前
GPT-5.5 领衔 Image 2.0:像素级控制时代,AI 绘图告别开盲盒
开发语言·人工智能·python·gpt·自动化·api
爱码小白2 小时前
Python 异常处理 完整学习笔记
开发语言·python
c++之路2 小时前
C++20概述
java·开发语言·c++20