• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

自动化测试框架:用AOP为每一个操作写Log

发布: 2009-6-02 09:50 | 作者: 不详 | 来源: 测试时代采编 | 查看: 232次 | 进入软件测试论坛讨论

领测软件测试网

在写这个自动化测试框架的时候,我一直在留意各方面的需求。毕竟,我本人并没有做过真正的自动化测试。管理测试方面的领导,提出一个需求,就是在用例运行失败的时候,应该将过程记录下来,并形成报告,Email给相关人员。

个人认为这个需求是非常合理的。事实上,任何系统,如果没有输出,那么只能停留在程序员手里。有了报表,才叫真正解决了用户的目标需求。

在分析这个需求的过程,我提出了针对每一个操作接口的每一个方法,进行Log。而完成这个工作的第一方法,就想到了AOP,也就是Hook技术的应用。因为Delphi下面并没有对AOP的直接支持,所以考虑这个实现,变成了一个技术研究过程。

从技术上讲,本篇博客只适合了解VCL的Delphi程序员阅读。但其间的思想,相信大家都可以借鉴。下面我的描述过程,是以我的探索过程来进行讲述的。中间会带出相关技术点,供大家参考。

第一、接口的方法,是由类来实现的。框架中,已经对所有支持的类都进行了登记。那么,只需要在这些类型中,找到所有实现的接口的所有方法的地址,那么Hook就变得有可能了。

TObject有一个方法:GetInterfaceTable,可以获取所有接口列表。所有非常容易找到接口对应的VTable。VTable在Delphi中并没有明确的注释,但是可以知道VTable是一个指针列表,每一项都记录着一个方法的“实现地址”。

可惜的是,我发现VTable本身并没有告诉你,这个接口有多少个方法!另外,你也不能得到每一个方法的名称,以及参数等等描述。

第二、于是我考虑到接口的RTTI。接口的RTTI,我以前是没有使用过的。通过VCL的代码研究,发现接口中有一个非常特殊的接口定义:{$M+}IInvokable = interface;{$M-}。这个接口本身并没有添加什么服务,只是使用了编译指令M,来使得接口拥有了RTTI。

实现的时候,可以通过从IInvokable派生,或者直接添加编译指令,从而获得RTTI服务。

下面的问题是,如何使用RTTI?我们知道,Delphi中有一个单元叫TypInfo.pas,后来我发现,其实有另外一个单元叫:IntfInfo.pas。这里面有一个方法GetIntfMetaData可以帮助你获得RTTI。另外,值得一提的是,获取接口类型的PTypeInfo的方法是调用TypeInfo(IMyInterface);

第三、通过MetaData分析,我们可以知道接口的方法个数以及每一个方法的详细定义。那么,现在就是如何Hook了。下面是一个Object的对象实例事例图。

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/

TAG: aop AOP log 框架 自动化 Log

21/212>

关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网