zoukankan      html  css  js  c++  java
  • 云效DevOps实践如何基于云效实现测试自动化集成和分析

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

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

    作为面向企业开发者的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

    云效没有内置开源测试自动化组件,但是基于其提供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.0
    items:
      - 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

    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. 编辑流水线,添加一个空白任务

     

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

     

    3、配置执行命令和红线

     

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

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

     

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

     

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

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

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

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

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

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

    注意:

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

    # ...
    # sh -ex $WORK_SPACE/user_command.sh
    bash -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 server
    python3 /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任务。

     

     

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

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

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

     

    3. 查看测试报告

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

     

    4. 数据统计与报表

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

    总结

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

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

     

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

    原文链接

    本文为阿里云原创内容,未经允许不得转载

  • 相关阅读:
    linux之卸载软件
    linux之挂载硬盘
    windows MySQL 5+ 服务手动安装
    深刻理解Python中的元类(metaclass)
    Python_cmd的各种实现方法及优劣(subprocess.Popen, os.system和commands.getstatusoutput)
    WSGI、flup、fastcgi、web.py的关系
    Windows下python环境变量配置
    External file changes sync may be slow: Project files cannot be watched (are they under network mount?)
    as。 对象和数组
    为什么for不能有序遍历数组的所有元素?(Array的设计原理)
  • 原文地址:https://www.cnblogs.com/yunqishequ/p/14462669.html
Copyright © 2011-2022 走看看