近期在对PostGirl自动化测试平台(https://gitee.com/chengzhi2/post-girl)进行深度优化时,考虑到定制测试模块之前只能对接口的出参结果进行校验检查,这样并不能保证接口的正确性,于是想到了在接口执行之前增加前置动作,前置动作主要实现的功能是对接口执行之前对数据库的数据状态做记录,然后在接口执行之后增加后置动作,后置动作则是再次查询数据库,以此来推断数据的变化是否是由接口执行引起的。
举一个简单的例子,比如充值Q币,假如有一个接口的功能就是根据调用方传入的Q币数,去更新用户的账户余额。那么我们可以这样做:
这里就要引申出本篇文章的重点内容了:使用Antlr4来自定义一个语法规则,测试人员只需要写一段小小的代码后台即可解析验证。
具体实现如下:
先展示程序最终要支持的表达式:
{A?CA_POCKET.AMOUNT} - {B?CA_POCKET.AMOUNT} = {REQ?$.req.pay_amount}
大概解释下这个表达式想要表达的意思,即接口调用后CA_POCKET表的amount字段值减去接口调用前的CA_POCKET的amount字段值等于接口请求报文中的pay_amoount的值。
语法规则如下:
grammar JefExpression; // 自定义表达式解析
prog: start;
start:
leftexpr EQUALS rightexpr # assign
| NEWLINE # blank
;
leftexpr: expr;
rightexpr: expr;
expr: expr op=( MUL | DIV) expr # MulDiv // 乘除法运算
| expr op=( ADD | SUB) expr # AddSub // 加减法运算
| INT # number // 普通数字类型
| DBPLACEHOLDER # dbplaceholder // 左占位符
| JSONPLACEHOLDER # jsonplaceholder // 右占位符
| '(' expr ')' # parens // 括号
;
EQUALS: '=';
DBPLACEHOLDER: '{' AB '?' [a-zA-Z._0-9]+ '}'; // 数据库占位符
JSONPLACEHOLDER: '{' REQ_RESP '?' [a-zA-Z._0-9$]+ '}'; // JSON占位符
AB: 'A' | 'B'; // A标识after, B标识Before after和before都是针对接口调用而言的,after时接口调用之后,before是接口调用之前
REQ_RESP: 'REQ' | 'RESP'; // REQ标识请求,RESP标识响应
INT: [0-9]+;
NEWLINE: '\r' ? '\n';
WS: [ \t]+ -> skip;
MUL: '*';
DIV: '/';
ADD: '+';
SUB: '-';