Skip to content

第46讲:开源自动化测试框架底层代码改造

本课时我们开始进入开源自动化测试框架底层代码改造的学习。

改造目标

我们先来看下为什么需要改造开源框架呢?目前行业里有非常多的社区在维护和改进开源框架,这些项目可以满足大部分公司的项目需求,但有时公司仍会有一些定制需求是现有开源框架无法覆盖到的,这时我们就需要对开源框架做一些改造,通常情况下改造有三个目标:

  • Bug Fix;
  • 增强功能;
  • 提升性能。

首先是 Bug Fix,当我发现一个 Bug 时,其他公司可能不存在这种情况,而开源项目也没有针对这个问题进行 Fix,这时我们就需要自己来动手解决问题。

然后是增强功能,比如有的功能对我们自己的公司有比较大的促进,而别的公司用不到,这时也就只能我们自己改造了。

最后是性能,比如我们在做自动化的过程中,有很多地方的性能可能提升不上去了,这时也需要我们针对性地对代码进行改造。

改造方法

了解了我们的改造目标,接下来我们看下有几种改造方法。

第一种改造方法我们称之为二次封装,可以利用 Page Object 模式把已有的功能封装成 BDD 风格的框架,或是直接使用类 BDD 框架或数据驱动框架,来完善我们已有的测试体系,这样就可以直接使用更高层更易用的框架完成整体测试用例的维护。

第二种改造方法我们称之为插件改造,有很多框架支持插件,我们可以用插件来增强功能,但像 Requests、Appium 等没有提供想要的插件机制怎么办呢?我们可以采用代码补丁的方式,使用 mock、hook 和其他插件方式来对代码进行修改。

第三个是直接改造,当以上两种方法都没有办法进行改造的时候,你就可以直接 fork 原有的项目对代码进行改造了。

常见的需要改造的开源测试项目基本涵盖了我们日常工作中需要使用的框架。

  • UI自动化:Selenium、Appium,改造目标主要是稳定性提升,性能提升,增加功能。
  • 接口自动化:Requests,已经很好了,通常情况下很少改动底层更多是基于上层进行二次封装,比如 HttpRunner。
  • 性能自动化:Jmeter,增加扩展,使用插件机制,或者直接修改。
  • 代理工具:Mitmproxy、Zap、Burpsuite 等,使用插件机制完成优化。

如果是直接改造我们会遵循三部曲:

  • fork 原有项目,了解原有项目的架构、代码、编译、打包等整个机制。
  • 一旦了解底层机制后,我们会拉出新的分支进行修改,我们会在分支里完成改造和测试;
  • 最后,通过 GitHub、GitLab 平台发起 merge request/pull request,将改造合并到原有开源框架中。

改造案例

我以 Appium 改造为例,比如增加 Xpath 转 UIautomator 定位符功能,以便提升性能,Appium 的 Xpath 通常比普通定位慢 0.5~1 秒,还有时甚至会出现一些 Bug,这时就需要将 Xpath 转 UIautomator 定位符以便提高定位速度,用例中就可以尽情地使用 Xpath,因为它更灵活, 定位更精准,所以有了这个功能后,增强功能的同时也提升了性能。

第二步我们需要根据 Feature 判断需要修改的项目组件,因为 Appium 有很庞大的架构,我们到底要改那个组件呢,这时就需要先了解这个开源项目的架构,从而找到正确的组件。

第三步是创建个人分支或 Feature 分支进行修改,修改完成之后差不多组件就已经修改完成了。

第四步因为你只改造了组件,而 Appium 在打包的过程中依赖于本身的配置,这个时候我们需要重新 Fork Appium,把它的依赖修改为指向自己的组件,这样打包 Appium 时就会应用我们自己修改过的组件。

最后重新打包,就可以使用改造后的 Appium 项目完成自动化测试了。

接下来是 Appium 的组件图, 比如说我要做 Android 的改造,就需要了解 Android 的组件结构,如果还要改造 iOS,也需要了解 iOS 的组件结构,如果想改造通用的功能,横跨两个平台,你可以改造 Selenium 或是 Appium 本身的功能,改造前你需要了解开源组件的定位和修改范围。

一旦定位了组件和修改范围就可以进入UIautomator-2-server 使用对应的 IDE 来完成对应代码的改造。

我们再来看第二个接口测试改造的例子,我们介绍的是 HttpRunner 框架,HttpRunner 是一个优秀的接口测试框架,它融合了行业里多种优秀的开源框架,本身最大特性是支持数据驱动与参数化。

我们看下它的设计理念,首先是基于配置、关注产出比,然后对已有的 Reqquests、Pytest 等框架进行了整合,支持 YAML 和 JSON 执行,支持录制和生成用例等等,整体功能非常强大。

要打造一款功能很强大的框架,他的改造方案是不修改 Reqquests ,在上层采用二次封装模式完成框架封装的。

个人能力提升

既然对开源框架的改造可以给我们的项目带来这么多的好处,那我们个人应该如何提高自己改造代码的能力呢?

  • 深入阅读开源框架的源代码;
  • 使用 IDE 等工具进行代码静态分析与动态分析剖析代码行为;
  • 了解经典设计模式。

当你掌握了代码改造的能力后,接下来需要将这种能力应用到公司的项目中,比如公司需要一些功能更强的框架,然后你就需要针对性的进行改进,找到最小成本去改造框架的方法。