欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-19 22:50:43
...

一、 接口文档说明

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

        综上: 充值接口 依赖登录接口返回的用户id信息

 

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

1.    思路:

     1) 接口依赖:

              登录接口请求成功后,从响应体中提取用户id信息保存下来,充值接口传参时member_id传 登录接口提取的用户id

     2)   用例参数化:    

                 a. 用例数据动态数据,如: 用户数据,用变量替代

                 b. 测试用例方法中: 获取接口传参数据,先提取变量,再替换成对应数据

2.  用例设计如下:

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

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

3.  代码实战:

  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) 结果截图

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