自动化测试框架: Delphi中"包"的妙用

<p style="text-indent: 21pt;">自动化测试框架的基础是钩子,也就是常说的HOOK机制。但这在实际的应用过程中可能会遇到一些问题。</p>
<p style="text-indent: 21pt;">一旦要做钩子,那么就必须获取函数地址。由于我原先设计的钩子的目标函数,都是Delphi的内部函数,也就是说,这些函数在编译之后,很难找到。</p>
<p style="text-indent: 21pt;">当然了,也是有几种方式可以找到的:</p>
<ol>
<li>
<div style="text-indent: 21pt;">将代码植入到系统中,编译的时候可以直接找到。</div>
</li>
<li>
<div style="text-indent: 21pt;">编译的时候,带上Map文件,可以通过Map找到函数地址。测试框架以Dll的方式远程注入。</div>
</li>
<li>
<div style="text-indent: 21pt;">Delphi中的包,可以公布这些函数的地址</div>
</li>
</ol>
<p style="text-indent: 21pt;">前两种方式,有一个最大的缺点,在于必须为自动化测试,特别编译一个版本。虽然说可以接受,但显然不是最好的方案。第三种方案虽然好,但是前提是系统必须构建在带包编译的基础上。</p>
<p style="text-indent: 21pt;">幸好,我们目前的测试的系统就具备这样的条件。</p>
<p style="text-indent: 21pt;">那么,对于自动化测试框架来说,只需要随意作为一个Dll,并注入到原系统中就可以了。如果原系统提供了注入的扩展,那是最好。因为这样调试起来很方便。否则就做成远程注入,不过调试的时候只能Attach了,很麻烦。</p>
<p style="text-indent: 21pt;">这个时候,只需要将包含自动化测试框架代码的测试用例代码,对VCL的包,带包编译,就可以做到对包中函数的HOOK了。不过这里面还是有一些细节需要注意的。原先我用的是FastCode的HOOK代码,但是在代表编译的时候就失效了。经过追查,发现代表编译和非带包编译的代码不一样。由于VCL的代码,编译到了包中,那么本Dll在调用包中的方法的时候,加上了跳转指令。简单的就是一个call操作。在包装载的时候,call后的地址会更新。</p>
<p style="text-indent: 21pt;">经过一些探索,发现中国的cnPack(<a href="http://www.cnpack.org/"><font color="#669966">www.cnpack.org</font></a>)中早就针对这个问题有了解决方案。其实方法也很简单,就是判断一下是否存在地址跳转,如果有的话,就取跳转后的地址,否则取当前地址。</p>
<p style="text-indent: 21pt;">完成了钩子后,我们就会发现,在我的测试用例的Dll中,对Bpl中的方法,进行了HOOK。请注意,这里面有一个选择,就是在Dll内部HOOK,还是在Bpl内部HOOK。在Dll内部HOOK,只需要修改跳转地址即可,钩子的方法很简单。在Bpl中HOOK,则需要修改函数代码的前5个字节,这种方法复杂,但是使得入口单一,一处修改,全面有效。</p>
<p style="text-indent: 21pt;">自动化测试框架,就是选用的后者的HOOK方法。这样,我们在Dll中,对Bpl中的方法进行了HOOK,所有带着此包编译的DLL或者EXE,都会受到影响。而这也正是我们想要的。</p>
<p style="text-indent: 21pt;">解决了这个问题后,我们就可以针对已有的系统安装程序进行测试,而不需要修改任何开发代码(包括版本构造过程)。满足这个特性非常好!</p>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值