在前一篇文章(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格式,一组对应一次迭代。
一步一步......