云效DevOps实践-如何基于云效实现测试自动化集成和分析

简介: 对于现代软件研发来说,持续、快速、高质量、低风险地交付需求特性,是业务对研发的主要诉求。而要做到这一点,除了要有良好的架构设计、卓越的工程能力,快速可靠的测试反馈也是其非常重要的一环,达到这一点,需要依靠测试自动化。作为面向企业开发者的DevOps平台,云效提供了丰富的能力,帮助大家在DevOps流程中落地测试自动化实践。

开发者社区720*150.png

对于现代软件研发来说,持续、快速、高质量、低风险地交付需求特性,是业务对研发的主要诉求。而要做到这一点,除了要有良好的架构设计、卓越的工程能力,快速可靠的测试反馈也是其非常重要的一环,达到这一点,需要依靠测试自动化。

作为面向企业开发者的DevOps平台,云效提供了丰富的能力,帮助大家在DevOps流程中落地测试自动化实践。

简单来说,企业自建测试自动化体系,分为三种形式:

形式一:基于开源测试自动化工具

很多企业自建测试自动化,都是从选择一个开源测试自动化工具开始的。一个开源测试自动化工具,往往包含以下几部分(以RobotFramework为例):

  1. 测试执行工具,如robot
  2. 测试用例,如.robot文件
  3. 测试结果和报告,如执行完生成的log.html和report.html
  4. 测试能力库,用来完成特定的测试,如SeleniumLibrary

对于一个测试自动化体系,往往还需要加上:

  1. 调度和执行平台
  2. 结果分析与统计报表
  3. 测试结果通知能力


基于云效,整个的架构是这样的。

image.png

通知系统(发送到钉钉)

一

代码提交

执行用倒

选择用例

获敢用例

部署

构建

生成报告

云效流水线

长E窗食台窗肉

测试环境

  1. 测试自动化用例存储在云效代码平台的git仓库中
  2. 用于执行测试自动化的测试步骤,基于云效的自定义step能力创建
  3. 触发和串联代码、构建和自动化测试的云效流水线
  4. 通知机制(钉钉消息)
  5. 针对质量情况的数据报表,可以直接显示在流水线测试结果中,也可以将数据发送给自建的数据报表服务展示


以RobotFramework框架为例,在云效上接入开源测试自动化工具有以下几步。

1. 选择或编写对应开源测试自动化工具的flow step

云效没有内置开源测试自动化组件,但是基于其提供flow cli工具,企业可以很容易地定制符合自己要求的测试自动化组件。如何通过flow cli实现并发布一个flow step,可以参考云效学院flow cli相关内容。

这里,仅以RobotFramework为例,对其关键部分做一下说明。

首先通过flow step init命令初始化一个flow step组件的项目。

1.1 执行的环境和命令

在step.yaml文件中,image为测试执行的环境镜像,这里是registry.cn-hangzhou.aliyuncs.com/feiyuw/flow-robotframework:1.0,镜像的内容在Dockerfile里面定义。

在items中添加type为shell的输入框,用于设置执行命令,这里默认值为robot -L Trace -d robot_logs .,当前目录“.”即为代码所在目录。

# ...image: registry.cn-hangzhou.aliyuncs.com/feiyuw/flow-robotframework:1.0items:  - label: 执行命令
    name: STEP_COMMAND
    type: shell
    value: |      # NOTE: output directory should be robot_logs      robot -L Trace -d robot_logs .# ...

1.2 红线配置

首先在step.yaml中定义红线配置组件,这些组件会在流水线配置步骤的时候显示给用户。

  items:    - label: 红线信息
      name: CHECK_REDLINES
      type: addable_group
      rules:        - require: false      add_button:        type: icon
        icon: plus
        text: 增加红线
        tip:          icon: question-circle
          description: 红线校验失败步骤标记为失败
      template:        items:          - name: redline
            label: 红线
            position: flat
            type: custom_redline_dropdown
            datamap: '[{"key": "PassRate", "type":"GE"}]'            rules:              -requires: false

另外在step.sh的最后添加红线检查部分,如:

redline Passed:成功:$STEP_ROBOT_PASS:Success Failed:失败:$STEP_ROBOT_FAILED:Error PassRate:成功率:$STEP_ROBOT_PASSRATE:Default

flow step编写及调试完毕后,publish到当前企业中。

2. 在代码库中添加测试自动化用例

对于针对整个产品或一个子系统的自动化测试,我们建议自动化测试用例保存在单独的代码仓库中;而对于针对某个特定应用的自动化测试,我们建议其测试用例保存在该应用的代码仓库中,并与开发使用同一个分支(推荐)。

