基于Hibernate对Http接口进行全集测试实践

在测试工作中,一般都很难做到全集测试,通常都是基于边界值、等价类划分的方法进行测试数据的设计。在实际测试中,可能会因为覆盖不全导致一些bug没有测出来。在本文中我准备对一个接口进行全集测试,就是覆盖所有路径。

测试对象

Http接口:http://..../common/getddd.do?d1=D032&d2=D032034&d3=D032055

从接口可以看出传进去的参数有3层组织:d1,d2,d3。d1>d2>d3,d1包含多个d2,d2包含多个d3,d1有多个。所以这边的排列组合是非常多的,全集测试时如果这块测试数据自己直接去组织的话,会非常繁琐。

如下图:

所以,要想办法简化测试数据生成过程。

考虑到,d1,d2,d3的组织关系可以直接到数据库中查关系表来获取,所以打算用Hibernate直接从数据库中取对应关系生成测试数据。

使用Hibernate取组织关系,生成测试数据

从关系表中,取得d1,d2,d3之间的关系,拼装成各种组合。

用Hibernate遍历数据库关系表,通过下面的代码获取某个d1下面所有d2,d3的组合。

public static ArrayList GetList(String deptId){
		urllist.add("dept1="+deptId);
		Session session = HibernateUtil.getSessionFactory().openSession();
		session.beginTransaction();
		Criteria criteriadep2 = session.createCriteria(DepartmentTab.class);
		Criteria criteria2 = session.createCriteria(DepartmentTab.class);
		Criterion criterion1 = Restrictions.eq("parentId", deptId);
		criteriadep2.add(criterion1);
		List dept2List = criteriadep2.list();
		for(EhrbiDepartmentTab dept2:dept2List){
		urllist.add("dept1="+deptId+"&"+"dept2="+dept2.getDeptId());
		dept2IdList.add(dept2.getDeptId());
	}
		logger.info(dept2IdList);
		logger.info(urllist);
		for(int i = 0;i dept3List = criteriadep3.list();
			for(EhrbiDepartmentTab dept3:dept3List){
				urllist.add("dept1="+deptId+"&"+"dept2="+dept2IdList.get(i)+"&"+"dept3="+dept3.getDeptId());

			}

		}
		if(session!=null){
			session.close();
		}
	return urllist;
	}

获得下面的组合:

[INFO ]16:11:45,833,main,[Class]DatabaseUtil, [Method]GetUrlList, [dept1=D032, dept1=D032&dept2=D032001, dept1=D032&dept2=D032002, dept1=D032&dept2=D032007, dept1=D032&dept2=D032008, dept1=D032&dept2=D032012, dept1=D032&dept2=D032016, dept1=D032&dept2=D032025, dept1=D032&dept2=D032029, dept1=D032&dept2=D032030, dept1=D032&dept2=D032034, dept1=D032&dept2=D032062, dept1=D032&dept2=D032002&dept3=D032009, dept1=D032&dept2=D032002&dept3=D032010, dept1=D032&dept2=D032002&dept3=D032041, dept1=D032&dept2=D032007&dept3=D032014, dept1=D032&dept2=D032008&dept3=D032042, dept1=D032&dept2=D032008&dept3=D032043, dept1=D032&dept2=D032008&dept3=D032044, dept1=D032&dept2=D032008&dept3=D032045, dept1=D032&dept2=D032008&dept3=D032046, dept1=D032&dept2=D032008&dept3=D032047, dept1=D032&dept2=D032012&dept3=D032066, dept1=D032&dept2=D032025&dept3=D032026, dept1=D032&dept2=D032025&dept3=D032027, dept1=D032&dept2=D032025&dept3=D032028, dept1=D032&dept2=D032029&dept3=D032048, dept1=D032&dept2=D032029&dept3=D032049, dept1=D032&dept2=D032029&dept3=D032050, dept1=D032&dept2=D032029&dept3=D032052, dept1=D032&dept2=D032029&dept3=D032053, dept1=D032&dept2=D032029&dept3=D032060, dept1=D032&dept2=D032029&dept3=D032063, dept1=D032&dept2=D032030&dept3=D032031, dept1=D032&dept2=D032030&dept3=D032032, dept1=D032&dept2=D032030&dept3=D032033, dept1=D032&dept2=D032034&dept3=D032036, dept1=D032&dept2=D032034&dept3=D032037, dept1=D032&dept2=D032034&dept3=D032040, dept1=D032&dept2=D032034&dept3=D032054, dept1=D032&dept2=D032034&dept3=D032055, dept1=D032&dept2=D032034&dept3=D032056, dept1=D032&dept2=D032034&dept3=D032057, dept1=D032&dept2=D032034&dept3=D032058, dept1=D032&dept2=D032034&dept3=D032059, dept1=D032&dept2=D032034&dept3=D032061, dept1=D032&dept2=D032034&dept3=D032064]

