第10节:测试人员在微服务时代的角色演变

本达人课到目前为止,谈得都是如何实施自动化的测试。但是,无论整个流程多自动化,都需要“人”这个角色来加以设计、开发、管理和维护。这离不开测试人员的全力投入。长期以来,测试人员在开发企业中常常面临着定位不清晰、职业发展路径未明,乃至被管理层认为可有可无的窘境。这一方面,固然与企业对于质量的重视不足有关,需要企业管理层、开发团队负责人员加以改进,另一方面,也的确需要测试人员从自身角度分析原因:怎么样不断提升自己的能力,适应新技术、新架构、新趋势。

在这最后一节课,我想谈谈 QA(质量测试人员)这个角色在微服务架构下的演变方向。

DevOps的出现

早期的软件开发只有软件工程师一人完成,为了提高效率逐渐实行分工模式:开发(Dev)、测试(Test)、运维(Ops)。不同角色担任不同的任务。分工越来越细之后带来了问题也越来越突出,那就是各角色之间的沟通成本越来越高。而全栈工程师、DevOps 和 TestOps 等职位和概念的提出,本质就是把不同的工作集中在一个人身上,或者让一个人涉及到更多方面的工作,从而来降低这种沟通成本。

下面这张图显示的是开发、测试和运维之间的关系。

image

QA 与 Ops 组合而成的 TestOps,对于测试人员来说是最重要的新方向。但是,要了解 TestOps,必须要先了解 DevOps,因为这是目前已经发展较为成熟的、经过实践验证的概念。

在微服务架构之下,主流的工作流程为:开发人员提交代码到代码仓库,微服务所独有的持续集成 CI 和持续交付 CD 工具,会自动拉取代码,调用一个配置中心,再连接对应远程服务器,将代码部署到服务器上,而后启动服务,再通过工具,或者借由开发、测试人员之间的沟通,通知测试人员进行测试。测试通过后,部署到预生产环境/过渡环境和生产环境,如下图所示。

image

上图中,红色框内的工作流就被称之为 DevOps。DevOps 是一个完整的面向 IT 运维的工作流,以 IT 自动化以及持续集成(CI)、持续部署(CD)为基础,来优化程式开发、测试、系统运维等所有环节。

Wikipedia 对 DevOps 的定义是:DevOps 是一种软件工程文化和实践,旨在统一软件开发(Dev)和软件运维(Ops)。DevOps 运动的主要特点是在软件构建的所有步骤中极力提倡自动化和监控,从集成、测试、发布到部署和基础设施管理。DevOps 的目标是缩短开发周期,增加部署频率,更可靠的发布,与业务目标紧密结合。

DevOps 在技术领域的实践

DevOps 的影响包括在企业文化层面和技术层面。这里着重介绍它在技术层面的实践方法:

  • 内建质量体系:通过持续代码评审、静态分析、自动化测试、自动部署验证等手段构成一套有效的质量保障体系。主要实践包括:

    • TDD:测试驱动开发的思想,保证代码质量和不偏离业务需求的技术实现;
    • 结对编程和代码审查,依靠团队的自治性让团队成员互相监督和审查代码质量;
    • 自动化测试,高自动化,且高频率运行的测试,保证测试用例质量的同时保证了交付软件的质量。
  • 持续部署:通过自动化的构建,部署过程快速频繁地将软件交付给用户,提高吞吐量;同时保障过程的安全、平滑、可视化。主要实践包括:

    • 在已经做到持续集成的情况下,引入持续部署,每次提交均会出发构建并执行部署;
    • 蓝绿部署,用于实现零宕机发布新版本;
    • 金丝雀发布,用于使应用发布流程具备快速试错的能力。
  • 持续监控:持续对运行环境在系统,应用层面进行监控,及时发现风险或问题,保障系统运行的稳定性。主要实践包括:

    • 监控预警,在项目开始初期就引入监控,让整个团队实时能够收到关于产品各个维度数据的反馈;
    • 日志聚合,便于错误追踪和展示;
    • 分析,利用搜集到的数据实时分析,利用分析结果指导开发进度。
  • 度量与反馈:通过对用户行为或业务指标的度量或反馈收集,为产品的决策提供依据。主要实践包括:

    • 持续集成反馈,对代码构建质量,代码质量审查的反馈;
    • 测试反馈,对软件质量,功能性的测试,给到业务的反馈;
    • 运营数据反馈,新功能上线后对业务影响的反馈,用于指导业务人员提新的需求。
  • 环境管理:通过对服务器环境的定义,自动化建立和配置、更新等提高基础设施管理的效率,一致性,并更有效利用资源,可伸缩的架构,保证服务的健壮性。主要实践包括:

    • 弹性架构,保证服务的吞吐量和具备灵活变更的能力;
    • 自动化部署脚本,像胶水一样,用于解决一些工程实践不够完善的流程之间的衔接;
    • 基础设施即代码,用代码定义基础设施,便于环境管理,追踪变更,以及保证环境一致性。
  • 松耦合架构:对传统应用架构进行领域组件化,服务化,提升可测试性和可部署性。主要实践包括:

    • 采用弹性基础设施,比如公有云服务或是 PaaS(Platform as a Service)平台;
    • 构建为服务应用;
    • 引入契约测试。

