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

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

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

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

相关文章
|
17天前
|
测试技术
软件测试的艺术:探索式测试的实践与思考
在软件开发的广阔海洋中,测试是确保航船稳健行驶的关键。本文将带你领略探索式测试的魅力,一种结合创造性思维和严格方法论的测试方式。我们将一起揭开探索式测试的神秘面纱,了解其核心概念、实施步骤和带来的效益。通过实际代码示例,你将学会如何将探索式测试融入日常的软件质量保证流程中,提升测试效率与质量。
|
17天前
|
消息中间件 监控 持续交付
后端开发中的微服务架构设计与实践####
在当今快速发展的软件开发领域,微服务架构已成为构建高效、可扩展和易于维护应用的关键策略。本文将深入探讨微服务架构的核心概念、设计原则与实战技巧,通过实例解析如何在后端开发中有效实施微服务,以应对复杂业务需求和技术挑战。我们将从微服务的拆分策略、通信机制、数据管理到持续集成/持续部署(CI/CD)流程,全面剖析其背后的技术细节与最佳实践,为读者提供一份详尽的微服务架构设计与实践指南。 ####
|
6天前
|
消息中间件 运维 安全
后端开发中的微服务架构实践与挑战####
在数字化转型的浪潮中,微服务架构凭借其高度的灵活性和可扩展性,成为众多企业重构后端系统的首选方案。本文将深入探讨微服务的核心概念、设计原则、关键技术选型及在实际项目实施过程中面临的挑战与解决方案,旨在为开发者提供一套实用的微服务架构落地指南。我们将从理论框架出发,逐步深入至技术细节,最终通过案例分析,揭示如何在复杂业务场景下有效应用微服务,提升系统的整体性能与稳定性。 ####
22 1
|
8天前
|
存储 缓存 监控
后端性能优化:从理论到实践
在数字化时代,后端服务的性能直接影响着用户体验和业务效率。本文将深入探讨后端性能优化的重要性,分析常见的性能瓶颈,并提出一系列切实可行的优化策略。我们将从代码层面、数据库管理、缓存机制以及系统架构设计等多个维度出发,结合具体案例,详细阐述如何通过技术手段提升后端服务的响应速度和处理能力。此外,文章还将介绍一些先进的监控工具和方法,帮助开发者及时发现并解决性能问题。无论是初创公司还是大型企业,本文提供的策略都有助于构建更加高效、稳定的后端服务体系。
29 3
|
8天前
|
负载均衡 监控 API
后端开发中的微服务架构实践与挑战
本文深入探讨了微服务架构在后端开发中的应用,分析了其优势和面临的挑战,并通过案例分析提出了相应的解决策略。微服务架构以其高度的可扩展性和灵活性,成为现代软件开发的重要趋势。然而,它同时也带来了服务间通信、数据一致性等问题。通过实际案例的剖析,本文旨在为开发者提供有效的微服务实施指导,以优化系统性能和用户体验。
|
14天前
|
机器学习/深度学习 人工智能 自然语言处理
智能化软件测试:AI驱动的自动化测试策略与实践####
本文深入探讨了人工智能(AI)在软件测试领域的创新应用,通过分析AI技术如何优化测试流程、提升测试效率及质量,阐述了智能化软件测试的核心价值。文章首先概述了传统软件测试面临的挑战,随后详细介绍了AI驱动的自动化测试工具与框架,包括自然语言处理(NLP)、机器学习(ML)算法在缺陷预测、测试用例生成及自动化回归测试中的应用实例。最后,文章展望了智能化软件测试的未来发展趋势,强调了持续学习与适应能力对于保持测试策略有效性的重要性。 ####
|
13天前
|
敏捷开发 前端开发 Java
软件测试中的自动化测试框架选择与实践
在当今软件开发生命周期中,自动化测试已成为提升软件质量和开发效率的关键手段。本文旨在探讨自动化测试框架的选择标准及其在实际项目中的应用实践。通过对主流自动化测试框架的分析比较,结合具体案例,本文将阐述如何根据项目需求和团队特点选择合适的自动化测试工具,并分享实施过程中的经验教训。
30 1
|
17天前
|
消息中间件 负载均衡 测试技术
后端开发中的微服务架构实践与挑战####
本文旨在探讨微服务架构在后端开发中的应用实践,深入分析其带来的优势与面临的挑战。通过剖析真实案例,揭示微服务转型过程中的关键技术决策、服务拆分策略、以及如何有效应对分布式系统的复杂性问题。文章还将提供一套评估企业是否适合采用微服务架构的框架,帮助读者更好地理解这一架构模式,并为企业的技术选型提供参考。 ####
|
22天前
|
Kubernetes API Docker
构建高效后端服务:微服务架构的深度实践与优化####
本文深入探讨了微服务架构在现代后端开发中的应用,通过剖析其核心概念、设计原则及实施策略,结合具体案例分析,展示了如何有效提升系统的可扩展性、可靠性和维护性。文章还详细阐述了微服务拆分的方法论、服务间通信的最佳实践、以及容器化与编排工具(如Docker和Kubernetes)的应用技巧,为读者提供了一份全面的微服务架构落地指南。 ####
|
13天前
|
安全 测试技术 持续交付
后端开发中的微服务架构实践与挑战####
本文深入探讨了微服务架构在现代后端开发中的应用,通过一个虚构项目案例,详细阐述了从单体架构向微服务架构转型的过程、面临的挑战及解决方案。不同于常规摘要的概述性质,本文摘要旨在直接引入核心议题——如何有效实施微服务以提升系统的可扩展性、灵活性和容错能力,同时揭示转型过程中常见的技术陷阱与最佳实践策略,为读者提供实战指南。 ####
17 0

热门文章

最新文章