go 基准测试 找不到函数_Golang笔记-单元测试test初探-程序员宅基地

技术标签: golang glog文件名命令  自己写代码没有main方法怎么测试  go 基准测试 找不到函数  

为什么需要单元测试

其实在很长一段时间,包括现在,我都很不喜欢写单元测试。因为维护单元测试的成本很高。只有接口做了一点变更,那么单元测试就必须做相同的变更,否则会导致测试不通过。

那么反过来,只要每次在提交代码都去运行一次单元测试。这样可以很快的检查到你对代码更改是否影响了正常的业务逻辑,当然很大一部分是可能是别人写的那部分代码。因为你不确定本次的修改是否会影响到别人的那部分。所以单元测试还是很有必要的。

单元测试最基本的应用

go语言中单元测试是开箱即用的,官方提供了test包。不用像PHP中需要单独配置unit

go test 最基本使用

go test 命令是golang单元测试的最基本使用

go test -v

go test -v是我们比较常用的一个测试命令,用于执行测试,并打印额外的输出。

新建一个项目用于示例

test
│  main.go
│  main_test.go

可以看到我在main.go的同级目录创建了一个main_test.gogo语言中,单元测试的代码必须跟需要测试的代码在同一个包里面。且命名必须遵循上面的那种结构规范,即:文件名_test.go

我在main.go中创建两个函数来分别得到字符串相加的结果。

func JoinStrUseSprint(a,b string) string {
	return  fmt.Sprintf("%s%s",a,b)
}

func JoinStrUseNor(a,b string) string {
	return  a+b
}

main_test.go中的测试代码

import "testing"

func TestJoinStrUseNor(t *testing.T) {
	c := JoinStrUseNor("aaa","bbb")
	t.Log(c)
}

func TestJoinStrUseSprint(t *testing.T) {
	c := JoinStrUseSprint("aaa","bbb")
	t.Log(c)
}

测试代码中使用了 testing包。而且每个测试函数必须是以Test开头,有且只有一个参数t *testing.T.t.Log()函数为输出一段Log日志 这样一个简单的单元测试就完成了。

这个时候我们运行go test,结果如下。

test>go test
PASS
ok      test    0.360s

可以看到测试通过了。但是发现并没有我们期望的日志输出。如果我们要得到输出的结果,我们需要一个额外的参数,具体命令如下:

test>go test -v
=== RUN   TestJoinStrUseNor
--- PASS: TestJoinStrUseNor (0.00s)
    main_test.go:7: aaabbb
=== RUN   TestJoinStrUseSprint
--- PASS: TestJoinStrUseSprint (0.00s)
    main_test.go:12: aaabbb
PASS
ok      test    0.480s

这个时候就可以看到很详细的测试流程与输出的测试的log

go test -cover

很多时间我们需要看单元测试的覆盖率,这个时候我们就需要 go test -cover了。

我们同样使用上面的代码。

test>go test -cover
PASS
coverage: 100.0% of statements
ok      test    0.440s

可以看到单元代码覆盖率是100%。这个是我们在main文件里面在增加一个函数。

func JoinStrUseSprint(a,b string) string {
	return  fmt.Sprintf("%s%s",a,b)
}

func JoinStrUseNor(a,b string) string {
	return  a+b
}
func Run()  {
	fmt.Println("I'm run,and I'm happy!")
}

然后再执行cover,得到了覆盖率为66.7

test>go test -cover
PASS
coverage: 66.7% of statements
ok      test    0.398s

当然-v -cover是可以同事使用的。

test>go test -cover -v
=== RUN   TestJoinStrUseNor
--- PASS: TestJoinStrUseNor (0.00s)
    main_test.go:7: aaabbb
=== RUN   TestJoinStrUseSprint
--- PASS: TestJoinStrUseSprint (0.00s)
    main_test.go:12: aaabbb
PASS
coverage: 66.7% of statements
ok      test    0.429s

很多时候我们需要将单元测试覆盖率写到一个文件中,这时候我们再-cover中增加一些额外的参数

>go test -coverprofile test.cover
>go tool cover -html=test.cover -o coverage.html
  • 第一个命令:-coverprofile filename将覆盖率的profile写入指定文件中。
  • 第二个命令:go tool cover -html=test.cover -o coverage.html将覆盖率的文件写入可视化的html文件中 打开converage.html 如下图:

92f3c763d4a771d5d102591d719311f7.png

其实这里可以借用一个很好的第三方包。

go get github.com/smartystreets/goconvey

安装完成,直接再项目目录下执行

test>goconvey
2020/05/16 21:46:43 goconvey.go:61: Initial configuration: [host: 127.0.0.1] [port: 8080] [poll: 250ms] [cover: true]
2020/05/16 21:46:43 tester.go:19: Now configured to test 10 packages concurrently.
2020/05/16 21:46:43 goconvey.go:178: Serving HTTP at: http://127.0.0.1:8080
2020/05/16 21:46:43 integration.go:122: File system state modified, publishing current folders... 0 3179270049
2020/05/16 21:46:43 goconvey.go:118: Received request from watcher to execute tests...
2020/05/16 21:46:43 goconvey.go:105: Launching browser on 127.0.0.1:8080
2020/05/16 21:46:43 goconvey.go:111: exec: "start": executable file not found in %PATH%
2020/05/16 21:46:43 goconvey.go:113:
2020/05/16 21:46:44 executor.go:69: Executor status: 'executing'
2020/05/16 21:46:44 coordinator.go:46: Executing concurrent tests: test
2020/05/16 21:46:45 parser.go:24: [passed]: test

按照提示打开http://127.0.0.1:8080/就会得到一个很炫酷的覆盖率界面

a578e8a9ab0e334e141e146f82bedf55.png

Golang单元测试的基础今天就暂时到这里面,下面几个testing包的常用断言方法.

// 输出测试日志
t.Logf()
t.Logf()
// 标记错误,但仍然执行后面的语句
t.Fail()
// 获取是否当前用例是执行错误的
t.Failed()
// 错误输出,等于 t.Logf 再执行 t.Fail()
t.Errorf("%s", "run ErrorF")
// 标记函数错误,并中断后面的执行
t.FailNow()
// 致命错误输出,等同于调用了 t.Logf 然后调用 t.FailNow()
t.Fatalf("%s", "run Fatelf")

下一篇我们会写到 golang中的一些基准测试,以及一些测试的工具。

更多学习内容,同步更新到公众号,期待与您一起交流

http://weixin.qq.com/r/hTjq8tLEBI97rZaR922X (二维码自动识别)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39845220/article/details/110641975

智能推荐

http隧道 java_使用java语言实现http隧道技术-程序员宅基地

