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