后端实践--单元测试与性能优化 青训营

简介: 后端实践--单元测试与性能优化 青训营

go单元测试与性能优化

go单元测试与性能优化

这篇博客简单总结go的单元测试和性能优化相关的知识。

1. 单元测试

Go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程是类似的。编写完代码后只需在命令行执行相应命令即可运行测试代码。

go test -v 显示详细信息。

go test -cover 查看测试覆盖率

go test -cover -coverprofile=xx.out 将测试覆盖率输出到xx.out文件

go tool cover -html=xx.out 使用浏览器分析文件

在包目录中以 _test.go为后缀的源代码属于测试代码。不会被go build编译到可执行文件中。测试代码中主要由三种类型的函数:测试函数、性能基准函数、示例函数。

测试代码方便测试,写完..._test.go文件后,修改源代码后直接执行go test 命令即可!!!go test命令会遍历所有的*_test.go文件中符合上述命名规则的函数,然后生成一个临时的main包用于调用相应的测试函数,然后构建并运行、报告测试结果,最后清理测试中生成的临时文件。

1. 测试函数

// 如在 add_test.go 文件里
// 格式必须是这样! Test...
func TestAdd1(t *testing.T){
  // ...
}
func TestAdd2(t *testing.T){
  // ...
}
func Test...(t *testing.T){
  // ...
}

类似的测试逻辑写多个测试函数过于臃肿,可以用测试组,就是放在一个函数里。

func TestAdd(t *testing.T){
  // 利用结构体存储多组测试用例
  type testCase struct{
    // 待测试的函数参数
    ...
    // 期望结果
    want []int
  }
  // 初始化一个结构体切片
  testGroup := []testCase{
    testCase{...},
    testCase{...},
    testCase{...},
  }
  // 遍历切片,调用函数得到结果与want进行比较。
}

这样想看一下某一个特定测试用例的结果就比较麻烦,于是又引出子测试:就是把结构体切片换成map。这样还可以单独的只测试某一个测试用例:

go test -run=TestAdd/case1

func TestAdd(t *testing.T){
  // 利用结构体存储多组测试用例
  type testCase struct{
    // 待测试的函数参数
    ...
    // 期望结果
    want []int
  }
  // 初始化一个map
  testGroup := map[string]testCase{
    "case1": testCase{...}, 
    "case1": testCase{...},
    "case1": testCase{...},
  }
  // 遍历map,调用函数得到结果与want进行比较。
}

2. 性能基准函数

go test -bench=Add 执行基准函数

go test -bench=Add -cpu=1 执行基准函数,只使用一个CPU,默认是跑满所有。

go test -bench=Add -benchmem 执行基准函数同时查看内存情况

// 格式  Benchmark...
func BenchmarkAdd(b testing.B){
  // 必须执行 b.N 遍待测试函数
  for i := 0; i < b.N; i++{
    // 执行待测试函数
  }
}

SetupTeardown : 执行测试之前的准备工作和测试之后的恢复工作。

3. 示例函数

比较少用。

// 格式
func ExampleAdd(){
  // ...
}

2. 性能优化pprof

性能测试 pprof,记录快照信息。

需要测试性能时才开启pprof,不需要的时候就关掉,因为测试性能本身会占用很多资源。

性能优化指标:==CPU使用情况、内存使用、==死锁情况....

1. CPU性能分析

// 开始CPU检测
pprof.StartCPUProfile(w io.Writer) 
// 停止检测
pprof.StopCPUProfile()

2. 内存分析

pprof.WriteHeapProfile(w io.Writer)

3. 相关命令

go tool pprof xxx.pprof 分析生成的文件,进入交互模式

而后 top 查看哪些进程占用CPU,占用时间是多少(就和Linuxtop命令类似);list 进程名 查看进程内具体哪一行代码占用CPU时间最长。

以上就是这篇博客的简单内容,后面继续对所学的内容进行简单归纳整理!加油。

1. 单元测试

go test 命令

go test -v 显示详细信息。

