golang 单元测试框架实践

本文涉及的产品
性能测试 PTS,5000VUM额度
简介: 日常开发中, 测试是不能缺少的,每次手动测试非常费时费力,通过单元测试可以达到一次实现多次利用;单元测试主要是通过模拟业务中的参数,调用我们的函数,然后获取执行结果,再判断结果是否符合规则;同时还可以对某一个方法进行性能分析在Go 标准库中有一个叫做 `testing` 的测试框架, 可以用于单元测试和性能测试. 它是和命令 `go test` 集成使用的,测试文件是以后缀 `_test.go` 命名的, 通常和被测试的文件放在同一个包中.

一、简介

日常开发中, 测试是不能缺少的,每次手动测试非常费时费力,通过单元测试可以达到一次实现多次利用;

单元测试主要是通过模拟业务中的参数,调用我们的函数,然后获取执行结果,再判断结果是否符合规则;同时还可以对某一个方法进行性能分析

在Go 标准库中有一个叫做 testing 的测试框架, 可以用于单元测试和性能测试. 它是和命令 go test 集成使用的,测试文件是以后缀 _test.go 命名的, 通常和被测试的文件放在同一个包中.

规则:

  • 单元测试代码的go文件必须以_test.go结尾,Go语言测试工具只认符合这个规则的文件
  • 单元测试的函数名必须以Test开头,是可导出公开的函数。备注:函数名最好是Test+要测试的方法函数名
  • 测试函数的签名必须接收一个指向testing.T类型的指针作为参数,并且该测试函数不能返回任何值

二、实验环境

单元测试我们大部分情况下无需增加或修改业务代码,只需增加单元测试代码即可,在这个实验过程中,我们简单编写一个简单的业务代码,用来模拟项目中的业务代码;然后再添加单元测试代码进行测试。

2.1 编写被测试的代码

我们找一个空文件夹,新建一个main.go文件,在文件中将一下代码复制进去并保存

package main

func Sum(count int) int {
    count--
    return count
}

2.2 编写单元测试代码

接着我们继续在当前文件夹下新建单元测试代码,按照简介中的规则,我们需要新建一个名为main_test.go的文件,然后在文件中编写测试代码,示例代码如下

package main

import (
    "testing"
)

//单元测试
func TestSum(t *testing.T) {
    //准备参数
    param := 10
    //执行函数
    ret := Sum(param)
    //判断结果是否符合预期
    if ret != 9 {
        t.Error("Sum result failed")
    }
}

//性能测试
func BenchmarkSum(b *testing.B) {
    //准备参数
    param := 10
    //执行函数
    for i := 0; i < b.N; i++ {
        Sum(param)
    }
}

三、单元测试使用

3.1 普通测试

普通测试主要是验证返回的结果是否符合预期,执行的命令如下所示

go test -v  main_test.go  main.go

命令执行后,返回的结果如下所示
image

从上图中可以看到,单元测试提示测试通过,说明我们程序符合预期

3.2 性能测试

性能测试主要是通过多次调用程序,总耗时来分析程序的性能,类似于AB压力测试,执行命令如下所示

go test -v -bench="BenchmarkSum$"  --run=none main_test.go  main.go

命令中的-bench="BenchmarkSum$"参数代表要窒息哪一个方法,执行结果如下所示
image

在上图中可以看到程序被调用了1000000000次,平均耗时0.254ns

3.3 性能分析

性能分析主要是查看方法中具体的瓶颈,比如A方法调用了C、B、D多个方法,具体耗时在什么位置,我们可以在上一条性能测试的命令中加入-cpuprofile cpu.out参数(文章附录有多种分析指标类型)加入到性能测试中的具体信息保存

go test -v -bench="BenchmarkSum$"  --run=none  -cpuprofile cpu.out  main_test.go  main.go

image
通过go 自带工具分析保存的文件

go tool pprof cpu.out

命令执行之后返回信息如下图所示
image

通过第三方工具视图分析

apt install graphviz  && go tool pprof -http=":" cpu.out

命令执行之后,会返回一个localhost域名加随机端口的网址,打开网址之后,能看到如下信息,因为我测试的方法比较简单

image

四、附录

各参数含义翻译

-blockprofile block.out

将goroutine阻塞配置文件写入指定文件
当所有测试完成时。
按照-c的方式编写测试二进制文件。

-blockprofilerate n


控制细节提供的goroutine阻塞配置文件
调用运行时。SetBlockProfileRate与n。
参见" go doc run . setblockprofilerate "
剖析器的目标是平均每个阻塞事件采样一次
n纳秒的程序花费被阻塞。默认情况下,
如果以及。块配置文件没有设置这个标志,所有的阻塞事件
,相当于-test.blockprofilerate=1。

-coverprofile cover.out


在所有测试通过后,向文件写入覆盖率配置文件。
设置覆盖。

-cpuprofile cpu.out


退出前将CPU配置文件写入指定文件。
按照-c的方式编写测试二进制文件。

-memprofile mem.out


通过所有测试后,将分配配置文件写入该文件。
按照-c的方式编写测试二进制文件。

-memprofilerate n


