Bamboo的测试框架的设计

阅读更多
先说一下对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大神。

你可能感兴趣的:(Bamboo的测试框架的设计)