在前一篇文章(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格式,一组对应一次迭代。
一步一步......
相关推荐
软件复用:结构、过程和组织.pdf
为您提供各种相关的软件复用:结构、过程和组织知识,真正提高您这一方面的实力
软件工程相关的 software reuse
软件测试中的测试用例及复用研究.pdf
round_robin_iter:一个迭代器,以循环方式复用其他迭代器
行业资料-建筑装置-废纸循环复用方法及废纸循环复用打印机.zip
源码详解文章地址 https://blog.csdn.net/yadoufeng/article/details/130443058?spm=1001.2014.3001.5502
资源搜集不易,感谢大家支持!
需求分析—测试需求—测试计划—测试方案—测试用例—执行测试—测试报告 测试用例理论 划分等价类 边界值分析 测试用例理论 测试用例:指导测试,是测试的依据,输入(数据、文件、)操作步骤执行条件,预期结果 ...
I/O复用的循环服务器创建两个线程,一个是客户端连接处理线程,专门用来处理客户端的连接,当有客户端到来的时候,此线程把客户端的套接字描述符放到一块公共的区域中。另一个是业务处理线程,此线程轮循(select)...
学习如何编写Yii2扩展,以扩展形式编写资源包,实现在不同应用和项目之间重用资源包,且降低维护成本。
php代码-代码的复用:trait
密集/粗波分复用技术要求与测试方法~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~好东西
介绍了广播分复用系统的技术特点、参数要求,以及在网络测试中的应用方法
:软件测试用例复用是在软件测试过程中避免重复劳动的解决方案.对于第三方测试机构来说,测试用例的 成功复用对与测试工作的开展尤为重要.通过复用,测试人员可以充分利用已有的测试用例,消除包括分析、设 计、...