启用更精确(和昂贵)的内存分配配置文件
设置runtime.MemProfileRate。参见" go doc run . memprofilerate "。
要配置所有内存分配,使用-test.memprofilerate=1。

-mutexprofile mutex.out


将互斥锁争用配置文件写入指定文件
当所有测试完成时。
按照-c的方式编写测试二进制文件。

-mutexprofilefraction n


样本1在n堆栈的踪迹goroutines持有a
争用互斥锁。


作者:汤青松

日期:2020-08-11

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
目录
相关文章
|
9天前
|
测试技术
软件测试的艺术:探索式测试的实践与思考
在软件开发的广阔海洋中,测试是确保航船稳健行驶的关键。本文将带你领略探索式测试的魅力,一种结合创造性思维和严格方法论的测试方式。我们将一起揭开探索式测试的神秘面纱,了解其核心概念、实施步骤和带来的效益。通过实际代码示例,你将学会如何将探索式测试融入日常的软件质量保证流程中,提升测试效率与质量。
|
13天前
|
敏捷开发 Java 测试技术
探索软件测试中的自动化测试框架
在软件开发的生命周期中,软件测试扮演着至关重要的角色。随着技术的不断进步和软件项目的日益复杂化,传统的手动测试方法已经无法满足高效、准确的测试需求。自动化测试作为一种提高测试效率和质量的有效手段,越来越受到开发者和测试者的青睐。本文将深入探讨自动化测试框架的重要性、常见的自动化测试工具以及如何选择合适的自动化测试框架。
37 10
|
15天前
|
设计模式 前端开发 JavaScript
自动化测试框架设计原则与最佳实践####
本文深入探讨了构建高效、可维护的自动化测试框架的核心原则与策略,旨在为软件测试工程师提供一套系统性的方法指南。通过分析常见误区,结合行业案例,阐述了如何根据项目特性定制自动化策略,优化测试流程,提升测试覆盖率与执行效率。 ####
41 6
|
15天前
|
机器学习/深度学习 人工智能 jenkins
软件测试中的自动化与持续集成实践
在快速迭代的软件开发过程中,自动化测试和持续集成(CI)是确保代码质量和加速产品上市的关键。本文探讨了自动化测试的重要性、常见的自动化测试工具以及如何将自动化测试整合到持续集成流程中,以提高软件测试的效率和可靠性。通过案例分析,展示了自动化测试和持续集成在实际项目中的应用效果,并提供了实施建议。
|
15天前
|
监控 jenkins 测试技术
自动化测试框架的构建与实践
【10月更文挑战第40天】在软件开发周期中,测试环节扮演着至关重要的角色。本文将引导你了解如何构建一个高效的自动化测试框架,并深入探讨其设计原则、实现方法及维护策略。通过实际代码示例和清晰的步骤说明,我们将一起探索如何确保软件质量,同时提升开发效率。
34 1
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
智能化软件测试:AI驱动的自动化测试策略与实践####
本文深入探讨了人工智能(AI)在软件测试领域的创新应用,通过分析AI技术如何优化测试流程、提升测试效率及质量,阐述了智能化软件测试的核心价值。文章首先概述了传统软件测试面临的挑战,随后详细介绍了AI驱动的自动化测试工具与框架,包括自然语言处理(NLP)、机器学习(ML)算法在缺陷预测、测试用例生成及自动化回归测试中的应用实例。最后,文章展望了智能化软件测试的未来发展趋势,强调了持续学习与适应能力对于保持测试策略有效性的重要性。 ####
|
10天前
|
JavaScript 安全 编译器
TypeScript 与 Jest 测试框架的结合使用,从 TypeScript 的测试需求出发,介绍了 Jest 的特点及其与 TypeScript 结合的优势,详细讲解了基本测试步骤、常见测试场景及异步操作测试方法
本文深入探讨了 TypeScript 与 Jest 测试框架的结合使用,从 TypeScript 的测试需求出发,介绍了 Jest 的特点及其与 TypeScript 结合的优势,详细讲解了基本测试步骤、常见测试场景及异步操作测试方法,并通过实际案例展示了其在项目中的应用效果,旨在提升代码质量和开发效率。
30 6
|
5天前
|
机器学习/深度学习 人工智能 Java
探索软件测试中的自动化框架选择与优化策略####
本文深入探讨了在软件测试领域,面对众多自动化测试框架时,如何根据项目特性、团队技能及长远规划做出最佳选择,并进一步阐述了优化这些框架以提升测试效率与质量的策略。通过对比分析主流自动化测试框架的优劣,结合具体案例,本文旨在为测试团队提供一套实用的框架选型与优化指南。 ####
|
6天前
|
敏捷开发 前端开发 Java
软件测试中的自动化测试框架选择与实践
在当今软件开发生命周期中,自动化测试已成为提升软件质量和开发效率的关键手段。本文旨在探讨自动化测试框架的选择标准及其在实际项目中的应用实践。通过对主流自动化测试框架的分析比较,结合具体案例,本文将阐述如何根据项目需求和团队特点选择合适的自动化测试工具,并分享实施过程中的经验教训。
15 1
|
3月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
121 4
Golang语言之管道channel快速入门篇