对于前端的E2E测试,BDD (Behavior Driven Design)风格的Codeceptjs是一个不错的选择。之前的一篇文章对其进行了简要的介绍【1】。其测试框架的搭建也是极为简单【2】。而且,可以通过javascript的npm工具对codeceptjs进行扩展,其配置之简单,使用之高效,扩展之丰富,完全不逊色于java生态环境下的maven。本文主要介绍如何扩展codeceptjs,以REST API的方式管理远程数据。同时,根据项目的具体情况还对其进行了一些定制化的工作,在这里分享给大家,欢迎讨论。
在E2E测试中,往往需要准备数据。例如,需要测试在UI中删除一个用户的功能,最直接的方式是在测试开始之前,先在UI上进行用户的添加操作。这种方式固然易于理解和实现,似乎也接近真实场景,但是却有一些问题,例如测试步骤的冗余,case更加的不稳定,等等。在这种情况下,一般是采用REST API向后台插入数据。Codeceptjs提供的方案就是apiDataFactory + REST。
对于apiDataFactory + REST的配置,官方文档中提供了详细的步骤【3】,参照起来并不困难。但是这些都是基本的配置,有的时候还要根据自己项目中的具体情况进行一些额外的工作。例如,在我们的项目中,由于REST API是一个https开头的URL,所以会遇到UNABLE_TO_VERIFY_LEAF_SIGNATURE unable to verify the first certificate:
API_SSL.png所以需要扩展默认的Rest Helper的方法_executeRequest,在request请求被发出之前,将strictSSL设置为false。
MyBaseRest
_executeRequest(request) { let newRequest = request; if (request.options.body) { let newRequest = Object.assign({}, request); newRequest.options = Object.assign({}, request.options); newRequest.options.body = TestUtil.processExpressionsInData(newRequest.options.body); } return super._executeRequest(newRequest.strictSSL(false));}
另外,REST helper的应用场景不仅包括apiDataFactory,而且还包括修改密码、设置属性等操作。前者已经被框架包装在了promise里,后者需要我们自己对其进行包装。从面向对象的角度考虑的话,需要一个新的类继承自MyBaseRest,在这个类中,_executeRequest是一个async方法:
class MyRest extends MyBaseRest { /** * Override base method, * process response before returning * Executes unirest request * * @param {*} request */ async _executeRequest(request) { let response = await super._executeRequest(request); return TestUtil.getJsonFromResponse(response); }}
这样,在配置文件中配置两个rest helper,一个是MyBaseRest用于支持apiDataFactory,另一个继承自MyBaseRest,在这个类中,_executeRequest是一个async方法。
我在github里面共享了代码【4】,有兴趣的朋友可以帮忙review。多谢
【1】浅析 codeceptjs
【2】第一个codeceptjs测试框架
【3】ApiDataFactory
【4】api_data_factory_rest
网友评论