首页 > 其他分享 >Golang-单元测试

Golang-单元测试

时间:2022-11-30 18:07:37浏览次数:45  
标签:函数 sum 单元测试 Golang test 测试 go 运行

单元测试

针对使用传统方式测试代码块的不足:

1)测试代码块需要在main函数中去调用,需要修改main函数,若项目正在运行,就可能去停止项目,不方便

2)不利于管理,当需要测试多个函数或多个模块时,都需要在main函数,不利于我们管理和清晰思路

3)引出单元测试。testing测试框架,很好解决上述问题。

单元测试基本原理

Golang-单元测试_单元测试

go test工具

Go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程是类似的,并不需要学习新的语法、规则或工具。
go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内,所有以_test.go为后缀名的源代码文件都是go test测试的一部分,不会被go build编译到最终的可执行文件中。
在_test.go文件中有三种类型的函数,单元测试函数、基准测试函数和示例函数。

Golang-单元测试_i++_02

1、测试函数Test

a、在cal目录下有被测试文件cal.go

Golang-单元测试_单元测试_03

b、同样在cal目录下写测试函数,文件名为cal_test.go

Golang-单元测试_单元测试_04

c、运行测试指令

go test (如果运行正确,无日志,错误时输出日志)

Golang-单元测试_i++_05

go test -v (运行正确或错误都输出日志)

Golang-单元测试_运行时间_06

go test -v cal_test.go cal.go  测试单个文件

Golang-单元测试_运行时间_07

go test -v -run TestAddupper  测试单个方法

Golang-单元测试_i++_08

2、基准函数(测试函数的性能)----benchmark性能测试

benchmark函数以Benchmark开头而非 Test开头.

通过为go test命令添加-bench标记的方式运行benchmark测试,参数的值是一个正则表达式,如果运行全部benchmark测试,则指定为-bench=.即可;

为了避免普通的测试case被执行,可以加上-run=^$(匹配空函数)来跳过执行;

如果希望同步观察内存使用,可以通过-benchmem标记位来实现;

为了确保结果的一致性,可以加上-count参数来重复运行benchmark;

每个benchmark默认情况下会运行至少一分钟,我们可以通过 -benchtime标记位来生成一个更准确的结果;

b.N 的值会以1, 2, 5, 10, 20, 50, …这样的规律递增下去直到运行时间超过或等于1秒钟(可以通过上面的 -benchtime修改),这里不是时间一到就截止,运行期还会综合运行时间的稳定性来判断是否继续;

接上一条,由于程序判断运行时间稳定才会停止运行,所以千万不要在loop循环里面使用一个变化的值作为函数的参数,这里要注意b.N是也是一个动态变化的值!

package cal

import (
"testing"
)

func BenchmarkAllocOne(b *testing.B) {
for n := 0; n < b.N; n++ {
one()
}
}

func BenchmarkAllocBatch(b *testing.B) {
for i := 0; i < b.N; i++ {
batch()
}
}
func one() {
sum := 0
for i := 1; i < 10000; i++ {
sum = sum + i
}
}
func batch() {
sum := 0
for i := 1; i < 10000; i++ {
sum = sum + i
}
}

 go test -run=^$ -bench=^BenchmarkAlloc* -benchmem

Golang-单元测试_运行时间_09

第一列是执行的函数名称,第二列是总的执行次数,第三列是平均运行时间;



标签:函数,sum,单元测试,Golang,test,测试,go,运行
From: https://blog.51cto.com/wyf1226/5900068

相关文章

  • 解决golang循环引用问题
    go出现包循环引用的问题,首当其冲的就是程序结构没设计好,最好的方式就是在项目框架构建的时候,将各个模块设计好,避免出现该问题。尝试分层的设计,高层依赖于低层,低层不依赖......
  • golang 怎么获取kubernetes deployments的状态?
    如果我们需要把k8s的信息展示为一个友好的web页面。那么deployment的信息基本上是非常重要的(大部分的服务都是使用deployment部署)。从yaml中我们能获取到很多关于depl......
  • Golang sync.WaitGroup的用法
    参考链接:https://studygolang.com/articles/12972funcmain(){wg:=sync.WaitGroup{}wg.Add(100)fori:=0;i<100;i++{gofunc(iint)......
  • 使用NUnit做单元测试(总结版)
    使用NUnit做单元测试(总结版)一、本文摘要: ●什么单元测试 ●什么是NUnit ●NUnit的下载以及安装 ●NUnit的启动 ●NUnit的最简单使用 ●验证设计的功能是否实现 ......
  • golang_learn note_2022年11月26日
    D:\code_gitee\go_example\main.gopackagemainimport( "fmt")funcmain(){ //显示声明类型 constastring="hello" //隐式声明类型 constb="hello"......
  • golang的两把利器,协程和管道
    golang的协程相信大家都不陌生,在golang中的使用也很简单,只要加上一个关键字「go」即可,虽然说大家都知道,但是真的在实际使用中又遇到这样那样的问题,坑其实还是挺多的。而网上......
  • [golang]字符串拼接
    前言在go语言中,因为字符串只能被访问,不能被修改,所以进行字符串拼接的时候,golang都需要进行内存拷贝,造成一定的性能消耗。方式1:操作符+特点:简单,可读性良好。每次拼接都......
  • 基于Docker的Golang开发
    一、Docker用于开发Docker不仅用于部署,它还可以用于开发。1、为什么要在开发中使用Docker主要有以下几个原因。1)一致的开发环境使用Docker,可以保证整个研发团队使用一致的开......
  • Golang中一个不错的处理 JSON 的库 go-dproxy
    国庆七天,你是吃多了,还是睡多了?放假七天转眼即逝,接下来的七天可能你又觉得会很漫才。言归正传。Golang虽然自己就带了JSON(encoding/json)处理的库,也有第三方的simplejs......
  • Go Testing单元测试
    使用Golang编程时,一般只有在写最终的main函数时我们才有机会调用某个函数进行测试,在大型项目中如果只负责编写某个非main模块时应当如何测试函数的可用性?Golang提供了Test......