基于数据驱动的自动化框架,在我们编写测试代码时,测试方法一定要做到复用性。
实际工作中我们发现,不同的入参对应不同的预期结果,一般情况下,我们都会写多个测试方法应对多次入参,这样是很耗时耗力的。
仔细想想:测试方法中的处理逻辑是不变的,变的是入参和预期的结果。所以如果能做到一个测试方法中,循环多次读取同一个变量的入参值,就能做的测试方法的复用性,提高效率。
举个例子:测试方法如下,有2个入参,需要测试不同入参情况下测试方法的处理情况。我们总不能一种入参就写一个测试方法吧?那样的话,testB()、testC()....没完没了了。
@Test
public void testA() {
String userName;
String password;
.
.
.
//测试方法实现逻辑代码
.
.
.
assertEquals(actual,expected)
}
入参userName、password变量取自数据库,如果需要测试2次不同的入参,第一次userName=demo1,password=111111,第二次userName=demo2,password=222222,那么我们如何在数据库中存储变量,又如何在程序中处理呢?我这边有2中思路。
思路1:
数据库中存储形式如下
param | value |
userName | demo1 |
password | 111111 |
userName | demo2 |
password | 222222 |
参数读取程序通过limit,顺序读取每次不同的值
if(indexRow==totalRow){
con.sql="SELECT VALUE FROM table WHERE PARAM='"+paramName+"' limit "+startIndex+","+totalRow+";";
}else{
con.sql="SELECT VALUE FROM table WHERE PARAM='"+paramName+"' limit "+startIndex+","+endIndex+";";
}
//totalRow是同一个次数变量出现的次数,比如userName出现2次,那么totalRow=2
//startIndex是数据库开始读取的坐标
//endIndex是数据库结束读取的坐标
//indexRow是目标读取的坐标
//他们的关系是startIndex=indexRow-1;endIndex=totalRow-indexRow;
测试程序通过for循环,加入循环次数
for(int i=1;i<=totalRow;i++){
String userName=DBUtil.query( "userName",i);
String password=DBUtil.query( "password",i);
}
这种思路的优点就是数据库显示明了(userName还是userName),当然缺点也很明显,难以区分哪个userName是第一次调用,哪个是第二次调用。
思路2:
数据库中存储形式如下
param | value |
userName1 | demo1 |
password1 | 111111 |
userName2 | demo2 |
password2 | 222222 |
参数读取程序通过正常一条sql读取各自的值
con.sql="SELECT VALUE FROM table WHERE PARAM='"+paramName+"';";
所有的定位循环操作放在测试程序中
for(int i=1;i<=totalRow;i++){
String userName=DBUtil.query("userName"+i);
String password=DBUtil.query("password"+i);
}
思路2的优点很明显,程序处理简单很多,也利于识别哪次调用哪个参数。缺点就是数据库改变了变量的名称。
上面2中思路,在我的自动化接口测试中都有尝试,最终选择了第二种思路。一个测试方法,只关心输入数据(不限次数),无限复用,这也是数据驱动一种体现吧。
供大家参考。转载请注明出处,谢谢。