文章浏览阅读119次。该楼层疑似违规已被系统折叠隐藏此楼查看此楼/***Getaparametervalue**@paramkeyString*@paramdefString*@returnString*/publicStringgetParameter(Stringkey,Stringdef){returnisStandalone?System.getProperty(ke..._java http隧道

Keepalived高可用+邮件告警_keepalived sendmail-程序员宅基地

文章浏览阅读913次。IP主机名备注192.168.117.14keepalived-master主节点192.168.117.15keepalived-slaver备节点192.168.117.100VIP1.主备节点均安装keepalived# yum install -y keepalived httpd2.主备节点均修改keepalived日志存放路径..._keepalived sendmail

SPFILE 错误导致数据库无法启动(ORA-01565)_ora01565 ora27046-程序员宅基地

文章浏览阅读469次。--==========================================--SPFILE错误导致数据库无法启动(ORA-01565)--========================================== SPFILE错误导致数据库无法启动 SQL> startup ORA-01078: failurein proce_ora01565 ora27046

功能测试基础知识(1)-程序员宅基地

文章浏览阅读6.1k次,点赞2次,收藏54次。功能测试基础知识总结_功能测试

postgresql 中文排序_pg中文排序-程序员宅基地

文章浏览阅读3.2k次,点赞3次,收藏2次。pg 中文首字母排序_pg中文排序

[Mysql] CONVERT函数_mysql convert-程序员宅基地

文章浏览阅读3.1w次,点赞23次,收藏109次。本文主要讲解CONVERT函数_mysql convert

随便推点

HTML5与微信开发(2)-视频播放事件及API属性_微信开发者工具视频快进-程序员宅基地

文章浏览阅读8.6k次,点赞2次,收藏2次。HTML5 的视频播放事件想必大家已经期待很久了吧,在HTML4.1、4.0之前我们如果在网页上播放视频无外乎两种方法: 第一种:安装FLASH插件或者微软发布的插件 第二种:在本地安装播放器,在线播放组件之类的 因为并不是所有的浏览器都安装了FLASH插件,就算安装也不一定所有的都能安装成功。像苹果系统就是默认禁用FLASH的,安卓虽然一开始的时候支持FLASH,但是在安卓4.0以后也开始不_微信开发者工具视频快进

JedisConnectionException Connection Reset_jedisconnectionexception: java.net.socketexception-程序员宅基地

文章浏览阅读5.4k次,点赞3次,收藏4次。在使用redis的过程常见错误总结1.JedisConnectionException Connection Reset参考这边文章:Connection reset原因分析和解决方案https://blog.csdn.net/cwclw/article/details/527971311.1问题描述Exception in thread "main" redis.clients...._jedisconnectionexception: java.net.socketexception: connection reset

Lua5.3版GC机制理解_lua5.3 gc-程序员宅基地

文章浏览阅读8.3k次,点赞8次,收藏42次。目录1.Lua垃圾回收算法原理简述2.Lua垃圾回收中的三种颜色3.Lua垃圾回收详细过程4.步骤源码详解4.1新建对象阶段4.2触发条件4.3 GC函数状态机4.4标记阶段4.5清除阶段5.总结参考资料lua垃圾回收(Garbage Collect)是lua中一个比较重要的部分。由于lua源码版本变迁,目前大多数有关这个方面的文章都还是基于lua5.1版本,有一定的滞后性。因此本文通过参考当前..._lua5.3 gc

手机能打开的表白代码_能远程打开,各种手机电脑进行监控操作,最新黑科技...-程序员宅基地

文章浏览阅读511次。最近家中的潮人,老妈闲着没事干,开始学玩电脑,引起他的各种好奇心。如看看新闻,上上微信或做做其他的事情。但意料之中的是电脑上会莫名出现各种问题?不翼而飞的图标?照片又不见了?文件被删了,卡机或者黑屏,无声音了,等等问题。常常让她束手无策,求助于我,可惜在电话中说不清,往往只能苦等我回家后才能解决,那种开心乐趣一下子消失了。想想,这样也不是办法啊, 于是,我潜心寻找了两款优秀的远程控制软件。两款软件...

成功Ubuntu18.04 ROS melodic安装Cartograhper+Ceres1.13.0,以及错误总结_ros18.04 安装ca-程序员宅基地

文章浏览阅读1.8k次。二.初始化工作空间三.设置下载地址四.下载功能包此处可能会报错,请看:rosdep update遇到ERROR: error loading sources list: The read operation timed out问题_DD᭄ꦿng的博客-程序员宅基地接下来一次安装所有功能包,注意对应ROS版本 五.编译功能包isolated:单独编译各个功能包,每个功能包之间不产生依赖。编译过程时间比较长,可能需要几分钟时间。此处可能会报错:缺少absl依赖包_ros18.04 安装ca

Harbor2.2.1配置(trivy扫描器、镜像签名)_init error: db error: failed to download vulnerabi-程序员宅基地

文章浏览阅读4.1k次,点赞3次,收藏7次。Haobor2.2.1配置(trivy扫描器、镜像签名)docker-compose下载https://github.com/docker/compose/releases安装cp docker-compose /usr/local/binchmod +x /usr/local/bin/docker-composeharbor下载https://github.com/goharbor/harbor/releases解压tar xf xxx.tgx配置harbor根下建立:mkd_init error: db error: failed to download vulnerability db: database download

推荐文章

热门文章

相关标签