基于Antlr4实现自定义语法规则

发布时间:2023年12月28日

背景

近期在对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: '-';

文章来源:https://blog.csdn.net/cz1803472613/article/details/135256748
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。