分享

【Junit5】接口场景化数据依赖解决方案

 TestOps云层 2022-03-17

今日重点

  • Java注解

  • Java反射

  • 自定义@Depends注解

解决问题

上篇讲了接口场景化用例中的2个问题:

  • 接口之间有依赖关系,有执行顺序要求;

  • 场景化接口其中如果有接口失败,后续接口需要ignore;

今天我们来说说另一个问题,接口参数数据依赖问题;

解决方案

1.业务

生成订单接口

{    "phone": "0800485801",    "appid": "1000000001",    "amount": "5800",    "trans_type": "01",    "mchnt_no": "309040889121950"}

查询订单状态

{    "appid": "10000001",                //GenOrderService接口请求参数    "order_id": "18053000313296",       //GenOrderService接口返回参数    "coord_longitude": "121.563352",    "coord_latitude": "31.24005"}

订单支付

{    "appid": "10000001",             //GenOrderService接口请求参数    "order_id": "18053000313296",    //GenOrderService接口返回参数    "coord_longitude": "121.563347",    "coord_latitude": "31.240055",    "field8583": "60000900006001003100170",    "pay_type": "01"}

上述接口场景是订单支付场景,GetPayStatusService和SwitchPospDataService接口请求参数中都依赖GenOrderService接口返回的订单号,请求参数中依赖GenOrderService接口请求参数中的appid;

2.方案

3.注解

@Depends({@Depend(rely = "GenOrderService",rule = "$response.$..order_id=$..order_id"),          @Depend(rely = "GenOrderService",rule = "$request.$..appid=$..appid")})
import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;import static java.lang.annotation.ElementType.METHOD;import static java.lang.annotation.ElementType.TYPE;
@Target({METHOD,TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface Depends { Depend[] value();}
import java.lang.annotation.*;import static java.lang.annotation.ElementType.METHOD;import static java.lang.annotation.ElementType.TYPE;
@Target({METHOD,TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface Depend { String rely(); String rule();}

@Depends:注解主要是解决接口场景化过程中接口数据依赖问题,处理多个接口参数依赖问题;

@Depend:注解具体解决依赖参数;

     rely:表示依赖接口

     rule:依赖规则处理

rule = "$response.$..order_id=$..order_id"$response:规则是将依赖接口的返回报文中order_id字段内容注入到当前接口order_id参数中;

rule = "$request.$..appid=$..appid"$request:规则是将依赖接口的请求报文中appid字段内容注入到当前接口appid参数中;

4.Java反射

反射主要的功能

  • 运行时构造一个类的对象;

  • 运行时获取一个类所具有的的成员变量和方法;

  • 运行时调用任意一个对象的方法;

  • 生成动态代理;其实反射最主要的功能我觉得是与框架搭配使用;

实现方案

  • 框架在执行接口过程中会保持接口全生命周期的参数如:请求、返回等参数信息;

  • 框架在执行用例之前会判断是否存在@Depends如果存在则会利用反射进行解析然后根据规则来处理接口依赖参数;

  • 通过解析Json报文进行注入替换;

注:@Depends反射解析代码暂不提供,此代码需要依赖框架执行;

5.总结

接口场景化

  • 接口之间有依赖关系,有执行顺序要求;

  • 接口场景化用例执行中如果有接口失败,后续接口需要ignore;

  • 接口场景化数据依赖;

通过@DisabledOnScenario@Depends注解我们解决了接口场景化用例的痛点;如果在接口场景化测试过程中还有哪些问题欢迎公众号留言;

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多