返回顶部
首页 > 资讯 > 精选 >Go语言单元测试的示例分析
  • 794
分享到

Go语言单元测试的示例分析

2023-06-29 07:06:21 794人浏览 薄情痞子
摘要

小编给大家分享一下Go语言单元测试的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、单元测试分类及其概念1.基本分类测试函数 函数前缀为Test 主要用

小编给大家分享一下Go语言单元测试的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

一、单元测试分类及其概念

1.基本分类

  • 测试函数 函数前缀为Test 主要用于测试程序的一些逻辑行为是否正确

  • 基准函数 函数名前缀为Benchmark 主要测试函数的性能

  • 示例函数 函数的前缀名为 Example 为文档提示示例文档

2.细说单元测试分类

①测试函数

  • 函数的基本测试

  • 函数的组测试

  • 函数的子测试

  • 测试函数覆盖率(也就是被测试函数有多少代码用于了执行)

  • 在进行测试的时候,要保证被测函数覆盖率为100%,测试函数覆盖率为60%以上,否则写的代码大部分用不到,需要优化

    • ①测试覆盖率可以使用go test -cover

    • go test -cover -coverprofile=c.out(将测试的结果存入文件c.out)

    • 然后使用go tool cover -html=c.out可以打开文件,显示哪些代码没有执行

②基准测试

  • 基准函数测试是做什么的:基准函数会自定义一个时间段用于执行代码,如果代码简洁,被测函数的执行次数需要成倍增加(直到达到基准测试函数给的预期,然后统计一共执行了多少轮,,每轮平均用时多少)

  • 执行基准函数时,首先要写基准函数

  • 基准测试函数的参数是:*testing.B对应的指针变量

  • 在测试函数内部要进行循环,循环的终止条件是b.N

二、结合代码细说每一种测试

1.基准测试

(1)基准测试函数需要注意的点

进行基准测试时往往是对函数的算法进行测验,有时后一个算法在测试数据的基量不同时测试出的效果会不同我们需要对不同数量级的样本进行测试的时候。可以自己写一个盒子作为跳板,测试什么数量级的数据就只进行当前数量级的测试

 测试的时候命令为:go test -bench=.(将所有的跳板函数均执行一遍)或者=特定函数进行特定函数测试-benchtime=time  (在被测试函数在基准函数默认的时间内执行不完时可以拿这个参数进行时间的扩充)在进行基准函数测试的时候,可能需要进行一些前置工作,如果感觉前置工作浪费时间可以使用 b.ResetTimer()对计时器进行重置

(2)基准测试代码

测试函数代码如下:

//文件名 subStr_test.gopackage mainimport (    "reflect"    "testing")func BenchmarkSubStr(b *testing.B) {    for i := 0; i < b.N; i++ {        res := subStr("qwe:qw:es:wqe", ":")        if !reflect.DeepEqual(res, []string{"qwe", "qw", "es", "wqe"}) {            b.Errorf("不匹配")        }    }}func benchmarkFib(b *testing.B, n int) {    for i := 0; i < b.N; i++ {        Fib(n)    }}func BenchmarkFib5(b *testing.B)  { benchmarkFib(b, 5) }func BenchmarkFib10(b *testing.B) { benchmarkFib(b, 10) }func BenchmarkFib15(b *testing.B) { benchmarkFib(b, 15) }func BenchmarkFib20(b *testing.B) { benchmarkFib(b, 20) }

被测函数代码如下:

//文件名 subStr.gopackage mainimport (    "fmt"    "strings")func subStr(str, stre string) []string {    index := strings.Index(str, stre)    var theSub []string    for index >= 0 {        // 先将分隔符前面的数据进行保存        temp := str[:index]        // 将字符串往后移        str = str[index+1:]        // 重新获取下标        index = strings.Index(str, stre)        if temp != "" {            theSub = append(theSub, temp)        } else {            continue        }    }    theSub = append(theSub, str)    return theSub[:]}// 菲薄那契数列func Fib(n int) int {    if n < 2 {        return n    }    return Fib(n-1) + Fib(n-2)}func main() {    fmt.Println(subStr("q:w:ec:wer:cd:scn:cj:c:is:icc:cin:si", ":"))    fmt.Printf("%#v\n", subStr("q:w:ec:wer:cd:scn:cj:c:is:icc:cin:si", ":"))    fmt.Println(123)}

将以上两个文件放在同一目录下,执行测试命令 go test
 

得到测试结果:

    goos: windows
    goarch: amd64
    cpu: Intel(R) Core(TM) i5-8265U CPU @ 1.60GHz
    BenchmarkSubStr-8   1213681       1012 ns/op      352 B/op  14 allocs/op
    PASS
    ok      _/d_/Go语言学习笔记/go语言语法部分/go语言进阶语法/8.单元测试/基准测试    2.410s

