c/c++语言开发共享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)基准测试代码

测试函数代码如下:

被测函数代码如下:

将以上两个文件放在同一目录下,执行测试命令 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.组测试与子测试

  • 对于一个函数的测试,不仅仅是一组测试用例,所以我们需要写测试组, 对一个函数进行测试,测试的时候一般用集合键值对构成,每一个键对应一组测试数据
  • 进行组测试的时候可能会有个别的组出错,所以使用子测试可以对某个案例进行单独测试这就是测试组与子测试的产生背景

测试函数如下:

待测函数如下:

(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.对主函数进行传参

(2)flag.args

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

2.pprof性能调优

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

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

总结:

这里对常用的测试函数,子测试进行了详细的讲解,对于pprof参数调优仅仅做了个介绍,可以根据自己的兴趣在网上找一部分pprof的例子深入学习,进行自动化测试非常方便。

到此这篇关于go语言单元测试超详细解析的文章就介绍到这了,更多相关go语言单元测试内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!

需要了解更多c/c++开发分享Go语言单元测试超详细解析,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/1057837.html

(0)
上一篇 2022年3月2日
下一篇 2022年3月2日

精彩推荐