云效自建测试自动化最佳实际,对于古代软件研发来说,继续、疾速、高质量、低危险地交付需要个性,是业务对研发的次要诉求。而要做到这一点,除了要有良好的架构设计、卓越的工程能力,疾速牢靠的测试反馈也是其十分重要的一环,达到这一点,须要依附测试自动化。
作为面向企业开发者的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到以后企业中。
- 在代码库中增加测试自动化用例
对于针对整个产品或一个子系统的自动化测试,咱们倡议自动化测试用例保留在独自的代码仓库中;而对于针对某个特定利用的自动化测试,咱们倡议其测试用例保留在该利用的代码仓库中,并与开发应用同一个分支(举荐)。
将自动化测试用例与利用代码在同一个代码库中治理,有许多益处:
1.测试用例与代码相互匹配且是最新的,让自动化测试在开发阶段就能够及时染指
2.间接复用开发的分支模式,不必思考自动化用例的版本治理
3.开发和测试基于git代码库严密合作,不便落地ATDD这样的优良实际
4.容易集成到流水线中,当测试代码或者开发代码变更后都能疾速被执行和反馈,减速问题的定位和修复
示例:alpd-bot-ssh的测试自动化用例。
alpd-bot-ssh是一个SSH的服务,提供IP归属地查问和天气查问能力,该测试自动化用例基于RobotFramework框架实现。
- 增加测试自动化节点到流水线
关上继续集成流水线,如果没有,在flow上创立一个。
阐明
立刻体验:云效流水线Flow
3.1 编辑流水线,增加一个空白工作
3.2 增加自定义步骤,“RobotFramework测试”
3.3 配置执行命令和红线
- 上传测试报告到云效,以在云效流水线执行后果中展现
4.1 编辑第三步的测试自动化节点,增加一个步骤
4.2 配置测试报告目录(这里是robot_logs)和测试报告入口文件(这里是report.html)
- 同步测试后果到自建的报表零碎
有些时候,咱们须要对测试后果进行进一步的统计分析,此时,仅靠测试自动化工具提供的报告就无奈满足了。通常,咱们会自建一个报表零碎。那么,云效中执行的测试自动化后果如何上传到咱们自建的报表零碎呢?
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
最初的流水线大抵是上面这个样子:
模式二:测试自动化自建Jenkins
对于曾经自建Jenkins等工具用于测试自动化调度执行,甚至在Jenkins上进行了二次开发和定制的团队,或者对于像ioT开发这样有非凡环境要求的利用,复用现有的工具资源更为经济。为此,云效提供了与客户现有Jenkins服务无缝对接的能力,帮忙企业通过串联起研发测试。
- 确保自建Jenkins可能被云效拜访到
自建Jenkins服务须要反对公网拜访,以便云效可能拜访并触发对应的工作。同样,为了平安思考,倡议仅凋谢必要的接口,并开启IP白名单防护。
- 增加Jenkins工作节点到流水线中
编辑云效流水线,增加一个工作节点,抉择Jenkins工作。
接下来,配置Jenkins地址、认证形式、对应的Job名称,以及触发参数(上游的构建镜像)。
- 查看后果和统计报表
流水线被执行后,后果信息会同步到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 requestsdef 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的测试报告文件。留神:该测试报告只是将申请转发到了自建测试平台的对应页面上。
- 增加测试自动化节点到流水线
在流水线上增加空白工作节点,在其中增加一个步骤,抉择后面咱们自定义的flow step(记得publish到对应的企业中)。在步骤中配置好测试平台地址和测试用例,并设置好红线信息。
- 查看测试报告
在测试节点增加报告上传步骤,测试报告目录填“report”,测试报告入口文件为“index.html”。
- 数据统计与报表
在流水线执行后果中能够看到通过率等summary信息,具体的统计与报表倡议在自建测试自动化平台内实现。
参考资料
•flowstep代码示例:RobotFramework测试step
云效自建测试自动化最佳实际对于古代软件研发来说,继续、疾速、高质量、低危险地交付需要个性,是业务对研发的次要诉求。而要做到这一点,除了要有良好的架构设计、卓越的工程能力,疾速牢靠的测试反馈也是其十分重要的一环,达到这一点,须要依附测试自动化。