云效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领域。


点击了解更多云效

相关实践学习
2分钟自动化部署人生模拟器
本场景将带你借助云效流水线Flow实现人生模拟器小游戏的自动化部署
SVN版本控制系统
SVN是现在软件开发之中的主流软件版本控制工具,在工作之中利用SVN可以有效的解决多人开发的代码管理问题,本课程将为读者讲解SVN服务器的配置以及基于MyEclipse的SVN客户端插件的配置与使用,并且在讲解之中着重讲解了冲突的产生于解决。
目录
相关文章
|
6天前
|
jenkins Devops Java
DevOps实践:Jenkins在持续集成与持续部署中的价值
【10月更文挑战第27天】在快速发展的软件开发领域,DevOps实践日益重要。Jenkins作为一款流行的开源自动化服务器,在持续集成(CI)和持续部署(CD)中扮演关键角色。本文通过案例分析,探讨Jenkins在Java项目中的应用,展示其自动化构建、测试和部署的能力,提高开发效率和软件质量。
19 1
|
7天前
|
jenkins Devops 测试技术
DevOps实践:Jenkins在持续集成与持续部署中的价值
【10月更文挑战第26天】随着DevOps理念的普及,Jenkins作为一款开源自动化服务器,在持续集成(CI)与持续部署(CD)中发挥重要作用。本文通过某中型互联网企业的实际案例,展示了Jenkins如何通过自动化构建、持续集成和持续部署,显著提升开发效率、代码质量和软件交付速度,帮助企业解决传统手工操作带来的低效和错误问题。
31 4
|
7天前
|
运维 监控 Devops
DevOps文化:持续交付与持续反馈的文化构建与实践
【10月更文挑战第26天】DevOps作为一种将开发与运维紧密结合的文化和实践,通过促进团队协作与自动化流程,实现快速、稳定且高质量的软件交付。本文重点探讨持续交付与持续反馈两大支柱,通过实际案例和示例代码,展示其构建与实践过程。例如,使用Jenkins构建CI/CD流水线,通过Grafana和Prometheus实现实时监控,确保软件质量和快速响应。
18 1
|
2天前
|
运维 Devops jenkins
DevOps实践之持续集成与持续交付
【10月更文挑战第32天】在软件开发的快节奏世界中,DevOps已经成为提升效率和质量的关键策略。通过将开发(Development)和运维(Operations)紧密结合,DevOps促进了更快速的软件发布和更高的可靠性。本文将深入探讨DevOps的核心组成部分——持续集成(CI)和持续交付(CD),并展示如何通过实际代码示例实现它们,以帮助团队构建更加高效和稳定的软件发布流程。
|
6天前
|
运维 Devops jenkins
DevOps文化:持续交付与持续反馈的文化构建与实践
【10月更文挑战第27天】DevOps文化强调开发和运维的紧密合作,以实现快速、高质量的软件交付。核心在于持续交付和持续反馈。本文探讨了如何通过改变组织结构、构建跨功能团队、使用自动化工具(如Jenkins)和积极收集用户反馈,来构建和实践DevOps文化。
17 0
|
11天前
|
运维 安全 Devops
DevOps实践:持续集成与持续部署(CI/CD)的自动化之路
【10月更文挑战第22天】在软件交付的快速迭代中,DevOps文化和实践成为企业加速产品上市、保证质量和提升客户满意度的关键。本文将通过一个实际案例,深入探讨如何利用持续集成(Continuous Integration, CI)和持续部署(Continuous Deployment, CD)实现软件开发流程的高效自动化,包括工具选择、流程设计以及问题解决策略。我们将一起探索代码从编写到部署的全自动化旅程,揭示其对企业运维效率和产品质量所带来的深远影响。
|
4月前
|
监控 druid Java
spring boot 集成配置阿里 Druid监控配置
spring boot 集成配置阿里 Druid监控配置
271 6
|
4月前
|
Java 关系型数据库 MySQL
如何实现Springboot+camunda+mysql的集成
【7月更文挑战第2天】集成Spring Boot、Camunda和MySQL的简要步骤: 1. 初始化Spring Boot项目,添加Camunda和MySQL驱动依赖。 2. 配置`application.properties`,包括数据库URL、用户名和密码。 3. 设置Camunda引擎属性,指定数据源。 4. 引入流程定义文件(如`.bpmn`)。 5. 创建服务处理流程操作,创建控制器接收请求。 6. Camunda自动在数据库创建表结构。 7. 启动应用,测试流程启动,如通过服务和控制器开始流程实例。 示例代码包括服务类启动流程实例及控制器接口。实际集成需按业务需求调整。
339 4
|
4月前
|
消息中间件 Java 测试技术
【RocketMQ系列八】SpringBoot集成RocketMQ-实现普通消息和事务消息
【RocketMQ系列八】SpringBoot集成RocketMQ-实现普通消息和事务消息
303 1
|
5月前
|
消息中间件 Java Kafka
springboot集成kafka
springboot集成kafka
165 2