go test -cover 查看测试覆盖率

go test -cover -coverprofile=xx.out 将测试覆盖率输出到xx.out文件

go tool cover -html=xx.out 使用浏览器分析文件

在包目录中以 _test.go为后缀的源代码属于测试代码。不会被go build编译到可执行文件中。测试代码中主要由三种类型的函数:测试函数、性能基准函数、示例函数。

测试代码方便测试,写完..._test.go文件后,修改源代码后直接执行go test 命令即可!!!

1. 测试函数

// 如在 add_test.go 文件里
// 格式必须是这样! Test...
func TestAdd1(t *testing.T){
  // ...
}
func TestAdd2(t *testing.T){
  // ...
}
func Test...(t *testing.T){
  // ...
}

类似的测试逻辑写多个测试函数过于臃肿,可以用测试组,就是放在一个函数里。

func TestAdd(t *testing.T){
  // 利用结构体存储多组测试用例
  type testCase struct{
    // 待测试的函数参数
    ...
    // 期望结果
    want []int
  }
  // 初始化一个结构体切片
  testGroup := []testCase{
    testCase{...},
    testCase{...},
    testCase{...},
  }
  // 遍历切片,调用函数得到结果与want进行比较。
}

这样想看一下某一个特定测试用例的结果就比较麻烦,于是又引出子测试:就是把结构体切片换成map。这样还可以单独的只测试某一个测试用例:

go test -run=TestAdd/case1

func TestAdd(t *testing.T){
  // 利用结构体存储多组测试用例
  type testCase struct{
    // 待测试的函数参数
    ...
    // 期望结果
    want []int
  }
  // 初始化一个map
  testGroup := map[string]testCase{
    "case1": testCase{...}, 
    "case1": testCase{...},
    "case1": testCase{...},
  }
  // 遍历map,调用函数得到结果与want进行比较。
}

2. 性能基准函数

go test -bench=Add 执行基准函数

go test -bench=Add -cpu=1 执行基准函数,只使用一个CPU,默认是跑满所有。

go test -bench=Add -benchmem 执行基准函数同时查看内存情况

// 格式  Benchmark...
func BenchmarkAdd(b testing.B){
  // 必须执行 b.N 遍待测试函数
  for i := 0; i < b.N; i++{
    // 执行待测试函数
  }
}

SetupTeardown : 执行测试之前的准备工作和测试之后的恢复工作。

3. 示例函数

比较少用。

// 格式
func ExampleAdd(){
  // ...
}

2. 性能优化pprof

性能测试 pprof,记录快照信息。

需要测试性能时才开启pprof,不需要的时候就关掉,因为测试性能本身会占用很多资源。

性能优化指标:==CPU使用情况、内存使用、==死锁情况....

1. CPU性能分析

// 开始CPU检测
pprof.StartCPUProfile(w io.Writer) 
// 停止检测
pprof.StopCPUProfile()

2. 内存分析

pprof.WriteHeapProfile(w io.Writer)

3. 相关命令

go tool pprof xxx.pprof 分析生成的文件,进入交互模式

而后 top 查看哪些进程占用CPU,占用时间是多少(就和Linuxtop命令类似);list 进程名 查看进程内具体哪一行代码占用CPU时间最长。

以上就是这篇博客的简单内容,后面继续对所学的内容进行简单归纳整理!加油。

