【测试开发】单元测试、基准测试和性能分析(以 Go testing 为例)

一、为什么需要测试🤔️

  1. 你写不出 bug-free 的代码。
  2. 你认为自己写出了 bug-free 的代码,但它在你意想不到的地方出错了。
  3. 你觉得自己写出了永不出错的代码,但它的性能十分糟糕。

二、在开发过程中做好测试(理想情况下)💯

“测试左移”距离真正落地或许还有不短的距离,但在开发过程中注重自己的代码质量,至少养成写单测的习惯还是很有必要的。
在 Go 语言的原生库中就带有测试工具,放在 testing 下,支持单元测试、基准测试等。

2.1 单元测试(Unit test)🛢️

单元测试,unit test。单元测试是软件开发中的一种测试方法,旨在对软件系统的最小可测试单元进行测试,例如函数或方法,以确保它们按照预期运行。在单元测试的过程中,开发人员编写测试用例,对被测试单元进行测试,收集测试结果,并与预期结果进行比较,以确定被测试单元是否通过。

使用 Go Testing 做单元测试通常需要遵守以下规则:

  1. 文件名以 xxx_test.go 命名。
  2. 需要 import testing 包;写的单测函数应以 Test… 开头,传入参数为 *testing.T
  3. 单测文件应与被测文件在同一文件夹下。

下面是使用 Go Testing 单元测试的示例:

package test

import "testing"

func TestSomething(t *testing.T) { ... }

写完单测后在终端(命令行)执行 go test 即可。有时会无法识别出需要编译的文件,因此得明确指定,如 go test xxx_test.go sample1.go,表示完成单测需要编译这两个 go 文件。

2.2 基准测试(Benchmark test)🛋️

基准测试,也称为性能测试。其目的是评估代码在给定条件下的性能,例如处理器速度、内存容量、I/O性能等,并比较不同实现下的性能差异。

细分来看,Benchmark 可以分为两种类型:(1)负载基准测试(2)适应性基准测试。

  • 负载基准测试是指用来测试系统在不同负载状态下如何运行的基准测试。这种测试通常是通过让系统执行一些计算密集型任务或者是I/O密集型任务来进行的,以检查系统的CPU、内存和磁盘性能等。
  • 适应性基准测试是指用来测试系统对负载变化的适应能力的基准测试。这种测试通常是通过模拟用户和应用程序之间的交互来进行,以检查系统的响应时间、吞吐量、并发性等性能指标。

和单元测试一样,在 Go Testing 下写基准测试也要满足一些规则:

  1. 同样地,文件名应该以 xxx_test.go 命名;也需要 import testing 包。
  2. 写的 Benchmark 函数应以 Benchmark… 开头,传入参数为 *testing.B
  3. 同样地,基准测试文件应与被测文件在同一文件夹下。

下面是使用 Go Testing 单元测试的示例:

package test

import "testing"

func BenchmarkSomething(b *testing.B) { ... }

写完后执行 go test -bench='Something$' .-bench 可以不带参数,即 go test -bench .,它所带的参数表示正则匹配,会匹配以 Something 结尾的基准测试函数。

2.3 性能分析(Performance profiling)🔍

性能分析,performance profiling。在代码测试中的性能分析,是指通过一系列的测试和分析,来评估代码的性能、瓶颈和优化策略。它通常会用来检测软件系统的瓶颈,找出系统性能瓶颈,以便对其进行优化,从而提升软件系统的性能。

性能分析往往是和 Benchmark 一起出现的,只不过性能分析更侧重于负载基准测试,可以通过指定 go test 的参数获取相关的负载信息。若要分析 CPU 的性能数据,可以通过 -cpuprofile=cpu.prof 来生成 cpu.prof 文件用于分析。

go test -bench='xxx' xxx_test.go -cpuprofile=cpu.prof

使用 go tool pprof xxx.prof 命令来分析 prof 文件内容,在 Linux 系统安装了 Graphviz 的前提下可以使用 gif 命令生成 CPU 时间消耗流程图。下图是截取了部分的 CPU 时间消耗流程图。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值