将自动化测试用例与应用代码在同一个代码库中管理,有许多好处:

  1. 测试用例与代码互相匹配且是最新的,让自动化测试在开发阶段就可以及时介入
  2. 直接复用开发的分支模式,不用考虑自动化用例的版本管理
  3. 开发和测试基于git代码库紧密协作,方便落地ATDD这样的优秀实践
  4. 容易集成到流水线中,当测试代码或者开发代码变更后都能快速被执行和反馈,加速问题的定位和修复

示例:alpd-bot-ssh的测试自动化用例。

alpd-bot-ssh是一个SSH的服务,提供IP归属地查询和天气查询能力,该测试自动化用例基于RobotFramework框架实现。其测试自动化用例保存在代码库的atest目录下,结构如下:

atest
├── __init__.robot
├── ip.robot                             # 用于ip归属地场景的测试集
├── resources                            # 测试公共资源,包括通用变量定义、公共函数等 
│   ├── common_resource.robot
│   └── ssh_lib.py
└── weather.robot                        # 用于天气查询场景的测试集

在代码根目录下,通过 robot -L Trace atest 执行测试。

3. 添加测试自动化节点到流水线

打开持续集成流水线,如果没有,在flow上创建一个。

  1. 编辑流水线,添加一个空白任务

image.png

请输入任务名称

邮

使用代码库中的HelmChart...

EDASECS应用发布

代码扫描

测试

Serverless(SAE)应用发布

Serverless(SAe)应用发布

测试构建

构建

代码

镜像构建

检测Master分支是否更...

合并代码

将代码输入源中指定的代码...

检测Master分支是否超前于...

工具

部署

执行命令

代码

执行命令

自定义镜像执行命令

用于执行命令

使用用户自定义镜像执行命令

执行命令

空模板

空模板

空白任务

用户可以添加...

空白任务

  1. 添加自定义步骤,“RobotFramework测试”

image.png

任务步骤

添加步骤

静态扫描

测试

代码

覆盖率

构建

发布

意这是不可逆操作,任务下所有数据将会删除

下载

上传

自定义步骤

RobotFramework测试

创建教程

  1. 配置执行命令和红线

image.png

编辑血

X

RobotFramework自动化测试

构建集群

云效北京构建集群

任务步骤

添加步骤

RobotFramework测试

步骤名称

RobotFramework测试

执行命令

1#NOTE:outputdirectoryshouerolog

robot-LTrace-drobot-logs

红线信息

大于等...

100

PassRate

添加红线

4. 上传测试报告到云效,以在云效流水线执行结果中展示

  1. 编辑第三步的测试自动化节点,添加一个步骤

image.png

编辑血

任务名称

RobotFramework自动化测试

构建集群

云效北京构建集群

任务步骤

添加步骤

静态扫描

测试

代码

覆盖率

构建

发布

工具

下载

上传

OSs上传

企业步骤

构建物上传(EDAS/SAE使用)

构建物上传

自定义步骤

报告上传

  1. 配置测试报告目录(这里是robot_logs)和测试报告入口文件(这里是report.html)

image.png

RobotFramework测试

报告上传

步骤名称

报告上传

测试报告目录

robot'logs

测试报告入口文件

report.html

5. 同步测试结果到自建的报表系统

有些时候,我们需要对测试结果进行进一步的统计分析,此时,仅靠测试自动化工具提供的报告就无法满足了。通常,我们会自建一个报表系统。那么,云效中执行的测试自动化结果如何上传到我们自建的报表系统呢?

5.1 确保报表系统能够被云效访问到

由于网络问题,云效无法访问我们建在私有网络环境中的报表系统,要求报表系统开放公网访问接口。为了安全,我们建议仅开放必要的接口,同时做好IP白名单防护。

5.2 在flow step中添加上传报告步骤

打开步骤1的flow step,编辑step.sh,添加上传报告步骤。

注意:

该步骤需要放在redline检查之前,同时建议传递的信息包括:测试结果、代码分支、代码版本、提交者、流水线名字等。

# ...# sh -ex $WORK_SPACE/user_command.shbash-c"$STEP_COMMAND"output=`python3 /root/parse_output.py $OUTPUT_XML`STEP_ROBOT_PASS=`echo $output | awk -F, '{print $1}'`STEP_ROBOT_FAILED=`echo $output | awk -F, '{print $2}'`STEP_ROBOT_PASSRATE=`echo $output | awk -F, '{print $3}'`# upload test result to report serverpython3 /root/upload_to_report_server.py $OUTPUT_XML$CI_COMMIT_REF_NAME$CI_COMMIT_SHA$EMPLOYEE_ID$PIPELINE_NAME$BUILD_NUMBERredline Passed:成功:$STEP_ROBOT_PASS:Success Failed:失败:$STEP_ROBOT_FAILED:Error PassRate:成功率:$STEP_ROBOT_PASSRATE:Default

