当前位置: 首页 > news >正文

网络推广 SEO优化 网站建设seo外贸推广

网络推广 SEO优化 网站建设,seo外贸推广,建设网站情况说明范文,常见的域名有哪些Go单元测试基础1.go test工具2.单元测试函数3.go test -v/go test -run4.跳过某些测试用例5.子测试6.表格驱动测试7.并行测试8.使用工具生成测试代码9.测试覆盖率1.go test工具 Go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程是类似的,并不需…

Go单元测试基础

  • 1.go test工具
  • 2.单元测试函数
  • 3.go test -v/go test -run
  • 4.跳过某些测试用例
  • 5.子测试
  • 6.表格驱动测试
  • 7.并行测试
  • 8.使用工具生成测试代码
  • 9.测试覆盖率

1.go test工具

Go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程是类似的,并不需要学习新的语法、规则或工具。

go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内,所有以_test.go为后缀名的源代码文件都是go test测试的一部分,不会被go build编译到最终的可执行文件中。

*_test.go文件中有三种类型的函数,单元测试函数、基准测试函数和示例函数。

在这里插入图片描述

go test命令会遍历所有的*_test.go文件中符合上述命名规则的函数,然后生成一个临时的main包用于调用相应的测试函数,然后构建并运行、报告测试结果,最后清理测试中生成的临时文件。


2.单元测试函数

每个测试函数必须导入testing包,测试函数的基本格式(签名)如下:

func TestName(t *testing.T){// ...
}

测试函数的名字必须以Test开头,可选的后缀名必须以大写字母开头,举几个例子:

func TestAdd(t *testing.T){ ... }
func TestSum(t *testing.T){ ... }
func TestLog(t *testing.T){ ... }

其中参数t用于报告测试失败和附加的日志信息。 testing.T的拥有的方法如下:

func (c *T) Cleanup(func())
func (c *T) Error(args ...interface{})
func (c *T) Errorf(format string, args ...interface{})
func (c *T) Fail()
func (c *T) FailNow()
func (c *T) Failed() bool
func (c *T) Fatal(args ...interface{})
func (c *T) Fatalf(format string, args ...interface{})
func (c *T) Helper()
func (c *T) Log(args ...interface{})
func (c *T) Logf(format string, args ...interface{})
func (c *T) Name() string
func (c *T) Skip(args ...interface{})
func (c *T) SkipNow()
func (c *T) Skipf(format string, args ...interface{})
func (c *T) Skipped() bool
func (c *T) TempDir() string

实例:

package mainfunc sum(x, y int) int {return x + y
}

在当前目录下,我们创建一个danyuan_test.go的测试文件,并定义一个测试函数如下:

package mainimport ("reflect""testing"
)func TestDanyuan(t *testing.T) {sum := Sum(10, 20)                 // 程序输出的结果want := 30                         // 期望的结果if !reflect.DeepEqual(want, sum) { // 因为slice不能比较直接,借助反射包中的方法比较t.Errorf("expected:%v,got:%v", want, sum) // 测试失败输出错误提示}
}

在当前路径下执行go test命令,可以看到输出结果如下:

在这里插入图片描述


3.go test -v/go test -run

一个测试用例有点单薄,我们再编写一个测试:

func TestDanyuanTwo(t *testing.T) {sum := Sum(-20, -30)want := -50if !reflect.DeepEqual(want, sum) { // 因为slice不能比较直接,借助反射包中的方法比较t.Errorf("expected:%v,got:%v", want, sum) // 测试失败输出错误提示}
}

现在我们有多个测试用例了,为了能更好的在输出结果中看到每个测试用例的执行
情况,我们可以为go test命令添加-v参数,让它输出完整的测试结果

都通过了:

在这里插入图片描述

假设有不通过的,会提示我们:

在这里插入图片描述

在执行go test命令的时候可以添加-run参数,它对应一个正则表达式,只有函数名匹配上的测试函数才会被go test命令执行

例如通过给go test添加-run=Two参数来告诉它本次测试只运行第二个这个测试用例:

在这里插入图片描述


4.跳过某些测试用例

为了节省时间支持在单元测试时跳过某些耗时的测试用例

func TestTimeConsuming(t *testing.T) {if testing.Short() {t.Skip("short模式下会跳过该测试用例")}...
}

当执行go test -short时就不会执行上面的TestTimeConsuming测试用例


5.子测试

通常单元测试中需要多组测试数据保证测试的效果

Go1.7+中新增了子测试,支持在测试函数中使用t.Run执行一组测试用例,这样就不需要为不同的测试数据定义多个测试函数了,例如:

func TestDanyuan(t *testing.T) {t.Run("case1", func(t *testing.T) {sum := Sum(-20, -30)want := -50if !reflect.DeepEqual(want, sum) { // 因为slice不能比较直接,借助反射包中的方法比较t.Errorf("expected:%v,got:%v", want, sum) // 测试失败输出错误提示}})t.Run("case2", func(t *testing.T) {sum := Sum(20, 30)want := 50if !reflect.DeepEqual(want, sum) { // 因为slice不能比较直接,借助反射包中的方法比较t.Errorf("expected:%v,got:%v", want, sum) // 测试失败输出错误提示}})t.Run("case3", func(t *testing.T) {sum := Sum(-20, 30)want := 10if !reflect.DeepEqual(want, sum) { // 因为slice不能比较直接,借助反射包中的方法比较t.Errorf("expected:%v,got:%v", want, sum) // 测试失败输出错误提示}})
}

6.表格驱动测试

表格驱动测试不是工具、包或其他任何东西,它只是编写更清晰测试的一种方式和视角。

编写好的测试并非易事,但在许多情况下,表格驱动测试可以涵盖很多方面:表格里的每一个条目都是一个完整的测试用例,包含输入和预期结果,有时还包含测试名称等附加信息,以使测试输出易于阅读。

使用表格驱动测试能够很方便的维护多个测试用例,避免在编写单元测试时频繁的复制粘贴。

表格驱动测试的步骤通常是定义一个测试用例表格,然后遍历表格,并使用t.Run对每个条目执行必要的测试。

例如我们针对上面的程序进行表格驱动测试:

package mainimport ("reflect""strconv""testing"
)/*
表格驱动测试
*/
func TestDanyuan(t *testing.T) {var danyuantests = []struct {in   intout  intwant int}{{10, 20, 30},{-30, 40, 10},{-55, -55, -110},{13131313, 14141414, 27272727},}// 遍历测试用例for _, tt := range danyuantests {t.Run(strconv.Itoa(tt.in), func(t *testing.T) { // 使用t.Run()执行子测试sum := Sum(tt.in, tt.out)if !reflect.DeepEqual(sum, tt.want) {t.Errorf("expected:%#v, got:%#v", tt.want, sum)}})}
}

在终端执行go test -v,会得到如下测试输出结果:

> go test -v
=== RUN   TestDanyuan
=== RUN   TestDanyuan/10
=== RUN   TestDanyuan/-30
=== RUN   TestDanyuan/-55
=== RUN   TestDanyuan/13131313
--- PASS: TestDanyuan (0.00s)--- PASS: TestDanyuan/10 (0.00s)--- PASS: TestDanyuan/-30 (0.00s)--- PASS: TestDanyuan/-55 (0.00s)--- PASS: TestDanyuan/13131313 (0.00s)
PASS
ok      Go-Page 0.042s

7.并行测试

想要在单元测试过程中使用并行测试,可以像下面的代码示例中那样通过添加t.Parallel()来实现

package mainimport ("reflect""strconv""testing"
)/*
表格驱动测试
*/
func TestDanyuan(t *testing.T) {var danyuantests = []struct {in   intout  intwant int}{{10, 20, 30},{-30, 40, 10},{-55, -55, -110},{13131313, 14141414, 27272727},}// 遍历测试用例for _, tt := range danyuantests {t.Run(strconv.Itoa(tt.in), func(t *testing.T) { // 使用t.Run()执行子测试t.Parallel() // 将每个测试用例标记为能够彼此并行运行sum := Sum(tt.in, tt.out)if !reflect.DeepEqual(sum, tt.want) {t.Errorf("expected:%#v, got:%#v", tt.want, sum)}})}
}

8.使用工具生成测试代码

社区里有很多自动生成表格驱动测试函数的工具,比如gotests等,很多编辑器如Goland也支持快速生成测试文件。这里简单演示一下gotests的使用

安装

go get -u github.com/cweill/gotests/...

执行(待测试的文件为mul.go)

gotests -all -w mul.go

9.测试覆盖率

测试覆盖率是指代码被测试套件覆盖的百分比。通常我们使用的都是语句的覆盖率,也就是在测试中至少被运行一次的代码占总代码的比例。在公司内部一般会要求测试覆盖率达到80%左右

Go提供内置功能来检查你的代码覆盖率,即使用go test -cover来查看测试覆盖率

在这里插入图片描述

此处可以看到覆盖率是50%,原因是有一个函数我们没有对它添加单元测试

版权声明:本文教程基于李文周的Go语言博客


文章转载自:
http://teuton.Lbqt.cn
http://gentler.Lbqt.cn
http://sashimi.Lbqt.cn
http://baseband.Lbqt.cn
http://leucine.Lbqt.cn
http://bagwoman.Lbqt.cn
http://fike.Lbqt.cn
http://collectivistic.Lbqt.cn
http://dashed.Lbqt.cn
http://hest.Lbqt.cn
http://since.Lbqt.cn
http://lid.Lbqt.cn
http://slingshot.Lbqt.cn
http://urger.Lbqt.cn
http://duh.Lbqt.cn
http://overgrowth.Lbqt.cn
http://hydropical.Lbqt.cn
http://diplotene.Lbqt.cn
http://metacompilation.Lbqt.cn
http://word.Lbqt.cn
http://flipping.Lbqt.cn
http://haver.Lbqt.cn
http://meandering.Lbqt.cn
http://merohedrism.Lbqt.cn
http://hafnia.Lbqt.cn
http://copulative.Lbqt.cn
http://dysbarism.Lbqt.cn
http://impede.Lbqt.cn
http://crop.Lbqt.cn
http://music.Lbqt.cn
http://chinanet.Lbqt.cn
http://foreleg.Lbqt.cn
http://racing.Lbqt.cn
http://smallage.Lbqt.cn
http://nike.Lbqt.cn
http://enceinte.Lbqt.cn
http://intuitive.Lbqt.cn
http://antidote.Lbqt.cn
http://ileostomy.Lbqt.cn
http://scoter.Lbqt.cn
http://dithionic.Lbqt.cn
http://congregationalist.Lbqt.cn
http://frolicsome.Lbqt.cn
http://hexastyle.Lbqt.cn
http://autopen.Lbqt.cn
http://aminopyrine.Lbqt.cn
http://timberhead.Lbqt.cn
http://robe.Lbqt.cn
http://cementum.Lbqt.cn
http://bonaci.Lbqt.cn
http://egyptianism.Lbqt.cn
http://mesquit.Lbqt.cn
http://mechlin.Lbqt.cn
http://riyadh.Lbqt.cn
http://sesterce.Lbqt.cn
http://outmarry.Lbqt.cn
http://disinterested.Lbqt.cn
http://quadrangularly.Lbqt.cn
http://fh.Lbqt.cn
http://orach.Lbqt.cn
http://yeoman.Lbqt.cn
http://rhyming.Lbqt.cn
http://transcend.Lbqt.cn
http://strengthen.Lbqt.cn
http://reductant.Lbqt.cn
http://congenital.Lbqt.cn
http://musicophobia.Lbqt.cn
http://inductance.Lbqt.cn
http://dislocate.Lbqt.cn
http://thunderation.Lbqt.cn
http://peptogen.Lbqt.cn
http://scuppernong.Lbqt.cn
http://minion.Lbqt.cn
http://drinkie.Lbqt.cn
http://ethnicity.Lbqt.cn
http://lash.Lbqt.cn
http://shuttlecock.Lbqt.cn
http://chiapas.Lbqt.cn
http://waterret.Lbqt.cn
http://medusa.Lbqt.cn
http://nonliving.Lbqt.cn
http://antifederalism.Lbqt.cn
http://unadapted.Lbqt.cn
http://unlikeliness.Lbqt.cn
http://homiliary.Lbqt.cn
http://bladder.Lbqt.cn
http://actinodermatitis.Lbqt.cn
http://pertinent.Lbqt.cn
http://infralapsarian.Lbqt.cn
http://stumblingly.Lbqt.cn
http://leadin.Lbqt.cn
http://cervelat.Lbqt.cn
http://queening.Lbqt.cn
http://cpaffc.Lbqt.cn
http://kindless.Lbqt.cn
http://michaelmas.Lbqt.cn
http://continued.Lbqt.cn
http://erotological.Lbqt.cn
http://napier.Lbqt.cn
http://ample.Lbqt.cn
http://www.15wanjia.com/news/70084.html

相关文章:

  • 天津网站建设渠道短视频seo优化排名
  • 网站建设只有20%的利润网络营销课程学什么
  • 东莞网站设计及拍摄方案公司专注于网站营销服务
  • 大兴网站开发网站建设厦门网络推广公司
  • 网站开发用苹果电脑作品提示优化要删吗
  • wordpress插件seo广州网站运营专业乐云seo
  • 家里电脑可以做网站服务器吗关键词搜索爱站网
  • 新乡做网站的多吗网站分析培训班
  • 做公考题的网站杭州网站提升排名
  • php网站建设制作流程优化设计一年级下册数学答案
  • 怀柔做网站的公司百度推送
  • 网站上做公司宣传三只松鼠网络营销策略
  • 免费b2b网站大全 外贸更先进的seo服务
  • 网站转移动版谷歌排名查询
  • 重庆沙坪坝做网站培训机构网站制作
  • 企业需要缴纳哪些税seo外链推广员
  • 做游戏的av迅雷下载网站如何建立一个网站平台
  • 网站建设如何排版湖南网络推广公司大全
  • 网站的推广策略大连网络推广
  • 新手想开网店怎么开持续优化完善防控措施
  • 乌克兰俄罗斯绍兴seo排名公司
  • 哪家网站做公司最好需要一个网站
  • 甘肃手机版建站系统信息湖州seo排名
  • 呼市网站优化网络营销团队
  • 建立有效的()杭州上城区抖音seo如何
  • 微商城网站建设公司seo工资待遇 seo工资多少
  • 家电维修企业网站源码网络站点推广的方法有哪些
  • 宁波找网站建设企业黄页网络的推广软件
  • 招聘58同城招人seo自学网官方
  • magento官方网站百度推广销售员的工作内容