1. 安装Ginkgo

go get github.com/onsi/ginkgo/ginkgo
go get github.com/onsi/gomega/...

附加的库,配合使用,下一篇会详细讲解 配置环境变量,加到$GOPATH/bin$PATH

2. 准备

创建一个测试文件夹如example,进入文件夹,执行命令ginkgo bootstrap生成模版文件,文件名是example_suite_test.go,里面有入口函数 执行ginkgo generate example,example可以不写,默认是当前文件夹名称,生成测试例模板文件example_test.go 加_test后缀是为了和当前文件夹内已有代码做区分 example_test.go代码中默认会import当前文件夹

3. 模块

常用的10个:It、Context、Describe、BeforeEach、AfterEach、JustBeforeEach、BeforeSuite、AfterSuite、By、Fail

  • It是测试例的基本单位,即It包含的代码就算一个测试用例
  • Context和Describe的功能都是将一个或多个测试例归类
  • BeforeEach是每个测试例执行前执行该段代码
  • AfterEach是每个测试例执行后执行该段代码
  • JustBeforeEach是在BeforeEach执行之后,测试例执行之前执行
  • BeforeSuite是在该测试集执行前执行,即该文件夹内的测试例执行之前
  • AfterSuite是在该测试集执行后执行,即该文件夹内的测试例执行完后
  • By是打印信息,内容只能是字符串,只会在测试例失败后打印,一般用于调试和定位问题
  • Fail是标志该测试例运行结果为失败,并打印里面的信息
  • 还有一个Specify和It功能完全一样,It属于其简写

4. 使用

var _ = Describe(“Book”, func() { var ( book Book err error     json string )BeforeEach(func() { json = `{ "title":"Les Miserables", "author":"Victor Hugo", "pages":1488 }` })JustBeforeEach(func() { book, err = NewBookFromJSON(json) })AfterEach(func() { By("End One Test") })Describe("loading from JSON", func() { Context("when the JSON parses succesfully", func() { It("should populate the fields correctly", func() { Expect(book.Title).To(Equal("Les Miserables")) Expect(book.Author).To(Equal("Victor Hugo")) Expect(book.Pages).To(Equal(1488)) }) It("should not error", func() { Expect(err).NotTo(HaveOccurred()) }) }) Context("when the JSON fails to parse", func() { BeforeEach(func() { json = `{ "title":"Les Miserables", "author":"Victor Hugo", "pages":1488oops }` }) It("should return the zero-value for the book", func() { Expect(book).To(BeZero()) }) It("should error", func() { if err != nil { Fail("This Case Failed") } })}) })Describe("Extracting the author's last name", func() { It("should correctly identify and return the last name", func(){Expect(book.AuthorLastName()).To(Equal("Hugo")) }) })
})

可以看到,首先定义了全局变量book、err和json。 五个测试例分成两大类,由两个Describe区分,第一类又分成两小类,用Context做区分。每个It包含的就是一个测试用例。 由两个BeforeEach,每个BeforeEach只在当前域内起作用。执行顺序是同一层级的顺序执行,不同层级的从外层到里层以此执行。AfterEach该规则相反。 AfterEach一般用于测试例执行完成后进行数据清理,也可以用于结果判断 尽量不要在var里面给变量赋值,因为每次执行测试用例都有可能改变全局变量的值,会对后面的测试例产生影响,写在BeforeEach中比较合适

func TestBooks(t *testing.T) { RegisterFailHandler(Fail) RunSpecs(t, "Books Suite")
}var _ = BeforeSuite(func() { dbRunner = db.NewRunner() err := dbRunner.Start() Expect(err).NotTo(HaveOccurred())dbClient = db.NewClient() err = dbClient.Connect(dbRunner.Address()) Expect(err).NotTo(HaveOccurred())
})var _ = AfterSuite(func() { dbClient.Cleanup() dbRunner.Stop()
})

BeforeSuite和AfterSuite写在_suite_test.go文件中,会在所有测试例执行之前和之后执行 如果BeforeSuite执行失败,则这个测试集都不会被执行
Tip:使用^C中断执行时,AfterSuite仍然会被执行,需要再使用一次^C中断

5. 标志

有三个:F、X和P,可以用在Describe、Context、It等任何包含测试例的模块