2.组测试与子测试

  • 对于一个函数的测试,不仅仅是一组测试用例,所以我们需要写测试组, 对一个函数进行测试,测试的时候一般用集合键值对构成,每一个键对应一组测试数据

  • 进行组测试的时候可能会有个别的组出错,所以使用子测试可以对某个案例进行单独测试这就是测试组与子测试的产生背景

测试函数如下:

package mainimport (    "reflect"    "testing")type testS struct {    str  string    ste  string    want []string}//进行组测试,批量进行测试,如果有哪个地方不满足则进行异常抛出// func TestSubStr(t *testing.T) {//     testMap := map[string]testS{//         "case_1": {"123:eqwe:123", ":", []string{"123", "eqwe", "123"}},//         "case_2": {"13:eqwe3:1@23", "3:", []string{"1", "eqwe", "1@23"}},//         "case_3": {"12@3@:@eq@we@:1@23", "@:", []string{"12@3", "@eq@we", "1@23"}},//         "case_4": {"123:eq@we:1@2@3", "q@", []string{"123:e", "we:1@2@3"}},//         "case_5": {"123:eqwe:123", "2", []string{"1", "3:eqwe:1", "3"}},//         "case_6": {"123:eqwe:123", "eqwe", []string{"123:", ":123"}},//     }//     for k, v := range testMap {//         res := subStr(v.str, v.ste)//         if !reflect.DeepEqual(res, v.want) {//             t.Errorf("%v want:%#v got:%#v", k, v.want, res)//         }//     }// }// 进行子测试,可以针对某个子样本进行测试func TestSubStr(t *testing.T) {    testMap := map[string]testS{        "case_1": {"13:eqwe:123", ":", []string{"123", "eqwe", "123"}},        "case_2": {"3:eqwe3:1@23", "3:", []string{"1", "eqwe", "1@23"}},        "case_3": {"2@3@:@eq@we@:1@23", "@:", []string{"12@3", "@eq@we", "1@23"}},        "case_4": {"123:eq@we:1@2@3", "q@", []string{"123:e", "we:1@2@3"}},        "case_5": {"23:eqwe:123", "2", []string{"1", "3:eqwe:1", "3"}},        "case_6": {"123:eqwe:123", "eqwe", []string{"123:", ":123"}},    }    for k, v := range testMap {        t.Run(k, func(t *testing.T) {            res := subStr(v.str, v.ste)            if !reflect.DeepEqual(res, v.want) {                t.Errorf("want:%#v got:%#v", v.want, res)            }        })    }}

待测函数如下:

