1.3 测试工程师的核心竞争力
通过测试行业现状分析可以知道,企业招人与测试求职者供求难以匹配,而造成不匹配的原因归根到底还是能力要求不匹配。那么,测试人员的核心技能或者说测试人员的核心竞争力到底有哪些?
测试人员应该思考这个问题,企业用人单位也应该思考需要什么样的测试人员。企业在招聘时,要求应聘者会使用各种框架、各种编程语言、各种工具。那在学会了测试技术、测试工具的使用之后,我们最后的核心竞争力到底聚焦在哪些方面呢?
在早期的软件行业中,存在一个普遍的现象,有些大学的本科生或者研究生去面试的时候会发现,面试的结果是他们的代码能力可能不太好,在这种情况下公司会问他们愿不愿意去做测试。但随着时代的变革,现在的软件测试工程师的知识面,以及需要掌握的内容已经远远超过了之前,甚至可以说测试工程师的知识面是远远超过开发工程师的,比如在一些技术的层面上,以及对产品的理解上。
在这种情况下,再提一个优秀的软件测试工程师的核心价值,我们可以很自信地说,测试工程师是不可替代的,并且属于一个专业细分的领域。前些年,我们谈到测试,就是软件测试,没有细分市场,但现在谈测试,领域就太多了,除了传统意义上的基于业务领域的测试,还有最近几年比较热门的测试开发。
关于测试工程师的核心竞争力是什么,行业领军代表人物茹炳晟曾在极客时间平台的《软件测试52讲》专栏中有过详细的分享,他在专栏中将测试工程师按测试开发工程师、业务的功能测试工程师及性能测试工程师三种细分类别来阐述各自的核心关键能力。
这里从整体出发,不细分测试岗位或领域,分享一下成为一名优秀的测试工程师应该具备的核心竞争力有哪些。
一名优秀的测试工程师具备的核心关键能力总的来讲概括为:三项基本功+七大关键能力。
其中三项基本功用一句话概括是:优秀的测试人员需要具备提前发现研发过程中其他人员所无法或很难发现的问题且能准确识别出研发质量盲点的能力。
三项基本功分别如下。
1.提前预判
因为在研发过程中问题发现得越早,解决的成本就越低。如果在需求还未开发实现的时候就能提前发现需求的漏洞,那么显然这种发现的价值是最高的。
2.别人无法或很难发现
所有人都能发现的问题,你发现了,那只能证明你是可以被替代的。别人发现不了,而你可以发现,那么你就形成了无法被替代的优势。
3.识别盲点
测试人员在整个研发质量活动中,价值的最大化不在于用例的执行,而是能识别出系统或产品的质量盲点,让合适的人去进行合适的测试活动。比如告诉开发人员在做单元测试的时候要注意哪些点,让测试开发人员在做接口级的自动化测试的时候要注意哪些异常的接口行为等。
七大关键能力分别如下。
1.项目实战经验
为什么把项目实战经验放在首位,因为任何公司都希望招进来的人是可以直接为公司产生价值的,而对于求职者来讲,为新公司产生价值的多少,在很大程度上取决于过往的项目工作经验积累。能够讲清楚一件特别拿得出手的工作或者一个能证明你能力的案例是面试的时候最有用的投名状,特别是比较复杂系统的测试实战经验。但是,如果你只是接触了一个简单的模块,甚至只是测试一个稳定模块的维护性开发,而不是通盘理解,就不能说测试过复杂系统。有从头到尾接触一个完整项目的经历很宝贵,所以当你遇到或者正在经历时,请珍惜并要懂得学会积累能复用的经验。
2.扎实的测试基础与多维度测试思维
首先,扎实的测试基础是优秀测试工程师的基本功,要能理解产品流程相关的东西,如需求分析、测试计划、缺陷跟踪等。其次,要有扎实的用例设计能力,能灵活运用“等价类划分”“边界值分析法”“流程分析法”等常见用例设计方法。另外,要具备很强的测试执行能力,移动端、Web端、服务端的测试执行各有特点。测试本身是一个实践性很强的工作,扎实的基本功是不可或缺的。
除了要具备扎实的测试基础,还需要具备多维度测试思维。做好产品质量保障,需要从需求、用户、研发等多方角度考虑,要想为产品贡献最大力量,就不能只专注于做好测试保证质量这一方面,而应该从多个角度全面思考。
1)培养用户思维
在工作中,一部分测试同行特别是初入行者在对待需求时都过于被动,不太会把产品各个模块的业务串联起来,最后成了因为需求来了所以做需求、纯粹看着需求文档就开始做测试用例,并没有想着先把需求理顺了、想明白了再开始着手。其实这个阶段也是非常重要的需求分析及功能点拆解阶段,虽然这主要是产品经理的工作,但是他们也并非圣贤,对产品设计的细节考虑可能并不周全,甚至有时会出现较大的需求漏洞,产生较严重的影响。测试人员也应该具备该项能力,即使不能站在公司战略层面考虑该需求能给业务带来哪些促进,至少要站在用户的角度考虑该需求能给用户带来什么价值,能满足用户哪方面的需要,同时要能及时发现用户操作过程中的体验问题。
2)提高架构思维
要想设计一份有效的测试用例,就必须要对软件开发设计思路有深入的了解,我们也经常遇到类似的事情,业务需求未做任何改变,而架构做了优化,这时单纯地拿着一份根据业务整理出的用例是无法准确而有效地测试的。架构的调整包括底层数据结构的调整(如分库分表)、服务化(SOA)、日志的收集处理及容灾处理等。另外,为了能有助于测试的开展,我们同样需要了解开发技术,毕竟在测试环境的搭建、维护及测试过程中,各种场景的模拟,特别是异常情况及自动化测试,如果不借助于开发技术,自动化工作是很难开展的。比如被测系统依赖其他系统发的一条MQ消息而做相应的处理,那么在自动化测试代码中为了验证该逻辑,就需要Mock这条消息并且将其发送到某个管道中,让被测应用接收并处理它,如果连MQ是什么都不知道,也不知道如何在代码中发送消息,那么这个部分的自动化测试就没法开展下去了。
3)丰富测试思维
逆向思维
测试工程师在工作中需要具备逆向思维,比如我们需要对接口做测试,通过输入验证输出,如果我们使用各种输入都无法得到接口设计中的某一种输出,就需要从输出来逆向推导输入。再比如验证一些异常情况,接口需要返回一些Error Code,使用正常手段是肯定得不到的,为了出现该Error Code就需要借助环境及工具来模拟。另外,我们在分析很多问题时,也离不开逆向思维。
组合思维
测试工程师在工作中需要善用组合思维,比如软件在多用户、多进程、多次执行等情况下,都可能出现意想不到的缺陷,甚至对于复杂的业务场景,在对同一份数据进行操作时,不同子业务并行执行的情况下,都有可能造成数据上的错误,特别是对于与核心数据有关的业务,是否添加行级锁。不同业务不同的操作顺序和组合方式,以及不同的维度等都有可能出现Bug。
全局思维
凡是涉及跨团队开展的工作,就需要更多的沟通协调,以避免出现对业务理解不正确、接口定义有误等问题。要把握整个项目的多个方面、多个团队的任务及分工、整体的数据流及业务流,从全局思考业务需求,更多地关注上下游相关联的系统或接口等。具有全局思维的人才能在大型项目中游刃有余。
两极思维
学会适当地站在事情的两个极端来考虑,比如数据上的无穷大与无穷小,在数据存储上,数据库层面字段设置为int与bigint所支持的数量级是不一样的,基于业务数据,如果存在超过int的长度的数据,那么在存储上及代码中,都需要做相应支持,否则就只能显示到该类型的最大值。而且在业务层面也经常有两个极端的情况,比如商家入驻开店,很多时候都只是考虑开店该怎么做,却忽略关店的情况。在边界值用例设计方法中也用到了两极思维模式。
简单思维
简单思维表现在很多方面,比如,引起非常严重的Bug的原因可能只是犯了一个很简单的错误。在处理测试环境时经常出现无法正常访问的问题,也许可能只是因为磁盘空间满了或者一个简单的配置不正确。在日常工作中这样的例子非常多,我们也要善于一层一层剥开问题的现象,找到其本质,就好比剥洋葱一样,不要一开始就把问题想得过于复杂,其实事情往往并没有那么复杂。
比较思维
比较思维其实贯穿在整个测试生涯中,测试本来也就是一种验证,将实际结果跟预期结果进行对比。而且我们在平时工作中排查问题时,也有非常多的内容需要对比,比如配置文件的差异、环境的差异引起的不正常结果。此外,我们也通过SVN中代码Diff的差异来明确改动的范围、制定回归策略。在做一些前后两个版本数据差异分析时,都可以使用Diff的思想来开展,可以大大提高效率。
3.在一个领域有深耕知识
人不可能什么都懂,但工作几年之后,在工作的领域中一定要有积累才行。
例如,你测试一个电商系统的交易模块三年了,你一定要熟练地讲出商品列表、购物车、下单、退单、废单、支付、发货、库存、退款、优惠使用等一系列业务流程,以及电商系统交易模块可能出现的坑(各类问题产生的资损、各类问题产生的服务不可用),不然根本无法体现你的经验沉淀和深入思考;你要能够画出系统的交互图,熟悉最核心的接口和最核心的参数,能够读懂开发的代码,熟练使用监控工具诊断定位线上问题。
当你做了四五年移动端测试后,在Android和iOS平台上都要具备一定的开发能力,能读懂开发人员的业务代码是最基础的,能够代替开发人员实现部分业务功能,完成部分组件开发是一个非常好的自检点。能够对移动端自动化工具、监控工具、内存泄漏检测、卡顿检测、耗电量、弱网、流量、埋点、灰度、版本控制、兼容性、用户体验、安全等的质量保障方案有通盘处理能力。
4.善用技术来保障质量的能力
很多业务测试工程师认为,利用技术来保障质量,岂不是要具备开发能力了?而掌握开发技术不是那些测试开发工程师或者开发工程师才需要的吗?如果你持有这种观点,我劝你从这一刻起,消除这个观点,为什么?因为在这个时代,一个工程师,一个软件方面的工程师,一个工程技术人员,如果没有掌握开发技术,没有编码的技能,是不能被称为一个优秀的工程师的。
利用技术保障质量的能力中最常见的是自动化测试能力,自动化测试工具是提高测试效率的利器,将一些重复性的工作进行自动化处理,能够避免被繁杂的手工测试所拖累,从而专注于更有价值的测试工作。做好自动化测试,不仅仅要会使用工具、框架,更要对被测物特性、软件生命周期有很深的理解,并且要有很强的开发知识才行。在实际中,很多人误认为用技术来保障质量,就一定要开发出高大上的自动化框架、测试平台之类的,其实研发过程中可改进的效率点无处不在,如测试环境、CI、数据构造、测试用例生成、数据比对等都是可以提升的效率点,经过适合的方法改进后都能有不错的提效产出。
5.学会使用综合手段来保障软件质量提升效能的能力
什么叫综合手段?比如,使用多种手段把崩溃率降低到千分之一以下,对于一个小团队来说,这是很不容易实现的。要做到这点,你需要了解如何收集崩溃率,如何使用一系列工具来定位核心问题,如何推动开发改动,并且要学会预防崩溃。通过一系列的手段来推进,如静态代码扫描工具引入、阻止乱用不成熟的第三方插件、代码Review防止常见空指针引发的崩溃,以及推动开发养成良好的Log习惯,推动移动端防御性编程开发习惯,推动后端开发按照规范设计接口,帮助开发引入内存泄漏和卡顿分析工具、趋势报表、异常告警、各种灰度方式设置、线上监控等。可以发现一个数据的改进,背后需要有大量的质量相关工作。
这里提到的综合手段有别于专项测试能力,专项测试强调的是某一细分领域特长,凸显的是具体点的分析和定位问题的能力。而学会使用综合手段来提升质量更强调站在全局的角度,是以产品业务指标为导向的,综合各方面多因素共同提升。
6.持续学习能力和复杂问题解决能力
做一个不被时代淘汰的优秀工程师,就需要学会与时俱进,时刻保持学习的状态。而学习的最佳方法是带着具体工作中的问题来持续学习。例如你近期的工作是帮助团队提升后台服务稳定性,你看到了Netflix内部使用一个叫作Chaos Monkey的开源项目来随机对生产服务期进行攻击,逼迫工程师提高稳定性,所以你也实现了类似(更温和)的内部机制,推动团队稳定性的提高。
你怎么会知道这个叫作Chaos Monkey的东西呢?因为你会习惯性地浏览一线厂商的技术博客,参与行业大会,关注各类新技术。
7.个人综合特质
在测试工作中越高阶的职位需要解决的问题越综合,需要打交道的人种类越多。除了要有较强的实战技能,对个人的综合能力要求也非常高,比如需要有很好的项目管理能力、软件架构能力、对产品的敏锐度、积极良好的沟通能力、团队合作能力、目标管理能力、快速学习能力、风险把控能力、质量管理能力,以及具备“成本、效率、质量”的综合能力等。