写点什么

云效自建测试自动化最佳实践

作者:阿里云云效
  • 2022 年 4 月 25 日
  • 本文字数:5071 字

    阅读完需:约 17 分钟

云效自建测试自动化最佳实践

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


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


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

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


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


1.测试执行工具,如 robot

2.测试用例,如.robot 文件

3.测试结果和报告,如执行完生成的 log.html 和 report.html

4.测试能力库,用来完成特定的测试,如SeleniumLibrary


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


1.调度和执行平台

2.结果分析与统计报表

3.测试结果通知能力


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



1.测试自动化用例存储在云效代码平台的 Git 仓库中

2.用于执行测试自动化的测试步骤,基于云效的自定义 step 能力创建

3.触发和串联代码、构建和自动化测试的云效流水线

4.通知机制(钉钉消息)

5.针对质量情况的数据报表,可以直接显示在流水线测试结果中,也可以将数据发送给自建的数据报表服务展示


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


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


云效内置了主流开源测试自动化工具的支持(TODO),同时提供 flow cli 工具,帮助企业定制化地实现符合自己要求的测试自动化组件。如何通过 flow cli 实现并发布一个 flow step,请参见参考资料。

这里,仅以 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 框架实现。


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


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


说明 


立即体验:云效流水线Flow


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


3.3 配置执行命令和红线


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


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


4.2 配置测试报告目录(这里是 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_NUMBER
redline Passed:成功:$STEP_ROBOT_PASS:Success Failed:失败:$STEP_ROBOT_FAILED:Error PassRate:成功率:$STEP_ROBOT_PASSRATE:Default
复制代码

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

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


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


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


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


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


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

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


3. 查看结果和统计报表


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


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

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


flowip地址

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


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


1.触发测试执行

2.获取测试结果

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

POST /api/v1/runsrequest:{"ref_name":"feature/limit_1", "trigger_by": "yunxiao","suites": "all"}response:{"code": 0, "run_id":123}
复制代码


GET /api/v1/runs/<run_id>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 的实现步骤大致如下:

import osimport timeimport sysimport requests

def start_test_task(ta_host, suites, trigger_by): resp = requests.post(f'{ta_host}/api/v1/runs', json={'trigger_by': trigger_by, 'suites': suites}) if not resp.ok or resp.json()['code'] != 0: raise RuntimeError(f'create test task error: {resp.content}') return resp.json()['run_id']

def generate_report(ta_host, report_link): if not os.path.exists('report'): os.mkdir('report') with open('index.html', 'w') as fp: 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>''')

def wait_until_task_done(ta_host, run_id): while True: resp = requests.get(f'{ta_host}/api/v1/runs/{run_id}') if not resp.ok: raise RuntimeError(f'task error: {resp.content}') data = resp.json() if data.get('code') != 0: raise RuntimeError(f'task error: {data}') if data['status'] in ('PASS', 'FAILED'): generate_report(ta_host, data['report_link']) return data time.sleep(5)

if __name__ == '__main__': if len(sys.argv) != 4: raise RuntimeError('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_cnt print('%d,%d,%d' % (pass_cnt, total_cnt-pass_cnt, pass_rate))
复制代码

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


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


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



3. 查看测试报告


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



4. 数据统计与报表


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

参考资料


flowstep代码示例:RobotFramework测试step


关于我们


了解更多关于云效 DevOps 的最新动态,可微信搜索关注【云效】公众号;


彩蛋:公众号后台回复【指南】,可获得《阿里巴巴 DevOps 实践指南》&《10 倍研发效能提升案例集》;


看完觉得对您有所帮助别忘记点赞、收藏和关注呦;

发布于: 刚刚阅读数: 6
用户头像

云效,云原生时代一站式BizDevOps平台 2021.11.05 加入

云效,云原生时代一站式BizDevOps平台,支持公共云、专有云和混合云多种部署形态,通过云原生新技术和研发新模式,助力创新创业和数字化转型企业快速实现研发敏捷和组织敏捷,打造“双敏”组织,实现 10 倍效能提升

评论

发布
暂无评论
云效自建测试自动化最佳实践_云计算_阿里云云效_InfoQ写作社区