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进行规格选择与性能压测。
目录
相关文章
|
4天前
|
敏捷开发 测试技术 持续交付
探索自动化测试框架的设计与实现
【9月更文挑战第36天】在软件开发的海洋中,自动化测试如同一艘能够带领我们高效航行的帆船。本文将引导你理解自动化测试框架的核心概念,并通过一个简化的例子展示如何搭建自己的测试框架。我们将一同揭开自动化测试的神秘面纱,让你从新手成长为能够独立设计和实现测试框架的高手。
|
28天前
|
数据可视化 数据管理 测试技术
聊聊自动化测试框架
关于自动化测试框架的一些理解和思考总结,就是上面这些内容,提到的一些框架组件可能存在不合理的地方,仅供参考,如有更好的建议,请指出,不胜感激
36 4
聊聊自动化测试框架
|
8天前
|
Web App开发 敏捷开发 数据管理
自动化测试框架的设计与实现
【9月更文挑战第32天】在软件开发的海洋中,自动化测试如同一艘精确导航的船只,确保我们的应用程序能够在波涛汹涌的技术潮流中稳健航行。本文将带你领略自动化测试框架的设计之美,从搭建基础到功能扩展,再到维护实践,我们将一起探索如何打造一个既高效又灵活的自动化测试体系。
14 3
|
24天前
|
敏捷开发 IDE 测试技术
自动化测试框架的选择与应用
【9月更文挑战第16天】在软件开发周期中,测试环节扮演着至关重要的角色。随着敏捷开发和持续集成的流行,自动化测试成为提升软件质量和效率的关键手段。本文将探讨如何根据项目需求选择合适的自动化测试框架,并通过实际案例分析展示其在软件开发过程中的应用。我们将从单元测试、集成测试到端到端测试等多个层面,讨论自动化测试的最佳实践和常见问题解决策略。
|
14天前
|
敏捷开发 Java 测试技术
自动化测试框架的选择与应用
【9月更文挑战第26天】在软件开发的海洋里,自动化测试是那一盏指路明灯。它不仅加快了开发周期,还提升了软件质量。本文将带你探索自动化测试框架的世界,了解它们的核心特性、适用场景及如何根据项目需求做出明智选择。让我们一起启航,找到那把打开高效、稳定软件生产大门的钥匙。
|
14天前
|
敏捷开发 数据管理 测试技术
自动化测试框架的设计与实现
【9月更文挑战第25天】 本文将引导读者深入理解自动化测试框架的核心概念,并展示如何从零开始构建一个简单且有效的自动化测试框架。通过通俗易懂的语言和实际代码示例,我们将探讨测试框架设计的关键步骤、实现方法以及常见问题的解决方案。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的知识和启示。
|
16天前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
|
1月前
|
存储 Java 关系型数据库
“代码界的魔法师:揭秘Micronaut框架下如何用测试驱动开发将简单图书管理系统变成性能怪兽!
【9月更文挑战第6天】Micronaut框架凭借其轻量级和高性能特性,在Java应用开发中备受青睐。本文通过一个图书管理系统的案例,介绍了在Micronaut下从单元测试到集成测试的全流程。首先,我们使用`@MicronautTest`注解编写了一个简单的`BookService`单元测试,验证添加图书功能;接着,通过集成测试验证了`BookService`与数据库的交互。整个过程展示了Micronaut强大的依赖注入和测试支持,使测试编写变得更加高效和简单。
54 4
|
1月前
|
IDE 测试技术 持续交付
Python自动化测试与单元测试框架:提升代码质量与效率
【9月更文挑战第3天】随着软件行业的迅速发展,代码质量和开发效率变得至关重要。本文探讨了Python在自动化及单元测试中的应用,介绍了Selenium、Appium、pytest等自动化测试框架,以及Python标准库中的unittest单元测试框架。通过详细阐述各框架的特点与使用方法,本文旨在帮助开发者掌握编写高效测试用例的技巧,提升代码质量与开发效率。同时,文章还提出了制定测试计划、持续集成与测试等实践建议,助力项目成功。
59 5
|
14天前
|
设计模式 测试技术 持续交付
自动化测试框架的设计与实现
【9月更文挑战第25天】本文旨在探讨如何设计并实现一个高效、可扩展的自动化测试框架,以提升软件测试的效率和质量。通过分析当前流行的测试框架特点,结合最佳实践,提出一套完整的解决方案。文章不仅涵盖框架设计的理论依据,还包括具体实现步骤和示例,帮助读者深入理解自动化测试框架的搭建过程。