最后的流水线大致是下面这个样子:

image.png

净定桶

有阶队

alpd-oampialpo-bot-nah

部胃

Ge山

Go一元蓝

RoBeTFIeTTEGOT日

形式二:测试自动化自建Jenkins

对于已经自建Jenkins等工具用于测试自动化调度执行,甚至在Jenkins上进行了二次开发和定制的团队,或者对于像ioT开发这样有特殊环境要求的应用,复用现有的工具资源更为经济。为此,云效提供了与客户现有Jenkins服务无缝对接的能力,帮助企业通过串联起研发测试。

1. 确保自建Jenkins能够被云效访问到

自建Jenkins服务需要支持公网访问,以便云效能够访问并触发对应的任务。同样,为了安全考虑,建议仅开放必要的接口,并开启IP白名单防护。

2. 添加Jenkins任务节点到流水线中

编辑云效流水线,添加一个任务节点,选择Jenkins任务。

image.png

选择任务组

企业任务组

请输入任务名称

代码扫描

Go镜像构建

Node.js镜像构...

测试

GO

nade

Go构建后,阿里...

Nodejs构建后,

测试构建

构建

PHP镜像构建

phP

PHP构建后,阿...

镜像构建

工具

工具

部署

替换文件中的...

人工卡点

-

代码

替换文件中的环境...

人工卡点

执行命令

HelmChart上...

Jenkins任务

空模板

HELM

触发Jenkins任务

将代码库中的Hel...

部署

接下来,配置Jenkins地址、认证方式、对应的Job名称,以及触发参数(上游的构建镜像)。

image.png

编辑血

任务名称

自动化测试

构建集群

云效北京构建集群

任务步骤

JenkinsMaster地址

http://jenkins.my.corp:8080

用户名

admin

密码

Job名称

自动化测试

触发参数

上游输出

制品名称.defa...

BUILD

添加参数

3. 查看结果和统计报表

流水线被执行后,结果信息会同步到Jenkins任务组件上,用户可以在云效流水线运行结果上直接跳转到Jenkins Job日志。

对于统计报表,由于这种方式下,云效不会保存执行任务的任何数据,建议在Jenkins任务中完成数据的上传等工作。

形式三:自建测试自动化平台

如果开源测试自动化工具无法满足测试诉求,又有定制化的调度、触发、管控等要求,部分企业会选择自建测试自动化平台。对于这种情况,如何与云效有机整合起来,做到研发一站式呢?

解决的方法和集成开源测试自动化工具类似,所不同的是,我们的自建测试自动化平台需要对云效暴露两个接口:

  1. 触发测试执行
  2. 获取测试结果

这里我们假设自建测试自动化平台的地址为:http://taplatform.my.corp,两个接口为:

  1. POST /api/v1/runs

request:{"ref_name": "feature/limit_1", "trigger_by": "yunxiao", "suites": "all"}

response:{"code": 0, "run_id": 123}

  1. GET /api/v1/runs/

response: {"code": 0, "status": "RUNNING|PASS|...", "report_link": "http://taplatform.my.corp/reports/1234", "summary": {"total": 1000, "pass": 1000, "duration": 1200}, ...}

1. 编写flow step用于触发测试自动化平台和设置红线

实现方式与集成开源测试自动化工具的方法类似,主要是配置好step.yaml和step.sh。

step.yaml中配置自建测试平台的地址,以及测试用例的筛选参数,如:

items:  - label: 测试平台地址
    name: TEST_PLATFORM_HOST
    type: input
    value: http://taplatform.my.corp
  - label: 用例
    name: SUITES
    type: input
    value: all # 用例筛选条件

step.sh中主要完成:

  1. 触发测试平台执行对应测试用例
  2. 等待测试完成
  3. 获取测试结果
  4. 验证红线卡点

如:

# sh -ex $WORK_SPACE/user_command.shoutput=`python3 /root/run_and_wait_until_finish.py $TEST_PLATFORM_HOST$SUITES$EMPLOYEE_ID`STEP_ROBOT_PASS=`echo $output | awk -F, '{print $1}'`STEP_ROBOT_FAILED=`echo $output | awk -F, '{print $2}'`STEP_ROBOT_PASSRATE=`echo $output | awk -F, '{print $3}'`redline Passed:成功:$STEP_ROBOT_PASS:Success Failed:失败:$STEP_ROBOT_FAILED:Error PassRate:成功率:$STEP_ROBOT_PASSRATE:Default

