`
yong3773
  • 浏览: 32583 次
社区版块
存档分类
最新评论

测试方法复用:循环迭代执行

阅读更多

    在前一篇文章(http://yong3773.iteye.com/blog/1947109)中,写了在测试方法中循环读取同一参数。今天要介绍的是不同于前一篇文章中写的2种策略。这次的策略更完善,已经付诸实践,在项目测试中取得了成效。

    

    首先介绍一个新概念:执行次序(迭代次序)。

 

    先举个栗子:testA()方法测试的是用户登录,里面有2个变量userName、password。现在我要测试2个不同用户名密码的用户执行testA()方法。

原有的做法:外部数据定义格式(userName1,password1)、(userName2,password2),以此来区分不同时间取不同的变量次数,可缺点也随之而来:逻辑代码里面是userName,数据文件中变成了userName1,容易混淆,不易理解。

现在的做法: 外部数据定义格式(userName,password,1)、(userName,password,2),里面的数字就是迭代的次序。第一次迭代的时候取前面括号里面的变量,第二次的时候取后面括号中的内容。

 

此次的更新,涉及到数据库表结构变更(数据驱动的数据持久化存在数据库中),数据管理web前端的修改,服务后端的修改。虽然涉及的地方很多,但长痛不如短痛,为了以后更方便,下决心改!

 

数据管理平台变更如下图:



 



 
 

 



 

 

接口测试工具类中增加如下方法:

	//得到测试所需参数的方法
	public static String queryValue(String className,String methodName,String paramName,int executeOrder){
		String paramValue=null;
		con.connect();
		con.sql="SELECT PARAM_VALUE FROM params WHERE CLASS_NAME = '"+className+"' AND METHOD_NAME='"+methodName+"' AND PARAM_NAME='"+paramName+"' AND `STATUS` = '0' AND EXECUTE_ORDER='"+executeOrder+"';";

		con.executeQu();	
	
		try {
			while(con.rs.next()) {
				paramValue = con.rs.getString("PARAM_VALUE");	
			
			}			
		} catch (SQLException e) {			
			e.printStackTrace();
		} 		
		if(paramValue==null){
			try {
				throw new Exception("数据库没有查到此属性的值,或者此值为null");
			} catch (Exception e) {				
				e.printStackTrace();
			}	
		}

		con.closeConnect();		
		return paramValue;
		
	}
	
	//得到此测试方法的最大迭代次数方法
	public static int getMaxOrder(String className,String methodName,String paramName){
		con.connect();
		con.sql="SELECT MAX(EXECUTE_ORDER) AS max FROM params WHERE CLASS_NAME = '"+className+"' AND METHOD_NAME='"+methodName+"' AND PARAM_NAME = '"+paramName+"' AND `STATUS` = '0';";
		con.executeQu();		
		int maxRow = 0;
		con.connect();
		String str=con.sql;
		
		try {
			while(con.rs.next()) {			
				maxRow=con.rs.getInt("max");
			}			
		} catch (SQLException e) {			
			e.printStackTrace();
		} 

		con.closeConnect();		
		return maxRow;		
	}

 

 

具体到接口测试代码中的运用,sample代码如下:

/**
 * 
 */
package com.cpsdna.saasapi.test.common;
import static org.junit.Assert.*;
import org.apache.log4j.Logger;
import org.junit.Test;
import com.cpsdna.test.util.DBUtil;
import com.cpsdna.test.util.ParamUtil;
/**
 * @author ChenYong
 * @time 2013-11-4 下午2:01:49
 */
public class ParamTest {	
	private static Logger log = Logger.getLogger(ParamTest.class.getName());
	@Test
	public void testParam() {		
		log.info("START "+ParamUtil.getClassName()+"."+ParamUtil.getMethodName()+"()++++++++++");	
		try{	
			
			int IterationNum=DBUtil.getMaxOrder(ParamUtil.getClassName(), ParamUtil.getMethodName(), "userName");	//首先取得最大的迭代次数
			
			if(IterationNum==0){
				log.info("迭代次数为0,直接跳出测试方法");
			}else{
				log.info("共有"+IterationNum+"次迭代");
			}
			
			for(int j=1;j<=IterationNum;j++){		//根据迭代次数,循环		
				String userName=DBUtil.queryValue(ParamUtil.getClassName(), ParamUtil.getMethodName(), "userName",j);
				String password=DBUtil.queryValue(ParamUtil.getClassName(), ParamUtil.getMethodName(), "password",j);
				
		    	log.info("------第"+j+"次迭代开始------");
		    	
		    	if(userName==null || password==null){
		    		log.info("第"+j+"次迭代的时候,数据库缺少此次迭代所需参数,跳出本次迭代");
		    		continue; 
		    	}	
		    	
		    	//具体的测试逻辑代码写在这里
		    	
			}			
		}catch (Exception e) {			
			log.error(this, e);			
			fail("Exception Occured");
		}			
		log.info("END "+ParamUtil.getClassName()+"."+ParamUtil.getMethodName()+"()++++++++++");
	}

}

 

 

ok,上面就是变更逻辑之后的一些地方。

 

待改进的地方:

1.数据管理的web端,参数数据输入的时候还是不太方便,一次只能输入一个。

2.准备把数据库中的参数数据保存成json格式,一组对应一次迭代。

 

一步一步......


 

 

  • 大小: 14.9 KB
  • 大小: 64.7 KB
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics