aop在接口测试中的应用

标签: 接口测试 未分类 | 发表时间:2012-02-15 10:47 | 作者:yuanhua
出处:http://qa.taobao.com

最近在接口测试过程中两次应用了aop,第一次解决了更改大量脚本之苦,第二次解决了增加重复代码之痛。下面详细说下场景及使用细节。
一、通过aop转换图片与分类id。
1、背景
多媒体平台上线后,图片空间要将数据迁移到平台统一管理。迁移开发要做两件事,首先是做接口兼容,就是原来调用图片空间的实现,走旧数据库,改成调用媒体平台的实现,走新数据库。接下来是把数据从老库迁移到新库,数据id要根据一定的规则进行转换。对于原先图片空间的接口我们已经做了测试,数据准备是按照原数据表的格式保存到 excel中的。
2、方案
从背景中可以分析得知,此次改动只是接口实现的改动,功能上并没有改变,所以我们只要保证原先的接口用例运行通过即可完成大部分的测试工作。
那如何最大程度上重用原先的用例呢,存在两个问题:
1)、准备数据问题,由于新老库在一段时间内存在增加同步程序,再加上smart的录制数据功能,可以基本解决这个问题。
2)、接口参数的问题,具体来说就是因为有些接口用到比如图片id与分类id,而这些id变了。
解决第二个问题有两种方案:
1)手动将这些id改掉,换成新的,涉及case 200+,改动量较大。
2)aop方法解决。用例脚本不变,写一个拦截类,对于参数id按规则进行转换。
好处:改动集中,量少,效率高。坏处:增加用例脚本复杂度,参数id与数据库不一致,日后维护人需要了解这个原理。
3、实现
我是一个喜欢偷懒的人,喜欢用到研究点技术的东西,加上时间比较紧,我选了用aop方式解决。
第一步:编写拦截类

public class AddSeqAspect {

	public Object doAround(ProceedingJoinPoint jp) throws Throwable {
		String methodName = jp.getSignature().getName();
		Object[] args = jp.getArgs();
		if (methodName.equals("queryXXXMethod")) {

			//通过旧id计算新id
			args[1] = getDirId((Long)args[1],(Long)args[0]);
		}...
		return jp.proceed(args);
	}
}

这里使用 aop around 模式,把原来的参数id拿出来,经过转换后赋给新值,再调用原方法。开始我想用after模式来实现,后来测试后发现参数无法改变。
注意点:要注意处理这个接口被第二次调用时的判断,我是根据转换后id的特征来判断的,如果转换多于一次就会出错了。
第二步:spring aop配置,拦截目标接口,具体配置如下:

<bean id="addSeq" class="xx.xx.test.util.AddSeqAspect" ></bean>
	<aop:config>
        <aop:aspect id="AddSeqAspect" ref="addSeq">
            <!--配置xxx.xxx包下所有类或接口的所有方法-->
            <aop:pointcut id="xxPoint"
                expression="execution(* xxx.xxx.*(..))" />
            <aop:around pointcut-ref="xxPoint" method="doAround"/>
        </aop:aspect>
</aop:config>

注意spring的配置文件要增加一些头信息

<beans
       xmlns:aop="http://www.springframework.org/schema/aop"

http://www.springframework.org/schema/aop

       http://www.springframework.org/schema/aop/spring-aop-2.5.xsd "

二、通过aop清理无用文件
1、背景
我们测试的接口有一个添加图片的,功能就是把图片保存到tfs 上,并将一些信息保存到数据库。我们接口脚本并没有去清理这些无用的文件,导致一段时间后tfs的磁盘满了。
2、方案
有两种方案
1)在每次需要清理的case中增加一行处理,记录返回结果中的tfs地址,然后在@After 方法中,将其删除。这个方案我以前经常使用,清理数据库信息以及缓存等我都是这么干的,但问题我更改30个以上case,体力活,有点烦。
2)通过aop after-returning 模式,通过一个静态变量记录接口返回值中的tfs地址。这个方案比较省事,很适合解决这类问题。
3、实现
第一步:编写拦截类

public class RecordResultAspect {

	public void doAfterReturn(Response<FileDO> result) {
		if(null != result && result.isSuccess()) {
			BaseTestCase.tfsPath = result.getResult().getUrl();
		}
	}
}

第二步:spring配置

<aop:after-returning pointcut-ref="addfilePoint" method="doAfterReturn" returning="result"/>

注:只列出了与上个例子不同的地方。
第三步:解决spring aop无法拦截无默认构造函数类的问题
参见: http://netfork.iteye.com/blog/286215

后记:
1)过程中调试也遇到了不少问题,花了不少时间,但有了成长,感觉还是值得的。
2)人有时懒点,也不是什么坏事情。

