GOLang单元测试用法详解
作者:上后左爱 发布时间:2024-05-05 09:27:33
概念
单元测试 UT测试,针对程序来进行正确检测测试工作,一个优秀强壮代码 需要有完美的 UT测试用例
go test基本用法
go test 测试用例放在 *_test.go 文件中,与被测函数放到同一个目录下面go build 时候不会构建成包一部分
被测试用例函数命名 TestXXX. 第一个字母必须大写
测试函数: 检测逻辑是否正确
基准函数以BenChmark 为函数名称前缀, 衡量函数性能
示例函数: 以Example 函数名称为前缀函数 提供编译器正确性的示例文档
go test 基础用例
首先 GoLand 中go Test 不成熟,如果直接运行 会抛出 Undefined 的指令
借助GoLand 对于指定方式 使用Generate 对需要函数产生对应的XX_test.go 文件
只能 Teiminal 下:
如果想 直接运行当前目录下所有测试用例: run go test,在当前目录下面右键即可
如果指向单纯运行某个函数 需要 到该目录下面:
go test -v -run TestXXX 即可
goLand 给我们产生的单元测试使用用例 值需要我们字节填写对应 name(测试用例名称),args(数组,输入参数) want(返回参数)
type args struct {
s string
}
tests := []struct {
name string
args args
want bool
}{
// TODO: Add test cases.
{
"test1",
args{
"kafka",
},
true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := IsPalindrome(tt.args.s); got != tt.want {
t.Errorf("IsPalindrome() = %v, want %v", got, tt.want)
}
})
}
使用 Go mod 解决此问题
在 GoPATH目录下 手动窗口 bin, pkg, src
三个目录
配置 Go Moudle 路径
直接运行GOLand 即可
go test -v : 测试函数名字和运行时间
go test -v -run 对应正则表达式,测试函数与正确表达式匹配才会过滤 指定某个特定函数
测试可执行程序
用来测试一个可执行程序一个包的名字是main, 示例: 将程序拆分两个函数, echo 函数完成真正的工作 main 函数用于处理命令行参数和 echo可能返回错误
import (
"flag"
"fmt"
"io"
"os"
"strings"
)
var (
n = flag.Bool("n", false, "omit trailing newline")
s = flag.String("s", " ", "separator")
)
var out io.Writer = os.Stdout // modified during testing
func main() {
flag.Parse()
if err := echo(!*n, *s, flag.Args()); err != nil {
fmt.Fprintf(os.Stderr, "echo: %v\n", err)
os.Exit(1)
}
}
func echo(newline bool, sep string, args []string) error {
fmt.Fprint(out, strings.Join(args, sep))
if newline {
fmt.Fprintln(out)
}
return nil
}
import (
"bytes"
"fmt"
"testing"
)
func TestEcho(t *testing.T) {
var tests = []struct {
newline bool
sep string
args []string
want string
}{
{true, "", []string{}, "\n"},
{false, "", []string{}, ""},
{true, "\t", []string{"one", "two", "three"}, "one\ttwo\tthree\n"},
{true, ",", []string{"a", "b", "c"}, "a,b,c\n"},
{false, ":", []string{"1", "2", "3"}, "1:2:3"},
}
for _, test := range tests {
descr := fmt.Sprintf("echo(%v, %q, %q)",
test.newline, test.sep, test.args)
out = new(bytes.Buffer) // captured output
if err := echo(test.newline, test.sep, test.args); err != nil {
t.Errorf("%s failed: %v", descr, err)
continue
}
got := out.(*bytes.Buffer).String()
if got != test.want {
t.Errorf("%s = %q, want %q", descr, got, test.want)
}
}
}
外部测试包解决循环依赖
外部测试主要用来 解决 测试过程中循环依赖问题, GO语言中禁止包进行循环依赖,解决一个下层包的测试代码导入上层包的这种行为解决方案:z在net.url 包所在目录声明一个独立url_test 测试包,其中包名_test 后缀告诉go test 工具创建一个额外包进行允许测试
测试覆盖比例
go test -run=Coverage -coverprofile=c.out gopl.io/ch7/eval
go tool cover -html=c.out
测试基准函数
在固定的工作负载下的性能,一Benchmark 前缀
go test -bench=IsPalindrome , . 表示匹配所有基准测试函数
func BenchmarkIsPalindrome(b *testing.B) {
for i := 0; i < b.N; i++ {
IsPalindrome("A man, a plan, a canal: Panama")
}
}
goos: windows
goarch: amd64
pkg: goprograme/src
cpu: Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz
BenchmarkIsPalindrome
BenchmarkIsPalindrome-4 2308773 502.9 ns/op
1. 基准函数数字后缀 -4 表示运行时候对应 GOMAXPROCS 值, 与并发相关的基准测试重要信息
2. 每个调用函数 花费时间 502.9 微妙
3. 明显 上面 函数 判断是 第二个函数 使用
1.n := len(letters) /2 z只比较一般方式优化 测试后只是改进 提升 4%
2. 在每个字符预先分配一个足够大的数组,这样避免在append 函数时候可能导致内存多次重新分配
-- 通过性能工具的测试 从而优化我们的程序
func IsPalindrome(s string) bool {
letters := make([]rune, 0, len(s))
for _, r := range s {
if unicode.IsLetter(r) {
letters = append(letters, unicode.ToLower(r))
}
}
n := len(letters) / 2
for i := 0; i < n; i++ {
if letters[i] != letters[len(letters)-1-i] {
return false
}
}
return true
}
来源:https://blog.csdn.net/qq_27217017/article/details/125829414
猜你喜欢
- 性能监控一、web项目(如gin中)1.使用ginpprofimport "github.com/DeanThompson/gin
- 在开发django项目时,启动开发服务器的命令为:python manager.py runserver [port]其中,[port]选项
- 获取表字段:select * from user_tab_columns where Table_Name='用户表' or
- 编写高质量代码的30条黄金守则-Day 01(首选隐式类型转换),本文由比特飞原创发布,转载务必在文章开头附带链接:https://www.
- 前言:问题分析:在进行数据库查询的时候,我们都知道索引可以加快数据查询的效率。但是在实际的业务场景下,经常会遇到即使在表中增加了索引,但是同
- 我使用的是tensorflow-gpu (1.2.1)和Theano (0.9.0),2个4G显存Nvidia Quadro M2000 G
- 使用matplotlib中的一些函数将tensorflow中的数据可视化,更加便于分析import tensorflow as tfimpo
- 1 用法说明str.format() 方法通过字符串中的花括号 {} 来识别替换字段从而完成字符串的格式化。1.1 写法简单字段名有三种写法
- 很多现代的浏览器在地址栏的右边有个搜索框,默认的安装有 Google 搜索等。如下图所示: 其实这是 OpenSearch 的一
- 折纸是日本著名的折叠纸张的艺术。折纸艺术只是使用一些不同的折叠方式,却能被用各种各样的方式组合成错综复杂的设计。而受折纸启发的logo设计则
- 这篇文章主要介绍了如何基于pythonnet调用halcon脚本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 前言都说抖音有毒,一刷就停不下来了。看来抖音这款产品紧紧抓住了人们内心深处的某些需求。当然今天不是来探讨抖音这款产品的啊。今天我们来学习如何
- 有一个多选的需求,在网上找到了这个插件:multiselect https://github.com/ehynds/jquery-ui-mu
- 本文实例讲述了PHP实现将浏览历史页面网址保存到cookie的方法。分享给大家供大家参考。具体如下:将浏览历史页面网址保存到cookie,大
- 目录前言🎪 一、Python 关键字🎢 二、Python标识符🎠 2.1 在 Python 中创建标识符的指南🎡 2.2 测试标识符是否有效
- 有一个需求就是需要对url进行进一步的划分得到详细的各个字段信息,下面是简单的实现:#!/usr/bin/python# -*- codin
- 通过前面内容的介绍,我们对 Surface 对象有了大体上的认识。Pygame 针对文本、图像、颜色提供了不同模块来生成它们各自的 Surf
- 今天看一个水友说他的MySQL现在变的很慢。问什么情况时。说单表超过2个G的一个MyISAM。真垃圾的回答方式。 &n
- 一、增强的可扩展性 Oracle9i Real Application Clusters是Oracle的下一代并行服务器系列产品。Oracl
- 前言本博客重点:folium的使用功能,图层控制、指北针、folium添加js和css、经纬网格线(栅格线)在上一篇使用folium制作地图