高效测试框架推荐之ginkgo(代码片段)

jinsdu jinsdu     2023-04-27     695

关键词:

自2015年开始,七牛工效团队一直使用Go语言+Ginkgo的组合来编写自动化测试用例,积累了大约5000+的数量。在使用和维护过程中,我们觉得Ginkgo的很多设计理念和功能非常赞,因此特分享给大家。

本篇不是该框架的入门指导。如果您也编写或维护过大量自动化测试用例,希望能获得一些共鸣.

BDD(Behavior Driven Development)

要说Ginkgo最大的特点,笔者认为,那就是对BDD风格的支持。比如:

    Describe("delete app api", func() 
        It("should delete app permanently", func() ...)
        It("should delete app failed if services existed", func() ...)

It‘s about expressiveness。Ginkgo定义的DSL语法(Describe/Context/It)可以非常方便的帮助大家组织和编排测试用例。在BDD模式中,测试用例的标题书写,要非常注意表达,要能清晰的指明用例测试的业务场景。只有这样才能极大的增强用例的可读性,降低使用和维护的心智负担。

可读性这一点,在自动化测试用例设计原则上,非常重要。因为测试用例不同于一般意义上的程序,它在绝大部分场景下,看起来都像是一段段独立的方法,每个方法背后隐藏的业务逻辑也是细小的,不具通识性。这个问题在用例量少的情况下,还不明显。但当用例数量上到一定量级,你会发现,如国能快速理解用例到底是能做什么的,真的非常重要。而这正是BDD能补足的地方。

不过还是要强调,Ginkgo只是提供对BDD模式的支持,你的用例最终呈现的效果,还是依赖你自己的书写。

进程级并行,稳定高效

相应的我们知道,BDD框架,因为其DSL的深度嵌套支持,会存在一些共享上下文的资源,如此的话想做线程级的并发会比较困难。而Ginkgo巧妙的避开了这个问题,它通过在运行时,运行多个被测服务的进程,来达到真正的并行,稳定性大大提高。其使用姿势也非常简单,ginkgo -p命令就可以。在实践中,我们通常使用32核以上的服务器来跑集测,执行效率非常高。

这里有个细节,Ginkgo虽然并行执行测试用例,但其输出的日志和测试报告格式,仍然是整齐不错乱的,这是如何做到的呢?原来,通过源码会发现,ginkgo CLI工具在并行跑用例时,其内部会起一个监听随机端口的本地服务器,来做不同进程之间的消息同步,以及日志和报告的聚合工作,是不是很巧妙?

其他的一些Tips

Ginkgo框架的功能非常强大,对常见测试场景的都有比较好的支持,即使是一些略显复杂的场景,比如:

  • 在平时的代码中,我们经常会看到需要做异步处理的测试用例。但是这块的逻辑如果处理不好,用例可能会因为死锁或者未设置超时时间而异常卡住,非常的恼人。好在Ginkgo专门提供了原生的异步支持,能大大降低此类问题的风险。类似用法:

    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)
  • 针对分布式系统,我们在验收一些场景时,可能需要等待一段时间,目标结果才生效。而这个时间会因为不同集群负载而有所不同。所以简单的硬编码来sleep一个固定时间,很明显不合适。这种场景下若是使用Ginkgo对应的matcher库GomegaEventually功能就非常的贴切,在大大提升用例稳定性的同时,最大可能的减少无用的等待时间。
  • 笔者一直认为,自动化测试用例不应该仅仅是QA手中的工具,而应该尽可能多的作为业务验收服务,输出到CICD,灰度验证,线上验收等尽可能多的场景,以服务于整个业务线。同样利用Ginkgo我们可以很容易做到这一点:
    • CICD: 在定义suite时,使用RunSpecWithDefaultReporters方法,可以让测试结果既输出到stdout,还可以输出一份Junit格式的报告。这样就可以通过类似Jenkins的工具方便的呈现测试结果,而不用任何其他的额外操作。
    • TaaS(Test as a Service): 通过ginkgo build或者原生的go test -c命令,可以方便的将测试用例,编译成package.test的二进制文件。如此的话,我们就可以方便的进行测试服务分发。典型的,如交付给SRE同学,辅助其应对线上灰度场景下的测试验收。所以在测试用例的组织上,这里有个小建议,过往我会看到有同学会习惯一个目录就定义一个suite文件,这样编译出的二进制文件就非常多,不利于分发。所以建议不要定义太多的suite,可以一条产品就一个suite入口,其他的用例包通过_导入进来。比如:
      技术图片