相关文章
|
1月前
|
人工智能 自然语言处理 测试技术
从人工到AI驱动:天猫测试全流程自动化变革实践
天猫技术质量团队探索AI在测试全流程的落地应用,覆盖需求解析、用例生成、数据构造、执行验证等核心环节。通过AI+自然语言驱动,实现测试自动化、可溯化与可管理化,在用例生成、数据构造和执行校验中显著提效,推动测试体系从人工迈向AI全流程自动化,提升效率40%以上,用例覆盖超70%,并构建行业级知识资产沉淀平台。
从人工到AI驱动:天猫测试全流程自动化变革实践
|
1月前
|
数据采集 存储 人工智能
从0到1:天猫AI测试用例生成的实践与突破
本文系统阐述了天猫技术团队在AI赋能测试领域的深度实践与探索,讲述了智能测试用例生成的落地路径。
从0到1:天猫AI测试用例生成的实践与突破
|
2月前
|
Java 测试技术 API
自动化测试工具集成及实践
自动化测试用例的覆盖度及关键点最佳实践、自动化测试工具、集成方法、自动化脚本编写等(兼容多语言(Java、Python、Go、C++、C#等)、多框架(Spring、React、Vue等))
146 6
|
2月前
|
人工智能 边缘计算 搜索推荐
AI产品测试学习路径全解析:从业务场景到代码实践
本文深入解析AI测试的核心技能与学习路径,涵盖业务理解、模型指标计算与性能测试三大阶段,助力掌握分类、推荐系统、计算机视觉等多场景测试方法,提升AI产品质量保障能力。
|
2月前
|
人工智能 自然语言处理 测试技术
AI测试平台的用例管理实践:写得清晰,管得高效,执行更智能
在测试过程中,用例分散、步骤模糊、回归测试效率低等问题常困扰团队。霍格沃兹测试开发学社推出的AI测试平台,打通“用例编写—集中管理—智能执行”全流程,提升测试效率与覆盖率。平台支持标准化用例编写、统一管理操作及智能执行,助力测试团队高效协作,释放更多精力优化测试策略。目前平台已开放内测,欢迎试用体验!
|
3月前
|
人工智能 资源调度 jenkins
精准化回归测试:大厂实践与技术落地解析
在高频迭代时代,全量回归测试成本高、效率低,常导致关键 bug 漏测。精准化测试通过代码变更影响分析,智能筛选高价值用例,显著提升测试效率与缺陷捕获率,实现降本增效。已被阿里、京东、腾讯等大厂成功落地,成为质量保障的新趋势。
|
3月前
|
搜索推荐 Devops 测试技术
避免无效回归!基于MCP协议的精准测试影响分析实践
本文揭示传统测试的"孤岛困境",提出MCP(Model Context Protocol)测试新范式,通过模型抽象业务、上下文感知环境和协议规范协作,实现从机械执行到智能测试的转变。剖析MCP如何颠覆测试流程,展示典型应用场景,并提供团队落地实践路径,助力测试工程师把握质量效率革命的新机遇。
|
3月前
|
人工智能 缓存 自然语言处理
大模型性能测试完全指南:从原理到实践
本文介绍了大模型性能测试的核心价值与方法,涵盖流式响应机制、PD分离架构、五大关键指标(如首Token延迟、吐字率等),并通过实战演示如何使用Locust进行压力测试。同时探讨了多模态测试的挑战与优化方向,帮助测试工程师成长为AI系统性能的“诊断专家”。
|
5月前
|
人工智能 Java 测试技术
SpringBoot 测试实践:单元测试与集成测试
在 Spring Boot 测试中,@MockBean 用于创建完全模拟的 Bean,替代真实对象行为;而 @SpyBean 则用于部分模拟,保留未指定方法的真实实现。两者结合 Mockito 可灵活控制依赖行为,提升测试覆盖率。合理使用 @ContextConfiguration 和避免滥用 @SpringBootTest 可优化测试上下文加载速度,提高测试效率。
341 5
|
6月前
|
存储 消息中间件 前端开发
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
校园圈子系统校园论坛小程序采用uni-app前端框架,支持多端运行,结合PHP后端(如ThinkPHP/Laravel),实现用户认证、社交关系管理、动态发布与实时聊天功能。前端通过组件化开发和uni.request与后端交互,后端提供RESTful API处理业务逻辑并存储数据于MySQL。同时引入Redis缓存热点数据,RabbitMQ处理异步任务,优化系统性能。核心功能包括JWT身份验证、好友系统、WebSocket实时聊天及活动管理,确保高效稳定的用户体验。
425 4
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践

热门文章

最新文章