Choerodon如何运行自动化测试任务

416 阅读7分钟

在上一篇关于自动化测试的文章 解密敏捷自动化测试 中,为大家介绍了敏捷自动化测试,以及Choerodon猪齿鱼自动化测试的落地。在这篇文章中,给大家介绍一下Choerodon自动化测试的技术方案的设计思路以及实现。

为什么自动化测试需新建测试应用

自动化测试的本质是使用一些测试框架开发测试代码,运行测试代码即对已有的业务应用进行相应的测试。对于一个项目来说,测试应用与普通的业务应用应该是同等重要的。

从代码开发上来说,一个自动化测试应用的代码量可能比一般的业务应用要大,多人协作开发也是目前自动化测试的大趋势,所以代码托管可以更好地进行测试代码开发与维护。

之前有用户来咨询,在测试应用与业务应用的对应关系上是如何落地实践的。是否需要每个业务应用都需要对应一个测试应用。猪齿鱼平台本身是基于微服务架构进行开发的,它有很多的后端服务,但这些中有一些的耦合度是比较高的。所以在开发人员的测试实践过程中,并没有针对每个应用一一对应建立测试应用,而是基于大的功能模块进行拆分。比如敏捷管理模块有一个mocha框架的测试应用,测试管理模块也有一个。像这样基于大功能模块的拆分免去了很多feign内部调用重复测试的冗余测试代码,且易于进行测试代码开发的任务分配。

为什么自动化测试应用要执行GitLab CI

在Choerodon的DevOps模块控制下,当一个应用提交代码后触发一次GitLab CI,就会为这个应用生成一个版本号,并打出可以部署运行的镜像、Chart包,对于测试类型的应用也是如此。Choerodon的自动化测试运行也是基于helm进行的部署操作,对应的,也需要对于代码进行构建打包。

并且,测试管理模块对于自动化测试用例的回扫功能是基于测试报告文件以及代码注释进行的(这部分在本文最后章节会进行展开介绍)。对测试代码进行版本控制也就意味着对测试用例进行了版本控制。在一个测试应用可能被定时、反复运行的场景下,如果能保证已有测试用例的时效性并且加以复用就可以最大程度上减少冗余数据的产生。Git的版本控制刚好就可以保证相同版本下的代码一致性。

Choerodon提供的模板有什么特别之处

Choerodon平台现在提供了三个测试应用的模板,分别是 mocha+chai,TestNG+Assured,TestNG+Selenium。

这些测试模板都对于helm chart,Dockerfile,gitlabci等进行了加工,并在其中封装了简单的demo代码,例如登录接口测试的简单实现。通过demo代码可以快速上手进行测试代码的开发。

并且为了方便对“测试数据”,“预期结果”这两个测试步骤的字段进行维护,我们对官方提供的可以在测试报告中加注释的方法进行了封装并进行数据提取,可以满足步骤信息的维护需求。

这其中TestNG+Selenium的模板通过对于官方镜像的修改,支持了在部署过程中独立启动chrome-standalone浏览器核心。猪齿鱼基于官方chrome-standalone镜像的基础上加入了servlet的生命周期管理,可以通过接口调用的形式对浏览器核心的进程进行管理。在TestNG+Selenium的应用部署时,一个pod对象中存在两个containers对象,其中一个是WebDriver浏览器核心,一个是我们的TestNG应用。后者基于pod中的内网进行浏览器核心调用,并在Dockerfile的最后通过curl结束WebDriver的生命周期。这样就省去了Selenium框架对于外部浏览器核心的依赖需求。

如下图所示:

拉取模型 OR 推送模型

在Choerodon如何运行自动化测试这个问题的选型初期,使用推送模式还是拉取模式一直是一个比较纠结的问题。团队研究过GitLab CI、qTest等平台的部署运行方案并进行了参考,而他们的定位、出发点和猪齿鱼平台又不尽相同。

例如在GitLab中他们的方案是单独部署runner,即需要部署一个agent主动进行任务拉取然后调度执行返回结果。而这样的方案无疑会增加部署的成本,就像我们自己搭建一个GitLab一样,搭建好了并没有runner节点可以直接使用,而是需要额外进行runner的搭建与注册到GitLab平台的操作。这样提高搭建成本的操作对于本身搭建要求已经较高的猪齿鱼平台来讲并不是非常友好。

所以猪齿鱼选型的最终结果是使用推送模式进行自动化任务的处理。用户在激活自动化测试运行的时候由测试管理模块后端发送请求至DevOps模块后端,然后通过WebSocket连接agent进行任务调度。并将自动化测试功能集成在现有的集群agent上,可供用户选择运行自动化测试的环境即为环境流水线中注册的环境。从而减少平台的组件数,并且降低搭建的成本。

测试结果是如何进行回扫的

Choerodon测试管理模块对于自动化测试结果的处理是在测试应用的Dockerfile中通过curl访问测试管理模块的接口,将测试报告打包并回传测。在接收到文件后并将其保存加以解析从而导入到测试用例、测试执行中的。

例如TestNG框架,将Suite级别对应成一个用例文件夹,那在一个Suite中的Java类即为一个测试用例,这个类中的方法就是这个用例的测试步骤。并且解析ReporterUtil类中打印在xml报告中的日志对结果、预期字段进行填充,就完成了测试用例的扫回。

在有了测试用例之后就为其新建测试阶段,然后按照测试报告的结果进行测试执行状态的更新。如有报错日志等信息都会维护在对应步骤的注释字段中。

测试结果扫回逻辑如下图:

关于Choerodon猪齿鱼

Choerodon猪齿鱼开源多云技术平台,是基于开源技术Kubernetes,Istio,knative,Gitlab,Spring Cloud来实现本地和云端环境的集成,实现企业多云/混合云应用环境的一致性。平台通过提供精益敏捷、持续交付、容器环境、微服务、DevOps等能力来帮助组织团队来完成软件的生命周期管理,从而更快、更频繁地交付更稳定的软件。

大家也可以通过以下社区途径了解猪齿鱼的最新动态、产品特性,以及参与社区贡献: