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

本文介绍了一种新的迭代测试策略,通过引入执行次序的概念,优化了参数管理方式,使得测试更加高效且易于理解。该策略已在实际项目中成功应用。

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

 

一步一步......


 

 

Delphi 12.3 作为一款面向 Windows 平台的集成开发环境,由 Embarcadero Technologies 负责其持续演进。该环境以 Object Pascal 语言为核心,并依托 Visual Component Library(VCL)框架,广泛应用于各类桌面软件、数据库系统及企业级解决方案的开发。在此生态中,Excel4Delphi 作为一个重要的社区开源项目,致力于搭建 Delphi 与 Microsoft Excel 之间的高效桥梁,使开发者能够在自研程序中直接调用 Excel 的文档处理、工作管理、单元格操作及宏执行等功能。 该项目以库文件与组件包的形式提供,开发者将其集成至 Delphi 工程后,即可通过封装良好的接口实现对 Excel 的编程控制。具体功能涵盖创建与编辑工作簿、格式化单元格、批量导入导出数据,乃至执行内置公式与宏指令等高级操作。这一机制显著降低了在财务分析、报自动生成、数据整理等场景中实现 Excel 功能集成的技术门槛,使开发者无需深入掌握 COM 编程或 Excel 底层 API 即可完成复杂任务。 使用 Excel4Delphi 需具备基础的 Delphi 编程知识,并对 Excel 对象模型有一定理解。实践中需注意不同 Excel 版本间的兼容性,并严格遵循项目文档进行环境配置与依赖部署。此外,操作过程中应遵循文件访问的最佳实践,例如确保目标文件未被独占锁定,并实施完整的异常处理机制,以防数据损毁或程序意外中断。 该项目的持续维护依赖于 Delphi 开发者社区的集体贡献,通过定期更新以适配新版开发环境与 Office 套件,并修复已发现的问题。对于需要深度融合 Excel 功能的 Delphi 应用而言,Excel4Delphi 提供了经过充分测试的可靠代码基础,使开发团队能更专注于业务逻辑与用户体验的优化,从而提升整体开发效率与软件质量。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值