欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Bamboo的测试框架的设计

程序员文章站 2022-05-19 17:38:39
...
先说一下对Tir的测试框架的研究成果:
  • 使用telescope作为测试框架的基本工具;
  • 在确保mongrel2作为web server这一块绝对没问题,因此,不再对从浏览器到mongrel2的连接这一过程进行测试,也即是这个测试框架不走socket, http协议这一块;甚至也不测试mongel2到handler这一过程,因为这一块由mongrel2-lua库完成,此库单独进行测试,在发布之前已经过充分测试。因此,本测试框架只测试tir本身,以及tir之上的工程的执行过程;
  • 在确定上述测试范围之后,作者Zed Shaw做了一个聪明且牛逼的设计,充分利用lua的协程,借鉴消费者-生产者的逻辑模式,在同一个进程内实现了发请求、处理子处理、返回结果并与预期值检查核对的事务;
  • 在测试框架中重新定义了start入口函数,覆盖了标准的start入口函数,将整个进程引入test框架的掌控范畴;
  • 在测试框架中伪造了连接需用到的发送,接收,返回等函数,相当于是对web对象的伪造;
  • 在测试框架中实现了Browser对象,能够像在浏览器中点击操作那样,实现对真实环境的模拟,而这一切,仅仅是写代码完成。并且,可以方便地对返回值进行比对检测,实现逼真的效果,而这一切都是程序自动化完成的,仅需敲一个tir test命令就启动这种自动化过程;
  • 整个测试框架仅200多行代码。Zed Shaw真是个大神啊!


在保持上述特点的情况下,我们对其进行了适当改造(不是很容易),使其能适应于bamboo现有的运行机制,并成功跑了起来。

下面再补充几个技术细节点:

定义了一个RESPONSE变量,用于记录从服务端协程代码返回的结果,这是一个列表变量,可以存取不止一个返回结果,最新的放在最后。

makeFakeConnect()函数,伪造一个连接请求;
makeFakeRequest()函数,伪造一个请求对象;
routeRequest()函数,用来路由请求路径;
browser()函数,为一个对象工厂,在里面定义了Browser类,执行一个这个函数就返回一个Browser实例对象,这个对象中封装了各种方法;
start()函数,地位与bin/bamboo_handler中的start相同,用来启动服务端代码。但测试框架中的start与正常模式中的start的区别在于,正常模式中的start是一个main loop,里面有阻塞等待,等待zmq的消息过来;而测试框架中的start,将main loop建立了一个协程包装,并让它由测试代码控制一次次执行,从而实现程序化控制其请求执行过程。

总的来说,这个框架真是把lua的协程发挥得淋漓尽致,从心底崇拜shaw大神。