中文站

直播业务数据工厂自动生成代码

本文由作者陈诚授权网易易盾发布 

直播业务通过类梳理规范原子类的实现,将参数信息和URL信息拆分出来,实现原子类的统一编码,通过Java AST对源代码进行语法分析,获取URL请求的参数名、是否必填等信息,最后结合Velocity,将编码模板化,传入必要参数信息渲染原子模板,实现自动编写代码,快速满足数据工厂的测试需求。

我们平时使用数据工厂辅助测试时,需要实现数据工厂服务端代码,调试通过之后开始编辑前端豆腐块,2项完成之后才算是完成了数据工厂的测试需求。

直播业务测试组的实践过程中,由于直播的业务基本上都是基于HTTP请求发起的,在接收到数据银行辅助测试的需求之后,会首先找到业务相关的URL,然后实际发起业务操作,从浏览器网络请求信息中获取到请求的参数名字和参数值,然后基于这些数据再开始编写每个URL的操作代码,传入不同参数,获取返回结果。

在梳理完开发流程之后,我们基于java的模板方法设计模式,将组成HTTP请求的参数和方法抽象出来,编写了基础的atom基类。atom类中实现了一个HTTP请求的参数校验、参数组装和请求发送,为了保持灵活性,我们将参数校验和参数组装设计为抽象函数,必须由子类实现,同时子类必须给URL和HTTP方法这2个变量赋值。这样处理之后每次编写新URL方法时继承atom基类,然后实现对应的方法和给特定变量赋值,便完成了一个URL请求类的编写,代码实现统一,效率高,方便管理。类图如下(部分):


经过一段时间的开发实践之后,我们发现获取url参数在整个流程中比较耗时。如果编写时遇到环境不通、参数变化等问题时我们就要排查解决这些问题之后再开始编码,这对我们实现代码是个很严重的阻塞。为此,我们开始探索其他方式实现此过程。

在探索的过程中,我们了解到了Java的AST(Abstract syntax tree,抽象语法树),AST可以理解为java文件的dom模型,dom4j解析xml文件的时候有一套模型,而AST其实就是解析java文件的模型。通过AST对Java源码的解析,可以获取到代码的一些信息。于是我们开始编写代码进行实验。通过继承ASTVisitor类实现MethodVisitor方法实现我们需要的功能。主要流程如下图:


通过MethodVisitor,我们获取到了HTTP请求Controller类的URL和请求参数的一些信息,例如参数名、参数是否必填等,有了这些信息之后编写atom代码就没问题了。获取的参数信息如下图:


此时通过代码已经获取到了相关信息,如果将相关信息打印出来,手动编写代码,不如接着写下去,用代码自动生成代码。

经过之前的编码调整之后,直播数据工厂的实现具备这样的条件,虽然不同URL的实现代码不一样,但是atom类里面有部分内容是一样的。对此我们将其抽象成一个Velocity模板,通过Velocity将其渲染成我们的URL atom类。渲染的结果如下图:


Velocity方式渲染的Java文件代码上满足了我们的要求,但是也可以看出渲染出来的Java文件格式上不友好,渲染之后还需要人工调整一下格式让代码看起来更优美。

目前直播已经开始使用这种方式编写数据工厂代码,一般的需求投入少量人工即可完成代码编写,整体效率较之前有很大提升。不过采用这种方式编码首先要将应用代码下载到本地,然后指定controller的文件路径来获取AST信息的,此处不太优雅,后续需要在此基础上进行优化,尽量减少全过程的人工参与,让工具的自动化程度更高。