通过上面的方法,遍历一级组织后,就可以获取全集的测试数据。

看下面的代码:

	public static ArrayList GetAllList(){
		Session session = HibernateUtil.getSessionFactory().openSession();
		session.beginTransaction();
		Criteria criteriadep1 = session.createCriteria(EhrbiDepartmentTab.class);
		Criteria criteria2 = session.createCriteria(EhrbiDepartmentTab.class);
		Criterion criterion1 = Restrictions.eq("depth", 1);
		criteriadep1.add(criterion1);
		List dept1List = criteriadep1.list();
		for(DepartmentTab dept1:dept1List){
		urllist.add("dept1="+dept1.getDeptId());
		dept1IdList.add(dept1.getDeptId());
		}
		for(int i=0;i<dept1IdList.size();i++){
			GetUrlList((String)dept1IdList.get(i));
		}
		session.close();
		logger.info(urllist);
		return urllist;
	}
看下面的返回结果:
 
PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032001", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032002", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032007", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032008", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032012", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032016", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032025", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032029", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032030", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032034", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032062", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032002&dept3=D032009", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032002&dept3=D032010", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032002&dept3=D032041", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032007&dept3=D032014", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032008&dept3=D032042", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032008&dept3=D032043", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032008&dept3=D032044", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032008&dept3=D032045", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032008&dept3=D032046", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032008&dept3=D032047", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032012&dept3=D032066", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032025&dept3=D032026", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032025&dept3=D032027", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032025&dept3=D032028", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032029&dept3=D032048", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032029&dept3=D032049", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032029&dept3=D032050", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032029&dept3=D032052", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032029&dept3=D032053", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032029&dept3=D032060", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032029&dept3=D032063", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032030&dept3=D032031", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032030&dept3=D032032", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032030&dept3=D032033", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032034&dept3=D032036", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032034&dept3=D032037", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032034&dept3=D032040", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032034&dept3=D032054", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032034&dept3=D032055", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032034&dept3=D032056", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032034&dept3=D032057", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032034&dept3=D032058", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032034&dept3=D032059", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032034&dept3=D032061", 0)PASSED: GetddTest("...By一级、二级、三级部门", "http://....netease.com/common/getdd.do?dept1=D032&dept2=D032034&dept3=D032064", 0)

===============================================    Default test    Tests run: 47, Failures: 0, Skips: 0===============================================
这是一个d1下面的遍历结果,可想而知如果是几十个d1级别的组织需要遍历的数量是非常庞大的,如果通过手工编写测试数据的方式是没法进行全集测试的。
结论
通过使用Hibernate从数据库读取关系表的方法来获取多层组织的测试数据,进行全集测试的方法在一些项目中是可以适用的。
时间: 2024-10-12 23:03:11

基于Hibernate对Http接口进行全集测试实践的相关文章

基于iDRAC开发全新接口,用于获取服务器更详细的信息(适用于dell服务器,其他服务器未测试)

github地址 https://github.com/zhangliu520/pyidrac pyidrac 由于ipmi 获取服务器硬件信息不够全面,于是自己基于iDRAC开发全新接口.idrac服务器详细信息获取获取数据包括(电池,mac地址,内核详情,cpu详情,内存详情,磁盘详情,系统名,操作系统类型等等)其它数据待开发. 使用范围 适用于dell服务器,其他服务器资产信息待测定.我会不断的更新bug. python版本 python2,python3 使用说明 安装 pip inst

SpringMVC学习系列(12) 完结篇 之 基于Hibernate+Spring+Spring MVC+Bootstrap的管理系统实现