其中run_and_wait_until_finish.py的实现步骤大致如下:

importosimporttimeimportsysimportrequestsdefstart_test_task(ta_host, suites, trigger_by):
resp=requests.post(f'{ta_host}/api/v1/runs', json={'trigger_by': trigger_by, 'suites': suites})
ifnotresp.okorresp.json()['code'] !=0:
raiseRuntimeError(f'create test task error: {resp.content}')
returnresp.json()['run_id']
defgenerate_report(ta_host, report_link):
ifnotos.path.exists('report'):
os.mkdir('report')
withopen('index.html', 'w') asfp:
fp.write(f'''<html><head><title>Test Report</title><meta http-equiv="refresh" content="0;URL={ta_host}/reports/{report_link}" /></head><body><p>forwarding...</p></body></html>''')
defwait_until_task_done(ta_host, run_id):
whileTrue:
resp=requests.get(f'{ta_host}/api/v1/runs/{run_id}')
ifnotresp.ok:
raiseRuntimeError(f'task error: {resp.content}')
data=resp.json()
ifdata.get('code') !=0:
raiseRuntimeError(f'task error: {data}')
ifdata['status'] in ('PASS', 'FAILED'):
generate_report(ta_host, data['report_link'])
returndatatime.sleep(5)
if__name__=='__main__':
iflen(sys.argv) !=4:
raiseRuntimeError('invalid arguments')
ta_host, suites, employee_id=sys.argv[1:]
run_id=start_test_task(ta_host, suites, employee_id)
run_info=wait_until_task_done(ta_host, run_id)
summary=run_info['summary']
pass_cnt=summary['pass']
total_cnt=summary['total']
pass_rate=pass_cnt*100/total_cntprint('%d,%d,%d'% (pass_cnt, total_cnt-pass_cnt, pass_rate))

其中调用了测试平台的两个接口,并且生成了一个index.html的测试报告文件。注意:该测试报告只是将请求转发到了自建测试平台的对应页面上。

2. 添加测试自动化节点到流水线

在流水线上添加空白任务节点,在其中添加一个步骤,选择前面我们自定义的flow step(记得publish到对应的企业中)。在步骤中配置好测试平台地址和测试用例,并设置好红线信息。

image.png

任务名称

自动化测试

构建集群

云效北京构建集群

任务步骤

测试平台地址

http://taplatfomm.my.corp

测试用例

all

红线信息

大于等....

100

PassRate

添加红线

3. 查看测试报告

在测试节点添加报告上传步骤,测试报告目录填“report”,测试报告入口文件为“index.html”。

image.png

报告上传

步骤名称

报告上传

测试报告目录

report

测试报告入口文件

lndex.html

4. 数据统计与报表

在流水线执行结果中可以看到通过率等summary信息,详细的统计与报表建议在自建测试自动化平台内实现。

总结

针对上面提到的三种自建测试自动化的形态,这里给一个简单的小结,帮助大家更好地进行选择。

  1. 当下还没有实践测试自动化且打算开始建设测试自动化能力:建议选择形式一,基于开源测试自动化工具来建设。这样可以把我们的精力集中到具体的测试工作,让测试自动化能够快速落地,同时又能享受到开源社区的大量的技术沉淀,少走弯路。
  2. 已经搭建了jenkins,但是没有进行二次开发,仅用来执行自动化测试:建议选择形式一,基于开源测试自动化工具来建设。这样可以节省维护jenkins的成本,同时测试报告和卡点可以更好地与研发过程整合,避免工具割裂和数据孤岛。
  3. 基于jenkins搭建了CICD流水线,或基于jenkins进行了二次开发和工具整合:建议选择形式二,测试自动化自建jenkins。这样能更快地进行系统整合,同时,也不会影响后续的迁移和改进动作。
  4. 自研测试自动化执行和分析平台:建议选择形式三,自建测试自动化平台。如果不打算推倒重建,我们还是建议采用现有系统与云效整合的方式,避免工具切换对团队的干扰,也可以更好地复用已有资源。


本文作者:云效专家团张裕,阿里云工程实践专家,曾在诺基亚网络负责测试自动化和CICD工具平台开发,做过测试自动化教练,也在初创企业做过开发、运维负责人和测试架构师,推崇持续、快速、高质量的软件交付方式,目前专注于云原生和DevOps领域。


点击了解更多云效

