自动化测试框架的基础是钩子,也就是常说的HOOK机制。但这在实际的应用过程中可能会遇到一些问题。
一旦要做钩子,那么就必须获取函数地址。由于我原先设计的钩子的目标函数,都是Delphi的内部函数,也就是说,这些函数在编译之后,很难找到。
当然了,也是有几种方式可以找到的:
-
将代码植入到系统中,编译的时候可以直接找到。
-
编译的时候,带上Map文件,可以通过Map找到函数地址。测试框架以Dll的方式远程注入。
-
Delphi中的包,可以公布这些函数的地址
前两种方式,有一个最大的缺点,在于必须为自动化测试,特别编译一个版本。虽然说可以接受,但显然不是最好的方案。第三种方案虽然好,但是前提是系统必须构建在带包编译的基础上。
幸好,我们目前的测试的系统就具备这样的条件。
那么,对于自动化测试框架来说,只需要随意作为一个Dll,并注入到原系统中就可以了。如果原系统提供了注入的扩展,那是最好。因为这样调试起来很方便。否则就做成远程注入,不过调试的时候只能Attach了,很麻烦。
这个时候,只需要将包含自动化测试框架代码的测试用例代码,对VCL的包,带包编译,就可以做到对包中函数的HOOK了。不过这里面还是有一些细节需要注意的。原先我用的是FastCode的HOOK代码,但是在代表编译的时候就失效了。经过追查,发现代表编译和非带包编译的代码不一样。由于VCL的代码,编译到了包中,那么本Dll在调用包中的方法的时候,加上了跳转指令。简单的就是一个call操作。在包装载的时候,call后的地址会更新。
经过一些探索,发现中国的cnPack(www.cnpack.org)中早就针对这个问题有了解决方案。其实方法也很简单,就是判断一下是否存在地址跳转,如果有的话,就取跳转后的地址,否则取当前地址。
完成了钩子后,我们就会发现,在我的测试用例的Dll中,对Bpl中的方法,进行了HOOK。请注意,这里面有一个选择,就是在Dll内部HOOK,还是在Bpl内部HOOK。在Dll内部HOOK,只需要修改跳转地址即可,钩子的方法很简单。在Bpl中HOOK,则需要修改函数代码的前5个字节,这种方法复杂,但是使得入口单一,一处修改,全面有效。
自动化测试框架,就是选用的后者的HOOK方法。这样,我们在Dll中,对Bpl中的方法进行了HOOK,所有带着此包编译的DLL或者EXE,都会受到影响。而这也正是我们想要的。
解决了这个问题后,我们就可以针对已有的系统安装程序进行测试,而不需要修改任何开发代码(包括版本构造过程)。满足这个特性非常好!
分享到:
相关推荐
在 Delphi 中,有几个流行的单元测试框架可供选择,如 DUnit、DUnitX 和 TestInsight。这些框架提供了编写、运行和组织测试用例的结构,以及测试结果的可视化反馈。 1. **DUnit**: DUnit 是最早的 Delphi 单元测试...
1. **自动化测试**:DUnit 提供了一套自动化的测试运行机制,能够帮助开发者快速执行和验证代码单元的功能,从而发现并修复潜在问题。 2. **断言库**:框架内包含丰富的断言函数,如AssertTrue、AssertFalse、...
2. 自动化测试工具:文件中提到了TestComplete、Delphi Web和Aqtest等自动化测试工具。这些工具各有特点,可以用于不同类型的软件和环境。例如,TestComplete是一个自动化测试工具,可以用于各种编程语言和框架,如*...
同时,结合版本控制工具和持续集成服务,可以自动化测试过程,确保每次代码更新后,程序的质量都能得到保障。 5. **性能优化**: Delphi的编译器能生成高效的机器码,但良好的编程习惯也能进一步提升性能。了解并...
7. **实际应用**:MQTT客户端在各种IoT场景中有广泛应用,如智能家居、远程监控、工业自动化等领域。开发者可以利用这个Delphi10.3的MQTT客户端作为基础,扩展出更复杂的业务逻辑,满足特定项目的需求。 总结来说,...
5. **单元系统**:Delphi使用单元(Unit)来组织代码,每个单元可以包含类定义、函数、常量和类型声明,有助于代码重用和模块化。 6. **事件驱动编程**:Delphi采用事件驱动模型,控件的事件处理程序允许程序员响应...
6. **组件编程**:Delphi中的组件不仅仅是可视化控件,还可以是任何具有接口的对象。这种组件化思维使得开发者可以构建自定义组件并复用在不同项目中。 7. **内存管理**:理解Delphi的内存管理机制,包括引用计数、...
IBM测试框架主要围绕着自动化测试技术展开,包括自动化测试的基本原理、测试框架的设计、扩展性以及实施过程中的注意事项等几个方面。以下是对这些核心内容的深入解析。 ### 自动化测试的工作原理 自动化测试的...
7. **调试与测试工具**:IDE内置了丰富的调试器,支持多设备远程调试,同时集成单元测试框架,确保代码质量。 8. **数据库支持**:Delphi_XE10提供了对多种数据库的支持,包括InterBase、SQLite、Oracle、MySQL等,...
DUnitX是Delphi开发者社区中的一个强大工具,它是一个高度可扩展的测试框架,用于编写和执行单元测试。这个框架的设计目标是提供一个现代化、高效且与版本控制友好的测试解决方案,帮助开发者确保他们的代码在修改后...
6. **单元测试**:Delphi有内置的测试框架DUnit,书中有指导如何编写和运行单元测试,以确保代码质量。 7. **内存管理**:了解Delphi的内存管理机制,包括自动垃圾回收和手动内存管理,对于编写高性能代码至关重要...
Delphi支持单元测试框架,如DUnit和TestComplete。编写和执行单元测试,可以帮助确保代码质量。 10. **国际化与本地化**: Delphi提供工具支持程序的国际化和本地化,如ResourceString和ResFiles。学习如何处理...
7. **单元测试和自动化**:可能有关于使用DUnit进行单元测试的资料,以及如何实现自动化构建和测试的实践。 8. **高级主题**:如多线程编程、内存管理、性能优化等,这些都是进阶开发者需要掌握的知识。 9. **组件...
8. **单元测试与自动化**:Delphi 2010提供了内置的测试框架,手册会讲解如何编写和执行单元测试,以及如何集成第三方测试工具。 9. **内存管理和性能优化**:探讨内存管理策略,如智能指针和垃圾回收,以及如何...
7. **单元测试与调试**:书中可能包含关于使用Delphi的内置IDE调试器,以及如何利用TestComplete、DUnit等第三方工具进行单元测试的技巧。 8. **多线程编程**:在现代应用程序中,多线程技术常常用于实现并发任务。...
8. **单元测试**: Delphi 6引入了测试驱动开发(TDD)的理念,支持单元测试框架,如TestComplete和DUnit,帮助开发者编写健壮的代码。 9. **代码生成器**: Delphi的代码生成器可以自动生成一些基础代码,如事件处理...
在“Delphi开发的教学课件框架”中,我们探讨的是如何利用Delphi构建教学课件的系统框架,这个框架可以作为教学资源的开发模板,帮助教师和开发者高效地制作具有互动性和丰富多媒体元素的教学软件。 1. **Delphi...
6. **测试框架构建**:为了提高测试效率,我们可以利用Delphi构建自动化测试框架。通过编写测试用例,自动执行LED屏的各项功能测试,如颜色校准、亮度调节、扫描速度测试等。 7. **性能优化**:在大规模LED屏项目中...
8. 自动化和扩展:Delphi支持COM(Component Object Model)和.NET互操作,可以创建COM组件或与.NET组件交互,实现自动化和跨平台功能。此外,通过插件机制,可以扩展IDE的功能。 9. 小程序示例:这些Delphi小程序...