结合上述这些技术实践,一个典型的、基于 DevOps 的持续交付流水线如下图所示:

image

DevOps 使用的主流工具

下面整理了 DevOps 使用的主流工具,其中有些已经在前面的课程中介绍了使用方法。

  • 版本控制和协作开发: GitHub、GitLab、BitBucket、SubVersion、Coding、Gitee;

  • 自动化构建和测试: Apache Ant、Maven、Selenium、UnitTest、JUnit、JMeter、Gradle、PHPUnit;

  • 持续集成和交付: TeamCity、Jenkins、Capistrano、BuildBot、Fabric、Tinderbox、Travis CI、flow.ci Continuum、LuntBuild、CruiseControl、Integrity、Gump、Go;

  • 容器平台: Docker、Rocket、Ubuntu(LXC)、第三方厂商如 AWS/阿里云/Azure 等;

  • 配置管理: Chef、Puppet、CFengine、Bash、Rudder、Powershell、RunDeck、Saltstack、Ansible;

  • 微服务平台: OpenShift、Cloud Foundry、Kubernetes、Mesosphere;

  • 服务开通: Puppet、Docker Swarm、Vagrant、Powershell、OpenStack Heat;

  • 日志管理: Logstash、CollectD、StatsD、ElasticSearch、Logstash;

  • 监控、警告和分析: Nagios、Ganglia、Sensu、zabbix、ICINGA、Graphite、Kibana。

从 DevOps 到 TestOps

在 DevOps 逐渐被广大软件企业、开发团队接受以后,人们发现, DevOps 和测试人员之间的沟通壁垒仍然存在,还需要进一步降低。于是逐步引出了 TestOps 的角色。TestOps 可以定义为“测试运维”,其主要目的是从质量控制的角度,推动整个研发体系与发布体系的融合。可以这样理解:DevOps 是从研发推动配合运维和测试,而 TestOps 是从测试角度推动研发和运维。所以,TestOps 才是真正把测试落地到整个研发体系的关键岗位。

它的具体工作内容包括:

  • 持续集成工具的搭建和维护;
  • 配置中心的代码编写和维护;
  • 服务相关的处理和维护;
  • 测试人员的本职工作,即产品测试。

下图中的红框就是 TestOps 的工作范围,也即是 QA+Ops 的范畴:

image

TestOps 的技能要求

TestOps 人员,必须能够提供测试所需的基础设施和平台,以及执行所有级别的测试,从单元测试一直到最后的端到端测试。这意味着,他们/她们需要具备下列能力:

  • Dev 能力:用于测试工具开发和运维工具开发,而不是业务代码的开发。常用语言包括:Java、Python、PHP、Shell。

  • Ops 能力:用于微服务设施和基础设施的搭建和维护,但是不同于运维人员所做的服务性能和安全性监控。常用工具包括:TeamCity、Jenkins、Docker、Maven、Ansible、Git、Linux。

  • Test 能力:这涵盖了测试人员所需具备的测试能力和对整个测试体系的运用,包括测试用例、测试方法、缺陷生命周期、单元测试、接口测试、契约测试、端到端测试等。

这无疑对测试人员的技术水平提出了更高的要求,但是好处是非常明显的。

对于团队来说,这样可以:

  • 促进合作,降低了交流成本;
  • 更加有效地控制持续交付生命周期;
  • 实现高质量的持续集成。

对于测试人员自己来说,则可以:

  • 掌握运维技能,更加游刃有余地完成测试的配置;
  • 学会如何利用自动化测试来实现持续交付;
  • 主动控制开发生命周期,在整个团队中获得更大的发言权。

由此而见,虽然 DevOps 能推动整个开发、运维团队统一研发流程,帮助团队更敏捷的提交产品,但是无法发现开发过程中测试的缺陷。只有专业的 TestOps,才能站在专业的测试角度推动测试、开发和运维的协调进行。TestOps 和 DevOps 构成了一个完整的持续集成和持续交付体系,从而完善了整个微服务架构下的工程师队伍体系。

image

TestOps 之父、微软测试专家 Seth Eliot 曾经指出:“在 Facebook 和微软 Bing 开发团队中,只有统一的工程团队,而没有单独的测试人员。对于开发人员而言,目标不只是开发代码,还应当完成上述所有的 Testops 任务。”

最后,抛开所有这些术语、概念,我认为,测试人员提升自己的综合能力才是关键:培养自己的编程能力,更早地介入项目测试(单元测试、契约测试),提高自己的(接口/UI)自动化能力,提升测试效率,同时学习运维技术,能够独立部署和维护测试环境。这样,才能提升自己在整个团队中的话语权,既保证了整个开发产品的质量,又为自己的职业生涯拓展了更宽的道路。

我经常发现,很多有着十年甚至更长时间的测试人员、开发人员,他们并不是具备十年的工作经验,而只是把自己第一年的经验重复了十遍!要想摆脱这样的局面,必须不断革新自己的知识体系,拥抱 DevOps、TestOps、微服务这些新的发展趋势,提高自己在职场和行业中的竞争力,居于不败之地。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值