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

2022-04-07 09:39:20 浏览数 (1)

今日重点

  • Java注解
  • Java反射
  • 自定义@Depends注解

解决问题

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

  • 接口之间有依赖关系,有执行顺序要求;
  • 场景化接口其中如果有接口失败,后续接口需要ignore;

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

解决方案

1.业务

生成订单接口

代码语言:javascript复制
{
    "phone": "0800485801",
    "appid": "1000000001",
    "amount": "5800",
    "trans_type": "01",
    "mchnt_no": "309040889121950"
}

查询订单状态

代码语言:javascript复制
{
    "appid": "10000001",                //GenOrderService接口请求参数
    "order_id": "18053000313296",       //GenOrderService接口返回参数
    "coord_longitude": "121.563352",
    "coord_latitude": "31.24005"
}

订单支付

代码语言:javascript复制
{
    "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.注解

代码语言:javascript复制
@Depends({@Depend(rely = "GenOrderService",rule = "$response.$..order_id=$..order_id"),
          @Depend(rely = "GenOrderService",rule = "$request.$..appid=$..appid")})
代码语言:javascript复制
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();
}
代码语言:javascript复制
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 = "..order_id",

rule = "..appid",

4.Java反射

反射主要的功能

  • 运行时构造一个类的对象;
  • 运行时获取一个类所具有的的成员变量和方法;
  • 运行时调用任意一个对象的方法;
  • 生成动态代理;其实反射最主要的功能我觉得是与框架搭配使用;

实现方案

  • 框架在执行接口过程中会保持接口全生命周期的参数如:请求、返回等参数信息;
  • 框架在执行用例之前会判断是否存在@Depends如果存在则会利用反射进行解析然后根据规则来处理接口依赖参数;
  • 通过解析Json报文进行注入替换;

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

5.总结

接口场景化

  • 接口之间有依赖关系,有执行顺序要求;
  • 接口场景化用例执行中如果有接口失败,后续接口需要ignore;
  • 接口场景化数据依赖;

通过@DisabledOnScenario@Depends注解我们解决了接口场景化用例的痛点;如果在接口场景化测试过程中

0 人点赞