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

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

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时间最长。

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

相关文章
|
5天前
|
API 持续交付 开发者
后端开发中的微服务架构实践与挑战
在数字化时代,后端服务的构建和管理变得日益复杂。本文将深入探讨微服务架构在后端开发中的应用,分析其在提高系统可扩展性、灵活性和可维护性方面的优势,同时讨论实施微服务时面临的挑战,如服务拆分、数据一致性和部署复杂性等。通过实际案例分析,本文旨在为开发者提供微服务架构的实用见解和解决策略。
|
1天前
|
消息中间件 监控 数据管理
后端开发中的微服务架构实践与挑战####
【10月更文挑战第29天】 在当今快速发展的软件开发领域,微服务架构已成为构建高效、可扩展和易于维护应用程序的首选方案。本文探讨了微服务架构的核心概念、实施策略以及面临的主要挑战,旨在为开发者提供一份实用的指南,帮助他们在项目中成功应用微服务架构。通过具体案例分析,我们将深入了解如何克服服务划分、数据管理、通信机制等关键问题,以实现系统的高可用性和高性能。 --- ###
20 2
|
4天前
|
存储 监控 NoSQL
构建高效后端服务:从理论到实践
【10月更文挑战第30天】在数字化时代,后端服务是支撑起整个互联网的基石。一个高效、稳定且可扩展的后端系统对于任何在线业务都是至关重要的。本文将带你了解如何从零开始构建一个高效的后端服务,涵盖了设计思路、关键技术选型、开发流程以及性能优化等方面。我们将通过实际的代码示例和案例分析,深入探讨如何实现一个既快速又可靠的后端系统。无论你是后端开发的新手还是有经验的开发者,这篇文章都将为你提供宝贵的参考和启示。
17 3
|
2天前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
9 1
|
11天前
|
机器学习/深度学习 人工智能 自然语言处理
探索软件测试的边界:从基础到高级的实践之旅
【10月更文挑战第21天】 在当今数字化时代,软件已成为我们生活和工作中不可或缺的一部分。随着技术的快速发展,对软件质量的要求也日益提高。本文旨在通过深入浅出的方式,带领读者踏上一场从基础到高级的软件测试实践之旅。我们将探讨软件测试的基本概念、重要性以及如何有效地进行测试规划和执行。通过具体案例分析,揭示常见错误及其解决方案,同时展望未来软件测试领域的发展趋势。无论你是软件开发新手还是经验丰富的测试工程师,这篇文章都将为你提供宝贵的见解和启发。
29 8
|
10天前
|
存储 SQL 缓存
构建高效后端服务:从理论到实践
在当今的软件开发领域,后端服务扮演着至关重要的角色。它不仅支撑着应用程序的核心功能,还影响着系统的性能、可扩展性和用户体验。本文将深入探讨如何构建一个高效的后端服务,涵盖从需求分析到架构设计,再到技术选型和性能优化的全过程。我们将通过实际案例,展示如何在保证数据一致性和安全性的前提下,实现高并发处理和快速响应。无论你是后端开发的新手还是有经验的工程师,这篇文章都将为你提供宝贵的见解和实用的建议。
|
11天前
|
缓存 运维 监控
后端开发中的微服务架构实践与挑战#### 一、
【10月更文挑战第22天】 本文探讨了微服务架构在后端开发中的应用实践,深入剖析了其核心优势、常见挑战及应对策略。传统后端架构难以满足快速迭代与高可用性需求,而微服务通过服务拆分与独立部署,显著提升了系统的灵活性和可维护性。文章指出,实施微服务需关注服务划分的合理性、通信机制的选择及数据一致性等问题。以电商系统为例,详细阐述了微服务改造过程,包括用户、订单、商品等服务的拆分与交互。最终强调,微服务虽优势明显,但落地需谨慎规划,持续优化。 #### 二、
|
10天前
|
监控 安全 jenkins
探索软件测试的奥秘:自动化测试框架的搭建与实践
【10月更文挑战第24天】在软件开发的海洋里,测试是确保航行安全的灯塔。本文将带领读者揭开软件测试的神秘面纱,深入探讨如何从零开始搭建一个自动化测试框架,并配以代码示例。我们将一起航行在自动化测试的浪潮之上,体验从理论到实践的转变,最终达到提高测试效率和质量的彼岸。
|
5天前
|
NoSQL 测试技术 Go
自动化测试在 Go 开源库中的应用与实践
本文介绍了 Go 语言的自动化测试及其在 `go mongox` 库中的实践。Go 语言通过 `testing` 库和 `go test` 命令提供了简洁高效的测试框架,支持单元测试、集成测试和基准测试。`go mongox` 库通过单元测试和集成测试确保与 MongoDB 交互的正确性和稳定性,使用 Docker Compose 快速搭建测试环境。文章还探讨了表驱动测试、覆盖率检查和 Mock 工具的使用,强调了自动化测试在开源库中的重要性。
|
6天前
|
设计模式 人工智能 API
后端开发中的微服务架构实践与挑战#### 一、
本文将深入浅出地探讨微服务架构在后端开发中的应用实践,分析其带来的优势与面临的挑战。通过具体案例,展示如何有效地构建、部署和管理微服务,旨在为读者提供一份实用的微服务架构实施指南。 #### 二、