当前位置: 首页 > article >正文

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

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

 


http://www.kler.cn/a/596799.html

相关文章:

  • 计算机基础:编码04,认识反码和补码
  • html转png完美方案
  • Java进阶 面试速记
  • 第二十八篇 数据获取与数据分析:数仓体系下的专业化分工与协同
  • Docker与K8S是什么该怎么选?
  • VMware主机换到高配电脑,高版本系统的问题
  • 使用AI一步一步实现若依(20)
  • MySQL 事务(Transaction)详解
  • OSI通信模型
  • 搭建基于DNS主从架构、NFS共享存储及Nginx服务的完整环境
  • C++回顾 day1
  • 【Matlab笔记_22】Matlab地图矩阵左右置换
  • 阿里云国际站代理商:为什么边缘计算需要分布式防护?
  • 2025.3.22总结
  • DAY36贪心算法Ⅴ
  • linux内核数据结构分析之链表
  • 浅谈Qt事件子系统——以可拖动的通用Widget为例子
  • 腾讯 客户端实习 凉经(3)
  • LeetCode707设计链表
  • 四台电脑共享外设的终极方案:USB3.0 共享切换器 SV04 深度解析