接口自动化 --- 接口依赖 &用例参数化

一、 接口文档说明
在这里插入图片描述
综上: 充值接口 依赖登录接口返回的用户id信息

二 、 接口依赖处理 & 用例参数化处理

  1. 思路:
    1) 接口依赖:
    登录接口请求成功后,从响应体中提取用户id信息保存下来,充值接口传参时member_id传 登录接口提取的用户id
 2)   用例参数化:    
             a. 用例数据动态数据,如: 用户数据,用变量替代

             b. 测试用例方法中: 获取接口传参数据,先提取变量,再替换成对应数据
  1. 用例设计如下:
    在这里插入图片描述在这里插入图片描述
  2. 代码实战:
    1) 登录接口: 提取用户id并存储
public class RLoginTest extends BaseCase {
	public static String apiNo="2";
	public static int caseSheetNum=2;
	public static boolean isNeedToken = false;
 
	
	/**
	 * 登录用例测试方法
	 * @param url       接口请求地址
	 * @param method    接口请求方法
	 * @param params    接口请求传参
	 * @param Type      接口请求类型
	 * @param title     用例说明
	 */
	@Test(dataProvider="casesExcel")
	public void test_login(API api,Case c )  {
		setDefaultHeaders(isNeedToken);
		// 1. 参数化替换
	    c.setParams(afterReplaceString(c.getParams()));
	    // 2. 数据库前置查询结果
	    // 3. 调用接口
		String body = HttpUtils.request(api.getUrl(),api.getMethod(),api.getContentType(),c.getParams(),headers);
		String flag="FAIL";
		String expect = c.getExepect();
		if (expect.equals(returnAssertResult(body,c))) {
			flag="PASS";
		};
		int case_row =  Integer.parseInt(c.getId().split("_")[1]); // 用例所在行
		addWriteBackData(caseSheetNum, case_row,Constants.ACTUAL_RESPONSE_COLUMNNUM,body,Constants.RESULT_COLUMNNUM,flag);
	    System.out.println("最终测试结果:"+flag);
	    // 提取对应内容并设置全局变量
	    setVariableToEnv(body,"$.data.token_info.token",Constants.TOKEN);
	    setVariableToEnv(body,"$.data.token_info.token_type",Constants.TOKEN_TYPE);
	    setVariableToEnv(body,"$.data.id",Constants.MEMBER_ID);	    
	}
	
	/**
	  * 从Excel中读取用例数据
	 * @return   用例数据,类型,二维数组
	 */
	@DataProvider
	public Object[][] casesExcel(){
	  Object[][] cases =  ExcelUtils.getAPIAndCaseByApiId(apiNo,caseSheetNum);
	  return cases;
 
	}
	
    
    @BeforeClass
    public void init_class(){
    	ExcelUtils.cases = ExcelUtils.read(caseSheetNum,1,Case.class);
 
    }
    
    @AfterClass
    public void clear_class(){
    	ExcelUtils.cases=null;
         
    }
    
}

2) 充值接口

public class SRechargeTest extends BaseCase {
	public static String apiNo="3";
	public static int caseSheetNum=3;
	public static boolean isNeedToken = true;
 
	
	/**
	 * 充值用例测试方法
	 * @param url       接口请求地址
	 * @param method    接口请求方法
	 * @param params    接口请求传参
	 * @param Type      接口请求类型
	 * @param title     用例说明
	 */
	@Test(dataProvider="casesExcel")
	public void test_recharge(API api,Case c )  {
		// 1. 参数化替换
	    c.setParams(afterReplaceString(c.getParams()));
	    // 2. 数据库前置查询结果
	    // 3. 调用接口
        // 环境变量中存在token与token_type,那么就获取并设置键  
		setDefaultHeaders(isNeedToken);
		String body=null;
		String flag="FAIL";
		String sql = c.getSql();
		String expect = c.getExepect();
		if (StringUtils.isNotBlank(sql)) {
			c.setSql(afterReplaceString(sql));
			Object sql_before = SQLUtils.getSQLSingleResult(sql);
		    System.out.println("充值前,数据库查询余额:"+sql_before);
		    body = HttpUtils.request(api.getUrl(),api.getMethod(),api.getContentType(),c.getParams(),headers);	    	
			Object sql_after = SQLUtils.getSQLSingleResult(sql);
		    System.out.println("充值后,数据库查询余额:"+sql_after);
			if (expect.equals(returnAssertResult(body,c)) && sqlAssert(sql_before,sql_after,c) ) {
				flag="PASS";
			}
		}else {
		    body = HttpUtils.request(api.getUrl(),api.getMethod(),api.getContentType(),c.getParams(),headers);	    	
		    if (expect.equals(returnAssertResult(body,c))) {
				flag="PASS";
		    }
		}
			
		int case_row =  Integer.parseInt(c.getId().split("_")[1]); // 用例所在行
		addWriteBackData(caseSheetNum, case_row,Constants.ACTUAL_RESPONSE_COLUMNNUM,body,Constants.RESULT_COLUMNNUM,flag);
	    System.out.println("最终测试结果:"+flag);
	
	}
	
	
	
	/**
	 * 充值前后是否数据库信息正确显示
	 * @param sql_before:充值前,数据库查看余额结果
	 * @param sql_after: 充值后,数据库查看余额结果
	 * @return : 充值前后,数据库信息:充值前+充值金额=充值后
	 */
	public boolean sqlAssert(Object sql_before,Object sql_after,Case c) {
		// 1. 前后充值数据库余额
		BigDecimal before_value = (BigDecimal) sql_before;
		BigDecimal after_value = (BigDecimal) sql_after;
		// 2. 获取充值金额
		String params = c.getParams();
		String amountStr = JSONPath.read(params, "$.amount").toString();
		BigDecimal amount = new BigDecimal(amountStr);
		// 3. 判断:充值前+充值金额=充值后?
		BigDecimal divAmount = after_value.subtract(before_value);
		if(divAmount.compareTo(amount)==0){
			return true;
		}else {
		   return false;}
		
	}
	
	/**
	  * 从Excel中读取用例数据
	 * @return   用例数据,类型,二维数组
	 */
	@DataProvider
	public Object[][] casesExcel(){
	  Object[][] cases =  ExcelUtils.getAPIAndCaseByApiId(apiNo,caseSheetNum);
	  return cases;
 
	}
	
    
    @BeforeClass
    public void init_class(){
    	ExcelUtils.cases = ExcelUtils.read(caseSheetNum,1,Case.class);
 
    }
    
    @AfterClass
    public void clear_class(){
    	ExcelUtils.cases=null;
    }
  }

3) 用例参数第一步替换代码实现如下:

/**
	  * 用例数据参数化
	  * @param str  : 需要处理的数据
	  * @return  替换后的字符串
	  */
	 public static String afterReplaceString(String str) { 
		    if(str.contains("$")) {
		        Set<String> keys = EnvUtils.env.keySet();
		        for(String key:keys) {
		        	String value = EnvUtils.env.get(key);
		        	str = str.replace(key, value);
		        }
		        System.out.println("替换后字符串结果是:" + str);
		    }
		  return str;
		 
	 }

4) 结果截图

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值