到这里已经写到第12篇了,前11篇基本上把Spring MVC主要的内容都讲了,现在就直接上一个项目吧,希望能对有需要的朋友有一些帮助. 一.首先看一下项目结构: InfrastructureProjects:是抽取出的基础项目,主要封装了一些通用的操作. SpringMVC3Demo:就是管理系统所在的项目. WeiXinAPI:是之前做微信管理平台测试时封装一些操作,如果不需要把该项目移除即可. 注:项目的前端UI框架用的是国外的一个基于Bootstrap框架的开发的Demo,如不需要替换为

【转】基于laravel制作APP接口(API)

这篇文章主要介绍了基于laravel制作APP接口(API)的相关资料,需要的朋友可以参考下 前期准备 前言,为什么做以及要做个啥本人姓小名白,不折不扣编程届小白一名,但是自从大一那会儿接触到编程这件奇妙的事情,就完完全全的陷入的程序的世界. 这不,最近又开始折腾APP了,话说现在开发一款APP真是容易,只用JavaScript和一点点HTML+css技术就可以完成.但是做APP的后台就不一样了.开发了APP,想让读点数据进去,那我们就要去开发个后台了. laravel框架,是我最喜欢的PHP框

基于Android设备的 Kali Linux渗透测试教程(内部资料)

试读样章下载地址:http://pan.baidu.com/s/1hqgPu3U 前  言 Kali Linux是业内最知名的安全渗透测试专用操作系统.它的前身就是业界知名的BackTrack操作系统.BackTrack在2013年停止更新,转为Kali Linux.Kali Linux集成了海量渗透测试.攻击等专用工具.通过系统更新,用户可以快速获取最新的各类工具.所以,Kali Linux是渗透测试专业人员的不二选择. 由于渗透目标多样化,使用传统形式的电脑PC或者笔记本并不是很方便.而智能

zynq板卡学习资料:基于zynq XC7Z100 FMC接口通用计算平台367

基于zynq XC7Z100 FMC接口通用计算平台 一.板卡概述 本板卡基于Xilinx公司的FPGA XC7Z100 FFG 9000 芯片, 该平台为设计和验证应用程序提供了一个完整的开发平台.该平台使设计师能够更加简单进行高性能的原型设计,并且通过FMC HPC扩展槽提供可扩展性和满足客户定制需求. 二.基础接口和性能 使用 Zynq-7000 SoC  XC7Z100对嵌入式应用进行快速原型设计以实现优化 支持包含 Dual ARM Cortex-A9 核处理器的嵌入式处理 PS 端3

web接口开发与测试

最近一直在学习和整理web开发与接口测试的相关资料.接口测试本身毫无任何难度,甚至有很多工具和类库来帮助我们进行接口测试.大多测试人员很难深入了解web接口测试的原因是对web开发不太了解,当你越了解开发就会越看得清接口是什么.当然,web开发是比较麻烦,我们很难一下子掌握. 注:不过本文并不是一个零基础的文章,需要你对 Django web开发,requests接口库,unittest单元测试框架,三者有一定的了解. Django快速开发之投票系统 之前分享过一篇Django开发投票系统的例子

asp.net mvc,基于aop实现的接口访问统计、接口缓存等

其实asp.net 上aop现有的框架应该蛮多的,比如静态注入式的PostSharp(新版本好像已经商业化了,旧版本又不支持.net4.0+),或者通过反射的(性能会降低). 本文则是通过mvc其中一种方法拦截器ActionFilter(参考网上已经有很多类似例子). 首先新建一个日志控制类,命名为ApiLogAttribute,继承于ActionFilterAttribute /// <summary> /// 记录访问日志以及站点安全检查 /// </summary> publ

atitit.基于http json api 接口设计 最佳实践 总结o7

atitit.基于http  json  api 接口设计 最佳实践 总结o7 1. 需求:::serverand android 端接口通讯 2 2. 接口开发的要点 2 2.1. 普通參数 meth,param, 2 2.2. 全部的參数定义 2 2.3. key,dynami key)韩式 static key? 2 2.4. 防篡改 sign 2 2.5. Encry加密 3 2.6. zip压缩:: 3 2.7. 首先压缩韩式加密??? 3 3. 选型大全:rim ,ws, http 

飞信免费发送接口API的测试 httpClient

测试飞信免费发送接口API的测试(HTTPClient实现) 使用优点:快捷,方便 使用缺点:用户的各种信息以明文形式在网络中传输不安全. 仅仅用于测试 package cn.com.vnvtrip.fection.sms.utils; import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.util.Propertie