目录
相关文章
|
XML jenkins 机器人
JMeter+Ant+Jenkins实现接口自动化测试持续集成
本文介绍了如何使用Ant生成JMeter接口测试报告,并集成到Jenkins中实现自动化测试。内容涵盖Ant与JMeter环境配置、build.xml文件设置、测试执行及报告生成,同时包括Jenkins插件安装、项目配置和钉钉消息通知的集成,帮助实现持续测试与结果可视化。
1477 0
|
弹性计算 运维 安全
云上DevOps自动化的最佳实践
本文介绍了云上DevOps自动化最佳实践,重点探讨了企业在上云过程中面临的成本管理、运维效率和弹性等问题。通过阿里云的产品和服务,企业可以实现自动化的资源管理、成本优化和高效运维。文章详细阐述了如何利用标签进行成本分析、选择合适的付费类型和实例规格、以及通过弹性伸缩降低成本。此外,还介绍了新功能发布,如统一的实例运维通道界面、AI辅助的运维工具等,帮助企业提升云上业务的管理和运营效率。
|
Java 测试技术 API
自动化测试工具集成及实践
自动化测试用例的覆盖度及关键点最佳实践、自动化测试工具、集成方法、自动化脚本编写等(兼容多语言(Java、Python、Go、C++、C#等)、多框架(Spring、React、Vue等))
948 6
|
存储 人工智能 测试技术
小鱼深度评测 | 通义灵码2.0,不仅可跨语言编码,自动生成单元测试,更炸裂的是集成DeepSeek模型且免费使用,太炸裂了。
小鱼深度评测 | 通义灵码2.0,不仅可跨语言编码,自动生成单元测试,更炸裂的是集成DeepSeek模型且免费使用,太炸裂了。
142362 29
小鱼深度评测 | 通义灵码2.0,不仅可跨语言编码,自动生成单元测试,更炸裂的是集成DeepSeek模型且免费使用,太炸裂了。
|
Web App开发 开发框架 .NET
Playwright 自动化测试系列(6)| 第三阶段:测试框架集成​指南:参数化测试 + 多浏览器并行执行
Pytest 与 Playwright 集成可提升自动化测试效率,支持参数化测试、多浏览器并行执行及统一报告生成。通过数据驱动、Fixture 管理和并行优化,显著增强测试覆盖率与执行速度,适用于复杂 Web 应用测试场景。
|
敏捷开发 运维 数据可视化
DevOps看板工具中的协作功能:如何打破开发、测试与运维之间的沟通壁垒
在DevOps实践中,看板工具通过可视化任务管理和自动化流程,提升开发与运维团队的协作效率。它支持敏捷开发、持续交付,助力团队高效应对需求变化,实现跨职能协作与流程优化。
|
人工智能 Java 测试技术
SpringBoot 测试实践:单元测试与集成测试
在 Spring Boot 测试中,@MockBean 用于创建完全模拟的 Bean,替代真实对象行为;而 @SpyBean 则用于部分模拟,保留未指定方法的真实实现。两者结合 Mockito 可灵活控制依赖行为,提升测试覆盖率。合理使用 @ContextConfiguration 和避免滥用 @SpringBootTest 可优化测试上下文加载速度,提高测试效率。
697 5
|
测试技术 API C++
Playwright 自动化测试系列(7)| 第三阶段:测试框架集成​​Page Object 模式
本课程详解Playwright测试框架中的Page Object模式,通过电商登录-下单实战演示PO架构设计与高级技巧,结合Pytest实现多用户测试。重点解析PO模式提升代码复用性、降低维护成本的核心价值,并提供常见问题解决方案,助力构建高可维护性的自动化测试体系。
|
人工智能 IDE 测试技术
用户说 | 通义灵码2.0,跨语言编码+自动生成单元测试+集成DeepSeek模型且免费使用
通义灵码, 作为国内首个 AI 程序员,从最开始的内测到公测,再到通义灵码正式发布第一时间使用,再到后来使用企业定制版的通义灵码,再再再到现在通义灵码2.0,我可以说“用着”通义灵码成长的为数不多的程序员之一了吧。咱闲言少叙,直奔主题!今天,我会聊一聊通义灵码的新功能和通义灵码2.0与1.0的体验感。
|
机器学习/深度学习 人工智能 jenkins
探索软件测试中的自动化与持续集成
【10月更文挑战第21天】 在软件开发的生命周期中,软件测试扮演着至关重要的角色。随着技术的进步和开发模式的转变,自动化测试和持续集成已经成为提高软件质量和效率的关键手段。本文将深入探讨自动化测试和持续集成的概念、实施策略以及它们如何相互配合以优化软件开发流程。我们将通过分析实际案例,展示这些技术如何在实际项目中发挥作用,以及面临的挑战和解决方案。此外,文章还将讨论未来趋势,包括人工智能在测试领域的应用前景。
469 17