F含义Focus,使用后表示只执行该模块包含的测试

FDescribe(“outer describe”, func() { It(“A”, func() { … }) It(“B”, func() { … })
})

Tip:当里层和外层都存在Focus时,外层的无效,即下面代码只会执行B测试用例

FDescribe(“outer describe”, func() { It(“A”, func() { … }) FIt(“B”, func() { … })
})

P的含义是Pending,即不执行,用法和F一样,规则的外层的生效X和P的含义一样 还有一个跳过测试例的方式是在代码中加

Skip It(“should do something, if it can”, func() { if !someCondition { Skip(“special condition wasn’t met”) }
})

条件满足时,会跳过该测试用例

6. 并发

ginkgo -p 使用默认并发数
ginkgo -nodes=N 自己设定并发数

默认并发数是用的参数runtime.NumCPU()值,即逻辑CPU个数,大于4时,用runtime.NumCPU()-1

并发执行时打印的日志是汇总后经过合并处理再打印的,所以看起来比较规范,每个测试例的内容也都打印在一起,但时不实时,如果需要实时打印,加-stream参数,缺点是每个测试例日志交叉打印

7. goroutine

It(“should post to the channel, eventually”, func(done Done) { c := make(chan string, 0)go DoSomething(c) Expect(<-c).To(ContainSubstring("Done!")) close(done)
}, 0.2)
Ginkgo检测到Done类型参数,就会自动设置超时时间,就是后面那个0.2,单位是秒

8. DesctibeTable用法

有时候很多测试例除了数据部分其他都是相同的,写很多类似的It会很繁琐,于是有Table格式出现

package table_test
import ( . “github.com/onsi/ginkgo/extensions/table” . "github.com/onsi/ginkgo" . "github.com/onsi/gomega"
) var _ = Describe(“Math”, func() { DescribeTable(“the > inequality”, func(x int, y int, expected bool) { Expect(x > y).To(Equal(expected)) }, Entry(“x > y”, 1, 0, true), Entry(“x == y”, 0, 0, false), Entry(“x < y”, 0, 1, false), )
})

等同于

package table_test import ( . “github.com/onsi/ginkgo” . “github.com/onsi/gomega”
)
var _ = Describe(“Math”, func() { Describe(“the > inequality”, It(“x > y”, func() { Expect(1 > 0).To(Equal(true)) })It("x == y", func() { Expect(0 > 0).To(Equal(false)) }) It("x < y", func() { Expect(0 > 1).To(Equal(false)) }) )
})

9. 生成JUnit测试报告

一般生成Junit的XML测试报告

func TestFoo(t *testing.T) { RegisterFailHandler(Fail) junitReporter := reporters.NewJUnitReporter("junit.xml")RunSpecsWithDefaultAndCustomReporters(t, "Foo Suite", []Reporter{junitReporter})
}

10. 测试例性能

使用Measure模块

Measure(“it should do something hard efficiently”, func(b Benchmarker) { runtime := b.Time(“runtime”, func() { output := SomethingHard() Expect(output).To(Equal(17)) })Ω(runtime.Seconds()).Should(BeNumerically("<", 0.2), "SomethingHard() shouldn't take too long.") b.RecordValue("disk usage (in MB)", HowMuchDiskSpaceDidYouUse())
}, 10)

该测试例会运行10次,并打印出执行性能数据

• [MEASUREMENT]
Suite
it should do something hard efficiently Ran 10 samples:
runtime: Fastest Time: 0.01s Slowest Time: 0.08s Average Time: 0.05s ± 0.02s disk usage (in MB): Smallest: 3.0 Largest: 5.2 Average: 3.9 ± 0.4

原文链接:https://xiazemin.github.io/MyBlog/golang/2019/11/02/ginkgo.html