另外,值得说道的是,Ginkgo框架在提供强大功能和灵活性的同时,有些地方也需要使用者特别留心:

  • DescribeTable功能是对TableDriven模式的友好支持,但它的原理是通过Entry在用例执行之前,通过反射机制来自动生成It方法,所以如果期望类似BeforeEach+It的原生组合来使用BeforeEach+Entry的话,可能在值类型的变量传递上,会不符合预期。其实,相较于DescribeTable+Entry的模式,我个人更倾向于通过方法+多个It的原生组合来写用例,虽然代码量显得有点多,但是用例表达的逻辑主题会更清晰,可读性较高。类似如下:
    技术图片
  • Ginkgo CLI的focus和skip命令非常好用,能够灵活的指定想执行或者排除的测试用例。不过要注意的是,focus和skip传入的是正则表达式,而适配这个正则的,是组成用例的所有的Container标题的组合(Suite+Describe+Context+It), 这些标题从外到里拼接成的完整字符串,所以使用时当注意。

都有谁在用Ginkgo?

Ginkgo的官方文档非常详细,非常利于使用。另外,我们看到著名的容器云项目Kubernetes也是使用Ginkgo框架来编写其e2e测试用例。

最后,如果您也使用Go语言来编写测试用例,不妨尝试下Ginkgo。

Contact me ?

技术图片

Email: jinsdu@outlook.com
Blog: http://www.cnblogs.com/jinsdu/
Github: https://github.com/CarlJi

接口测试框架实战之requests与接口请求构造(代码片段)

...缺少了许多实用功能。所以,更推荐掌握Requests接口测试实战技能,这也是互联网大厂流行的接口测试利器。下面从安装Requests 查看详情

unittest单元测试框架之测试套件(代码片段)

1.测试套件(注意:测试用例先添加先执行,后添加后执行,由此组织与设定测试用例的执行顺序)addTests:添加多个测试用例addTest:添加单个测试用例importunittestfromUnittestDemo.test_mathfuncimportTestMathFuncif__name__=="__main__":  suite=uni... 查看详情

unittest单元测试框架之unittest框架的总结2(代码片段)

unittest下的属性1.Unittest.TestCase:所有测试用例类继承的基本类2.Unittest.main():将一个单元测试模块变为可直接运行的测试脚本If__name__==“__main__”:Unittest.main()3.Unittest.TestSuite:创建测试套件4.unittest.TextTestRunner():unittest框架的TextTestRunn 查看详情

012-goorm框架之gorm测试(代码片段)

1:参考:https://github.com/jinzhu/gorm2:数据库脚本(pg)--createtableposts(idserialprimarykey,contenttext,authorvarchar(100),create_timetimestamptz);createtablecomments(idserialprimarykey,contenttext,authorvarc 查看详情

自动化测试框架之pytest(代码片段)

基于python的自动化测试框架:unittest (白盒单元测试)pytest(白盒单元测试)robotframework (系统测试)pytest可以用来做系统测试的自动化,它的特点有用Python编写测试用例,简便易用可以用文... 查看详情

webui自动化测试框架搭建之需求整理详细设计框架设计(代码片段)

(WebUI自动化测试框架搭建之需求整理、详细设计、框架设计)1总体需求1.1实现目的基于BS架构,模拟用户(鼠标、键盘)操作,达到快速、重复执行测试用例;便于回归测试,快速覆盖主线用例或功能;线上或线下巡检测试,结... 查看详情

ginkgo在windows下的安装使用

 ginkgo在windows下的安装使用ginkgo是GOLANG的一个测试框架https://github.com/onsi/ginkgo安装建一个自己的文件夹,如D:workspacego-test-go在计算机->环境变量中设置GOPATH打开gitbash执行gogetgithub.com/onsi/ginkgo/ginkgogogetgithub.com/onsi/ 查看详情