package mainimport (    "fmt"    "strings")func subStr(str, stre string) []string {    index := strings.Index(str, stre)    var theSub []string    for index >= 0 {        // 先将分隔符前面的数据进行保存        temp := str[:index]        // 将字符串往后移        str = str[index+len(stre):]        // 重新获取下标        index = strings.Index(str, stre)        if temp != "" {            theSub = append(theSub, temp)        } else {            continue        }    }    theSub = append(theSub, str)    return theSub[:]}func main() {    fmt.Println(subStr("q:w:ec:wer:cd:scn:cj:c:is:icc:cin:si", ":c"))    fmt.Printf("%#v\n", subStr("q:w:ec:wer:cd:scn:cj:c:is:icc:cin:si", ":"))    fmt.Println(123)}

(1).组测试结果分析及命令:

  • 组测试命令仍使用 go test

--- FAIL: TestSubStr (0.00s)
    --- FAIL: TestSubStr/case_1 (0.00s)
       subStr_test.go:46: want:[]string{"123", "eqwe", "123"} got:[]string{"13", "eqwe", "123"}        
    --- FAIL: TestSubStr/case_2 (0.00s)
         subStr_test.go:46: want:[]string{"1", "eqwe", "1@23"} got:[]string{"eqwe", "1@23"}
    --- FAIL: TestSubStr/case_3 (0.00s)
         subStr_test.go:46: want:[]string{"12@3", "@eq@we", "1@23"} got:[]string{"2@3", "@eq@we", "1@23"}
    --- FAIL: TestSubStr/case_5 (0.00s)
         subStr_test.go:46: want:[]string{"1", "3:eqwe:1", "3"} got:[]string{"3:eqwe:1", "3"}
    FAIL
    exit status 1
    FAIL    _/D_/Go语言学习笔记/go语言语法部分/go语言进阶语法/8.单元测试/组测试与子测试     0.155s

(2).子测试结果分析及命令:

  • 例如单独测试case_1,使用的命令为go test -v -run=TestSubStr/case_1(等号后面跟的是上面组测试失败案例FAIL后面的目录)

=== RUN   TestSubStr
=== RUN   TestSubStr/case_1
    subStr_test.go:46: want:[]string{"123", "eqwe", "123"} got:[]string{"13", "eqwe", "123"}
--- FAIL: TestSubStr (0.00s)
    --- FAIL: TestSubStr/case_1 (0.00s)
FAIL
exit status 1
FAIL    _/D_/Go语言学习笔记/go语言语法部分/go语言进阶语法/8.单元测试/组测试与子测试     0.186s

三、pprof调试工具

1.对主函数进行传参

(1)os.Argspackage main1import (    "fmt"    "os")func main() {    // os.Args可以在执行函数的时候传递参数,但是对于-name=xxx没有办法将其解析    if os.Args != nil {        for index, temp := range os.Args {            fmt.Println("第", index+1, "个参数是:", temp)        }    }    fmt.Println("hello")}

(2)flag.Args

  •    相对于os.Args来说,flag.Args使用起来更加方便

package mainimport (    "flag"    "fmt"    "time")func main() {    // 第一个参数为对应的参数,第二个参数为默认值,第三个参数为提示    // 返回的是对应类型的指针    // name := flag.String("name", "Tom", "输入name")    // sex := flag.Bool("sex", true, "是不是男性")    // age := flag.Int("age", 10, "年龄")    // flag.Parse()    // fmt.Println(*name, *sex, *age)    var name string    var age int    var sex bool    flag.StringVar(&name, "name", "Tom", "输入name")    flag.BoolVar(&sex, "sex", true, "是不是男性")    flag.IntVar(&age, "age", 10, "年龄")    tim := flag.Duration("time", time.Hour, "时间")    // 将输入的数据进行解析,不使用这句话的话不能获取到name sex age等属性对应的值    flag.Parse()    fmt.Println(name, sex, age, *tim)    fmt.Println(flag.Args())  //以切片的方式返回命令行之外的其他参数    fmt.Println(flag.NArg())  //返回命令行之外的其他参数的个数    fmt.Println(flag.NFlag()) //返回使用命令行的参数的个数}

2.pprof性能调优

pprof调试工具进行调试,主要看待测模块在内存于时间上的效益调试的时候只会显示耗费时间空间较多的代码段.

生成调试代码块的文件:go run xx.exe -cpu....
使用go语言工具查看代码块所存在的问题:go tool pprof cpu.pprof

package mainimport (    "flag"    "fmt"    "os"    "runtime/pprof"    "time")// 一段有问题的代码func logicCode() {    var c chan int    for {        select {        case v := <-c:            fmt.Printf("recv from chan, value:%v\n", v)        default:        }    }}func main() {    var isCPUPprof bool    var isMemPprof bool    //获取接收到的参数    flag.BoolVar(&isCPUPprof, "cpu", false, "turn cpu pprof on")    flag.BoolVar(&isMemPprof, "mem", false, "turn mem pprof on")    flag.Parse()    //判断进行什么测试,然后执行分支,并将信息保存到相应的文件内。    if isCPUPprof {        file, err := os.Create("./cpu.pprof")        if err != nil {            fmt.Printf("create cpu pprof failed, err:%v\n", err)            return        }        pprof.StartcpUProfile(file)        defer pprof.StopCPUProfile()    }    for i := 0; i < 8; i++ {        go logicCode()    }    time.Sleep(20 * time.Second)    if isMemPprof {        file, err := os.Create("./mem.pprof")        if err != nil {            fmt.Printf("create mem pprof failed, err:%v\n", err)            return        }        pprof.WriteHeapProfile(file)        file.Close()    }}

以上是“Go语言单元测试的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Go语言单元测试的示例分析

本文链接: https://lsjlt.com/news/323501.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Go语言单元测试的示例分析
    小编给大家分享一下Go语言单元测试的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、单元测试分类及其概念1.基本分类测试函数 函数前缀为Test 主要用...
    99+
    2023-06-29
  • Go语言单元测试与性能测试示例分析
    这篇文章主要讲解了“Go语言单元测试与性能测试示例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言单元测试与性能测试示例分析”吧!概述测试不是Go语言独有的,其实在很多语言都有测试...
    99+
    2023-06-25
  • Go语言单元测试和基准测试实例代码分析
    本篇内容主要讲解“Go语言单元测试和基准测试实例代码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go语言单元测试和基准测试实例代码分析”吧!背景测试的出现是为了避免项目中出现重大事故测试是...
    99+
    2023-07-05
  • Go 语言进阶单元测试示例详解
    目录前言测试单元测试规则示例assert覆盖率依赖Mock基准测试前言 本文从单元测试实践角度出发,提升对代码质量的意识。 本文内容主要包括:单元测试、Mock测试、基准测试。 测...
    99+
    2023-01-28
    Go 语言单元测试 Go 单元测试
  • Go 语言单元测试
    php小编鱼仔今天为大家介绍一下Go语言的单元测试。在软件开发中,单元测试是非常重要的一环。通过编写测试用例,我们可以验证代码的正确性,提高代码质量和可维护性。Go语言提供了丰富的测试...
    99+
    2024-02-09
    go语言
  • vue单元测试的示例分析
    小编给大家分享一下vue单元测试的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!为什么要引进单元测试?现今时代,各种编程语言,开发框架,集成工具蓬勃发展,然而软件工程师们却仍然挣扎在第一线,被bug、遗留代码、技术...
    99+
    2023-06-14
  • Go语言基础单元测试与性能测试示例详解
    目录概述单元测试代码说明如下问题注意性能测试基本使用自定义测试时间概述 测试不是Go语言独有的,其实在很多语言都有测试,例如:Go、Java、Python… 要想成为一名合格的大牛,...
    99+
    2024-04-02
  • Angular中单元测试的示例分析
    这篇文章给大家分享的是有关Angular中单元测试的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。第一个测试用例当创建Angular应用后,在package.json文件...
    99+
    2024-04-02
  • Go语言工程实践单元测试基准测试示例详解
    目录背景测试单元测试演示覆盖率依赖文件处理Mock基准测试小结背景 测试的出现是为了避免项目中出现重大事故 测试是避免事故的最后一道屏障 测试 单元测试的覆盖率在一定程度上而言,...
    99+
    2023-02-05
    Go语言单元测试基准测试 Go语言测试
  • Go语言单元测试超详细解析
    目录一、单元测试分类及其概念1.基本分类2.细说单元测试分类二、结合代码细说每一种测试1.基准测试2.组测试与子测试三、pprof调试工具1.对主函数进行传参2.pprof性能调优前...
    99+
    2024-04-02
  • Vue组件单元测试的示例分析
    这篇文章将为大家详细讲解有关Vue组件单元测试的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。关于 Vue 组件单元测试最常见的问题就是“我究竟应该测试什么?”虽...
    99+
    2024-04-02
  • 基于SpringBoot Mock单元测试的示例分析
    小编给大家分享一下基于SpringBoot Mock单元测试的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Junit中的基本注解:@Test:使用该注解标注的public void方法会表示为一个测试方...
    99+
    2023-06-25
  • C语言实现单元测试的示例详解
    目录前沿使用前提测试框架如下测试方法编写文件验证前沿 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际...
    99+
    2024-04-02
  • Go语言中的性能测试与单元测试的区别
    性能测试评估应用程序在不同负载下的性能,而单元测试验证单个代码单元的正确性。性能测试侧重于测量响应时间和吞吐量,而单元测试关注函数输出和代码覆盖率。性能测试通过高负载和并发模拟实际环境,...
    99+
    2024-05-08
    单元测试 性能测试 go语言
  • java单元测试JUnit框架原理的示例分析
    小编给大家分享一下java单元测试JUnit框架原理的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!具体如下:1 简介JUnit是一个Java语言的单元测试框架,它由 Kent Beck 和 Erich Gamma...
    99+
    2023-05-30
    java junit
  • ASP.NET Core单元测试中如何Mock HttpClient.GetStringAsync()的示例分析
    ASP.NET Core单元测试中如何Mock HttpClient.GetStringAsync()的示例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人...
    99+
    2024-04-02
  • Go语言中Get/Post请求测试实例分析
    本篇内容主要讲解“Go语言中Get/Post请求测试实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go语言中Get/Post请求测试实例分析”吧!gin安装先将gin安装一下,安装依赖g...
    99+
    2023-06-30
  • HTML元素属性测试的示例分析
    这篇文章给大家分享的是有关HTML元素属性测试的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。code 元素的含义(语义)为“代码内容”,FireFox 在渲染该元素时,...
    99+
    2024-04-02
  • Android编程之单元测试实例分析
    本文实例讲述了Android编程之单元测试用法。分享给大家供大家参考,具体如下: 在实际开发中,开发android软件的过程需要不断地进行测试。使用Junint测试框架,是正规...
    99+
    2022-06-06
    程之 单元 单元测试 测试 Android
  • 一文带你了解Go语言中的单元测试
    目录基本概念示例一:取整函数基本测试示例二:Fail()函数示例三:FailNow函数实例四:Log和Fetal函数基本概念 上一节提到,代码完成的标准之一还包含了单元测试,这部分也...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作