ginkgo测试介绍相关推荐

  1. apache ab测试介绍

    apache ab测试介绍 安装ab命令 环境为ubuntu16.04.2 LTS,安装的命令为: sudo apt-get install apache2-utils 使用说明 格式为:ab [op ...

  2. Web测试介绍2一 安全测试

    安全测试是在IT软件产品的生命周期中,特别是产品开发基本完成到发布阶段,对产品进行检验以验证产品符合安全需求定义和产品质量标准的过程. 主要安全需求包括: (i) 认证 Authentication: ...

  3. [原创]互联网金融App测试介绍

    [原创]互联网金融App测试介绍 前端时间非常忙,终于非常忙的时间过去了,抽时间总结下我现在所在公司理财软件App测试,也各位分享下,也欢迎大家提建议,谢谢! 先介绍下我所在公司的产品特点,公司所研发 ...

  4. 【安全牛学习笔记】Kali Linux***测试介绍

    Kali Linux***测试介绍  安全问题的根源 优点:分工明确,工作效率高. 缺点:从业人员对系统没有整体的认识,对安全认识较为片面. 最大威胁是人,人都会犯错,安全问题不能100%绝对根除. ...

  5. cta 音频测试_CTA测试介绍.pdf

    CTA测试介绍 CTA Introduction 目 录 1 .CTA入网结构及概述 2 .泰尔实验室(CTTL)测试项目简介 3 .泰尔实验室入网测试及问题整改流程 4 .泰尔实验室入网测试注意事项 ...

  6. 计算机培训普通话是什么,普通话培训(计算机辅助普通话测试介绍).ppt

    普通话培训(计算机辅助普通话测试介绍)详解 计算机辅助普通话测试介绍 考生测试(测试站组织) 提示考生佩戴麦克风 考生测试(测试站组织) 考生输入准考证,登录系统 考生测试(测试站组织) 考生信息确认 ...

  7. 虚拟仿真测试介绍(9):硬件在环(HIL)测试简介

    如果方便,请帮忙分享.喜欢和收藏 ,谢谢! "关于硬件在环HIL测试的简单介绍,供大家批评." 01 是什么 硬件在环hardware-in-the-loop,简称HIL,大家可能 ...

  8. 硬件在环仿真(HiL)测试介绍

    一.HiL是什么? 硬件在环仿真(Hardware-in-the-Loop,简称HIL)是真的控制器连接假的被控对象,以一种高效低成本的方式对控制器进行全面测试.它是一种用于复杂设备控制器的开发与测试 ...

  9. 自动驾驶虚拟仿真测试介绍(1):是什么

    自动驾驶虚拟仿真测试介绍(1):是什么 一.引子 二.自动驾驶汽车的仿真测试的不同手段 三.不同仿真测试手段的选择 " 本系列尝试从是什么.为什么.用什么测.怎么测和谁来测等方面来介绍什么是 ...

最新文章

  1. 关于Java API不能远程访问HBase的问题
  2. 利用SAML证书登陆vCenter
  3. WD 蓝盘、绿盘、黑盘、红盘的区别
  4. 请求网页时,怎么给我返回了一段 JavaScript 代码
  5. 【设计模式】第八章 适配器模式
  6. 代码中目录是否以分隔符结尾的再讨论
  7. Linux系统备份与还原
  8. RQNOJ 能量项链
  9. COMSOL数据导入的案例
  10. 矩阵快速幂codevs 3332 数列
  11. 解决谷歌浏览器flash插件已被屏蔽
  12. 阿里云MQTT使用教程
  13. java的inputbox_InputBox函数的使用方法
  14. AI把英语系新生吓退学?别急,我们从来都是那只懒蚂蚁
  15. erp框架 saas_Saas模式ERP系统
  16. linux centOS 没有网,怎么办
  17. python求txt文件内平均值_如何使用python计算几个.dat文件的平均值?
  18. excel表格末尾添加一行_这样输入Excel公式,也太快了吧......
  19. easy_nbt——Bugku
  20. 关于思杰桌面虚拟化的一次交流

热门文章

  1. python3爬虫实例-自己动手,丰衣足食!Python3网络爬虫实战案例
  2. python网课一般多少钱-Python培训网课一般学费多少?毕业生能承担吗?
  3. python百度云资源-python学习资源--百度云
  4. python解释器运行代码-python解释器怎么运行
  5. python3语法错误-python3中的def函数语法错误
  6. python解释器是什么-python解释器都有什么
  7. python3.6.5安装教程-Centos7 安装Python3.6.
  8. python获取excel某一列-Python 读取excel指定的列
  9. python处理excel文件-python处理Excel文件
  10. f1 score 代码_2019JDATA-用户对品类下店铺的购买预测方案及代码分享(亚军)