unittest单元测试框架之测试结果输出到外部文件(代码片段)

1.test_suit执行测试用例及输出结果前添加如下代码(打开会新建d:/result.txt文件):  withopen("d:\result.txt","a")asf:importunittestfromUnittestDemo.test_mathfuncimportTestMathFuncif__name__=="__main__":  suite=unittest.TestSuite( 查看详情

unittest单元测试框架之测试用例的跳过(skip)(代码片段)

1.跳过测试用例的方法@unittest.skip("don‘trunthiscase!"):@unittest.skipIf(3<2,"don‘trunthiscase!"):@unittest.skipUnless(3>2,"don‘trunthiscase!"):importunittestfromUnittestDemo.mathfuncimport*classTestMath 查看详情

高效告别996,开启java高效编程之门3-23汇总操作实战案例(代码片段)

1    重点:1.1  reducedemo组成1.2  准备数据1.3  并行计算 2    规约操作实战案例测试类:packagecom.imooc.zhangxiaoxi.stream;importcom.alibaba.fastjson.JSONObject;importcom.google.common.collect.Lists;importorg.junit.Test;i 查看详情

unittest单元测试框架之测试环境的初始化与还原(fixture)(代码片段)

1.方法一:针对每条测试用例进行初始化与还原importunittestfromUnittestDemo.mathfuncimport*classTestMathFunc(unittest.TestCase):"""测试mathfunc.py"""  #在每条测试用例执行之前准备好测试环境  defsetUp(self):    print("dosomethingbeforetest!")  # 查看详情

自动化测试框架之unittest(代码片段)

自动化测试之单元测试单元测试:通常而言,一个单元测试用例是用于判断某个特定条件或场景下某个特定函数的行为直观描述:针对一个函数,构造不同输入,验证函数的输出是否符合预期但需要注意:... 查看详情

单元测试之junit篇(代码片段)

简介关于单元测试的工具调研可以参考:https://km.sankuai.com/page/365031302在构建本地单元测试的时候,JUnit4测试框架是java标准测试库,junit测试框架可以让你在编写测试代码的中进行setup,卸载,和断言等操作。... 查看详情

unittest单元测试框架之unittest案例(代码片段)

1.待测方法:1#加法,返回a+b的值2defadd(a,b):3  returna+b4#减法,返回a-b的值5defminus(a,b):6  returna-b7#乘法,返回a*b的值8defmulti(a,b):9  returna*b10#除法,返回a/b的值11defdivide(a,b):12  returna/b2.测试用例importunittestfromUnittestDem 查看详情

rl-tcpnet之高效的事件触发框架

第21章      RL-TCPnet之高效的事件触发框架本章节为大家讲解高效的事件触发框架实现方法,BSDSocket编程和后面章节要讲解到的FTP、TFTP和HTTP等都非常适合使用这种方式。实际项目中也推荐大家采用这种方式... 查看详情

java之webmagic网络爬虫(代码片段)

...ic是一个简单灵活的Java爬虫框架。你可以快速开发出一个高效、易维护的爬虫。    http://webmagic.io/ 准备工作:    Maven依赖(我这里用的Maven创建的web项目做测试):    <dependencies><!--junit--><dependency... 查看详情

pyhton+selenium+unittest自动化测试框架之测试报告(代码片段)

一、HTMLTestRunner下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html下载后将py文件放到python安装目录的Libsite-packages文件夹下即可使用,但需要注意的是HTMLTestRunner是基于python2t版本的,如果你使用的是python3,那么还需要对HTMLTestRun... 查看详情

pytest测试框架(代码片段)

...thon自带的unittest测试框架类型,但是pytest使用起来更简洁高效。pytest支持315种以上的插件,可以访问网址:http://plugincompat.herokuapp.com/pytest帮助文档地址:https://docs.pytest.ort/安装pipinstall-Upytest查看版本pytest--version用例识别与运行... 查看详情