相关 [aop 接口 测试] 推荐:

aop在接口测试中的应用

- - Taobao QA Team
最近在接口测试过程中两次应用了aop,第一次解决了更改大量脚本之苦,第二次解决了增加重复代码之痛. 一、通过aop转换图片与分类id. 多媒体平台上线后,图片空间要将数据迁移到平台统一管理. 迁移开发要做两件事,首先是做接口兼容,就是原来调用图片空间的实现,走旧数据库,改成调用媒体平台的实现,走新数据库.

AOP详解

- - CSDN博客推荐文章
AOP(面向方面编程:Aspect Oriented Programing)和IoC一样是Spring容器的内核,声明式事务的功能在此基础上开花结果. 但是AOP和OOP差别较大,要很好地理解这个概念,做到心领神会还是不容易的,不过相信看完帖子,你就不再迷惑了. 编程语言最终极的目标就是能以更自然、更灵活的方式模拟世界,从原始机器语言到过程语言再到面向对象的语言,编程语言一步步地用更自然、更灵活的方式描述软件.

Spring AOP详解

- - Java - 编程语言 - ITeye博客
        最近项目中遇到了以下几点需求,仔细思考之后,觉得采用AOP来解决. 一方面是为了以更加灵活的方式来解决问题,另一方面是借此机会深入学习Spring AOP相关的内容. 例如,以下需求不用AOP肯定也能解决,至于是否牵强附会,仁者见仁智者见智. 1.对部分函数的调用进行日志记录,用于观察特定问题在运行过程中的函数调用情况.

Android异步接口测试

- - 百度质量部 | 软件测试 | 测试技术 | 百度测试
    基于Android的C/S移动应用中访问后端数据的场景是非常多的,异步接口测试主要是在单元测试完成的基础上检查接口级访问是否正确,主要保证对外请求的组装与发送是否符合后端的约定. 现在项目的异步接口访问都遵循一个特定的访问模式:前台的Activity获取到触发事件后将接受到的参数传给一个异步任务,这些任务大都是AsyncTask的实现——即启动一个新的线程访问后台接口数据,完毕后调用回调函数更新UI展示,示意图如下:.

Jmeter 使用实践 - 接口 diff 测试

- - OneAPM 博客
大多数人都使用 Jmeter 做过性能测试,但是在使用的过程中你会发现,它不仅可以做性能测试和功能测试,还能够满足基本的接口测试需求. 相比其他工具,Jmeter 入门门槛较低,安装也比较方便,根据自己的需要可以扩展一些插件,总之一句话: 优点太多了. 那么问题来了,为什么要做接口 diff 测试.

AOP的实现机制

- 风子 - ITeye论坛最新讨论
    附件中有本文的源代码和Pdf版. 本文写的很长的原因,是不希望大家学习AOP时到处找资料,大家有时间可以按照本文动手实践下,相信会有非常大的收获的,有什么问题互相交流,有问必答. AOP就是面向切面编程,我们可以从几个层面来实现AOP. 在编译器修改源代码,在运行期字节码加载前修改字节码或字节码加载后动态创建代理类的字节码,以下是各种实现机制的比较.

Java实现aop案例

- - 行业应用 - ITeye博客
MyPersonService.java代码如下:. MyPersonServiceImpl.java代码如下:. System.out.println("在com.shihuan.jdkaop.service.impl.MyPersonServiceImpl.findPerson()中: " + name);.

Spring AOP监控SQL执行

- - CSDN博客架构设计推荐文章
         对数据库连接池Proxool比较熟悉的读者,都知道Proxool可以记录SQL执行内容和时间等信息日志. 我们可以将该日志记录专门的SQL日志文件,对于查找执行特别耗时的SQL起了不小的作用. 对于一些其他连接池,没有该特性时,本文介绍Spring AOP切面方法来记录SQL日志.

Spring AOP 实现原理与 CGLIB 应用

- - 博客 - 伯乐在线
来源: IBM Developerworks. 简介: AOP(Aspect Orient Programming),也就是面向方面编程,作为面向对象编程的一种补充,专门用于处理系统中分布于各个模块(不同方法)中的交叉关注点的问题,在 Java EE 应用中,常常通过 AOP 来处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等.

Spring AOP 代理机制 JDK&CGLIB

- - 开源软件 - ITeye博客
Spring AOP使用JDK动态代理或者CGLIB来为目标对象创建代理. (建议优先使用JDK的动态代理). 如果被代理的目标对象实现了至少一个接口,则会使用JDK动态代理. 所有该目标类型实现的接口都将被代理. 若该目标对象没有实现任何接口,则创建一个CGLIB代理. 如果你希望强制使用CGLIB代理,(例如:希望代理目标对象的所有方法,而不只是实现自接口的方法) 那也可以.