前言
今年是我开始工作,也是进入测试行业的第十五个年头了。突然冒出个年头,有些想法想写下来。
故事的开始
2008 年,广州。
大约 3、4 月份开始和舍友们一起去参加各种招聘会。虽然读的是所谓集应用数学和计算机技术与一体的信息与计算科学专业,考试成绩在班里面也还可以,但半读半混日子的心态下面(高考发挥和志愿填写失误,当时的学校其实并非自己的意愿,所以一直带着点自暴自弃的心态),真正的计算机课程其实没有太多的积累,实习也是跟着学院安排去一家工厂参观一下,实际的计算机积累基本上是零。加上当年年初开始的金融危机,就业形势越发不理想,导致到了毕业离校的日子也还没找到工作。
不停在当时的各个招聘网站上无差别的海投,也偶尔参与了一些面试,但是都没有下文。直到 10 月份,收到某家公司通知我去面试一个助理测试工程师的职位。虽然当时对测试一无所知,但好在一方面当时的英文笔试题(公司做的是海外的业务,需要用英文进行书面沟通;大四刚考过了六级,加上当时考研也对英文有持续复习,所以这部份笔试做得还不错)、逻辑测试题(四年的数学课程起到了作用)都做得不错,面试时虽然对测试一无所知,但好在面试官看我逻辑思维各方面表达都还可以,所以给我发了 offer。
于是我误打误撞地,在2008年10月29日这一天,开始了自己的测试工作生涯。
从零到一
第一家公司当时的主要业务是一个面向北美学生贷款业务的系统,之前的几年一直在非常好的盈利中;结果正好碰上当时美国的次贷危机,整个产品在正面打击之下完全地垮了。于是在我入职的一年之内,整个测试组的人数从 10 几个骤降到了 2 个,只剩下我和另一位天天说懒得换工作的前辈。也是这样一个契机,我突然从一个新人,要去陆续承担不同的业务模块。
公司一直在持续对一个产品进行迭代开发,并且针对不同的客户有对应的定制化需求和部署维护工作。也由于这个契机,可以让我在第一份工作里面,就有机会对这个产品的整体功能和每个模块的生命周期有了全面了解的机会,以至于直到今天,我还能清晰记得这个产品的主要功能和业务流程。
这一阶段的收获和体验:
- 培养了我对每一个新功能、新模块都从整个产品的角度去了解和思考。此后的每一个项目,无论是长期还是短期的项目,我都能在很短时间里面去了解整个项目的需求背景,从而进行快速地测试分析。
- 由于人员的流失,让我有机会很快地参与到主要的项目中,独立承担项目的测试,从而了解和掌握整体的测试流程;之后团队重新扩张的时候,我也有机会可以给新同事去介绍和讲解业务,并且对他们的工作进行分工和管理,积累了一些初始的管理经验。
- 团队在人员骤降的情况下,停止了数量庞大的基于 qtp 的自动化测试用例维护;但是在一年多以后,新的主管重启了自动化测试的工程,我也参与了全新的基于 c# 的 code UI test 框架的自动化测试框架建设,第一次体验了自动化测试的魅力。
第一次失败的跳槽经历
在团队中度过三年之后,在外面薪资的吸引之下,2012 年初的我鼓起勇气跳出舒适圈,尝试跳槽。当时对自己的职业生涯并没有考虑得太仔细,所以单纯由于薪资的吸引,跳槽到了广州某外包公司,并在一周培训之后被外派到某商业银行做中间业务平台的测试。
虽然薪资上比上一家公司高了不少,但这份为期一年的工作给我留下的更多是苦闷和难受的回忆:当时团队环境下外包人员的低人一等;工作场地管理严苛(迟到一次就要被抓去通报批评;到了下班时间也不能按时走,没事做也要扮忙到七点);整体工作流程推动困难(每次有环境部署的需求,都要打电话求环境组的同事);单纯的点点点工作,没有任何测试技术使用和提升的机会。
于是在一年后,再次选择了跳槽。
松哥的知遇之恩
2013 年夏天,投递简历之后到另一家公司进行面试,遇到了测试部经理松哥。一次非常愉快的面试经历,整个过程基本上是与和蔼可亲的松哥在轻松地聊天,聊自己的前两份工作经历,聊自己对测试的理解和感想。然后在一个月后顺利入职。
入职的第一天就被松哥安排到了一个公司内部的项目中,带着两个比我入职早,但是刚工作不久的同事开始做这个项目的测试。也许是前一份工作的苦闷,让我在新公司的工作中重新焕发了热情。
公司的业务,除了主要的项目外包业务(基于开源技术的航空管理系统的研发和实施)外,也在多方面发展大大小小不同的外包项目。在这三年里,让我有了新的积累:
- 前前后后参与了不下 10 个大大小小的项目测试,有面对航空公司的大型传统业务系统和内部服务系统(也就是需要适配各种 IE 浏览器的系统 ),也有当时新兴的互联网 app 项目和 H5 项目;有试过连续几个晚上去甲方的机房里面去参加部署,也试过和团队的开发小伙伴们通宵完成一个发版,回家刚睡着,就被刚上班的甲方经理电话追杀的经历;曾经忍不住和某些趾高气扬甲方人员当场吵起来,听过某些甲方人员当面说:这个问题不解决就投诉你,也试过单枪匹马跑去某个甲方公司收集需求,临走还被甲方经理硬塞了个红包表示感谢。各种不同的体验,也学习到了很多和不同角色、人员的相处之道。
- 在松哥的组织之下,我也在部门同事的分享中接触到了各种不同的技术,如开源的自动化工具,性能测试工具 jmeter 和 soupui,和一些安全测试工具,等等。也由于不同的项目需求,自己也开始尝试寻求不同的工具来帮助解决项目的测试问题,比如用 soupui 做性能测试,用 python+selenium 做 ui 自动化等等。这也给我之前的工作带来了更多的引导和自信。
新的挑战
2015 年的 8 月,我接受一位旧同事的邀请,加入了广州一家游戏公司,参与到了该公司的国际平台部,担任测试主管的职位。这是一个新组建的团队,之前一直没有专门的测试人员;我虽然名义上是测试主管,但除了中间一年是带了两位刚工作的小伙伴之外,其他时间都是一个人在面对着整个平台从后端到前端,从 Android、iOS sdk,到 H5 小游戏平台,从后端微服务,到大数据数据处理分析平台的所有测试。相比于的经历,接近四年的时间里我收获了更多:
- 从无到有建立起我们的测试流程和规范,包括开发的代码分支管理,需求生命周期管理,版本测试发布流程等等。我自己也从最开始的迷茫慢慢变得清晰,自己对质量管理流程的理解也上升到了新的一个层次。
- 从无到有建立起我们的自动化测试体系。包括:
2.1 基于 python+selenium 的 web 管理后台和 h5 小游戏平台的自动化测试框架,将大部分的回归测试工作从手工通过自动化覆盖。
2.2 基于 python+appium(后面替换成 @codeskyblue 大佬分享的 U2 框架)搭建起针对 Android sdk 的回归测试。这部份用例数量不多,也没有覆盖 iOS 部份,但对我来说说一个新的尝试,特别是基于 U2 和 atx server 实现了内部简易版的远程测试机管理平台,极大地提升了我的 python 代码水平。
2.3 基于 python+unittest 的接口自动化测试框架,实现了进一步的分层测试。也是对我个人而言是第一次的接口测试体验。
2.4 使用 python 编写的造数脚本,提升了后台大数据分析工具的测试效率。
2.5 基于 flask 搭建了一个简易版的内部测试平台。
2.6 尝试引入 docker 对上述平台和工具进行管理和部署。
2.7 由于一直对整体的业务结构都非常熟悉,所以在产品的整个开发流程中都可以全程参与,也提出了很多自己对数据结构的设计和提议,也很高兴最后得到了采纳。另一方面在自己开发测试平台和测试框架的过程中,也帮助自己提升了对整体框架设计的理解。
在这个过程中,一方面得益于部门前后几位主管的引导、鼓励和支持,另一方面也是这个阶段我第一次接触到了 testerhome 社区,帮助我解决了上面工具开发中遇到的大部分问题;这一阶段我也可以更频繁地参与到社区中,将自己每个时期的收获和产出 (2016-2019 年之间) 都在社区进行记录和交流,拓宽了我的眼界。
新的挑战:外企
外企工作初体验
虽然在国际平台部的四年时间里面自己学到了很多东西,也很有成就感,但另一方面也越发感觉到了发展的天花板:产品的推广不成功,团队的发展受到限制;团队无法给公司带来真正的收益,薪资提升有限;自己也感受到渐渐失去了提升的动力。于是在 2019 年初,下定决心要寻求新的机会。
或许是当时的我马上就要到 35 岁这个年龄的界限,虽然我这次开放的简历上面给自己增加了上面提到的这些自认为非常好的加分项,但是很尴尬地,却是受到的面试邀约反而比不上以前。反而是每个邀请,都是某外企的自动化测试职位的猎头推荐。由于对自己的英文口语不自信,一开始并没有接受推荐;但过了一段时间的观望和考虑之后,还是选择先尝试。于是在某个猎头的推荐和安排之下,参加了面试。
由于自己平时都喜欢看一下美剧和英文脱口秀节目,还把自己非常喜欢的一部美剧《老爸老妈浪漫史》的音频放到手机上来回听,所以英文听力部分还是有一些底子。于是在当天的面试里面,我一边在会议室的白板上把我过去三年多做的产品架构和测试工具画出来,一边用蹩脚的英文做介绍和问题解答,所以一个多小时的全英文面试居然也被我扛过来了(也幸好上线下面对面面试,让我有机会画架构图,否则换到现在的线上面试估计就挂了)。就这样面试通过,再完成薪资沟通和背调后,开始了我的外业工作体验。
入职后很快和主管(也就是面试官)建立起来比较好的合作关系。当时整个测试组基本上是重新搭建的,并且要推翻原有的 java+cucumber 框架,所以自动化是全新的开始:
- 入职之后马上参与到了我们的新测试框架(基于 python 的 robot framework)的调研讨论和搭建工作。前一份工作中 python 就一直是我的主力开发语言,而且也有独立的框架搭建和开发经历,所以这阶段可以把自己的很多想法投入其中。
- 参与的第一个项目中帮助主管实现了一个基于多语言测试的工具,并且在之后把对应的工具给整个开发团队做了一次分享,也顺利解答了来自开发大佬们的疑问,算是帮助新团队打响了自动化的第一炮。
- 项目组第一次在项目中引入自己维护的接口服务,我也在该项目中将自己熟悉的 pytest 接口框架引入进来落地成功。虽然过程中对整个产品登录逻辑做了很多的调研和尝试,但最终还是顺利实现了测试团队接口测试框架从零到一的落地。
- 除了自己的落地工作之外,也承担了对应的分享、推广工作,也磨练和提升了自己做分享的总结、表达的能力。
走向管理
除了上面的自动化落地之外,面对着整个产品庞大而复杂的业务逻辑和团队沟通合作,我在之前工作中对不同项目的管理经验也起到了很好的作用:可以快速了解项目需求和掌握整体架构,把握测试重点;在 pod team 中推动自己的质量管理理念;通过在项目中推行自动化,提升项目的交付质量。
也由于这些方面的体验,我也开始有机会帮助主管去参与一些团队的管理工作,比如帮助推动团队项目的流程化管理;推动项目中的自动化测试落地执行;将我在项目中的思考和尝试,反馈给主管并推广到团队中。也感谢主管一直以来的信任和支持,在团队中出现管理职位空缺的时候,给我机会去尝试。
十五年来的一些感想
十五年来的工作经历,有些自己的感想,想和大家分享:
测试人员的能力提升方向
在实际的工作中,测试人员能否很好地完成工作,个人觉得以下几个方面非常重要:
- 快速地业务学习能力和思考能力。不管是新的项目需求,还是同一个产品里面的新功能,能够快速地理解产品的需求逻辑和使用场景,对后续的测试设计和执行都有非常大的帮助。个人的习惯,是把整个产品需求代入到生活中对应的使用场景中去(毕竟需求归根到底还是要解决用户的生活问题)理解。比如银行类的应用,对客户来说最重要的就是如何查看账户信息,如何进行不同的转账、缴费、定存等场景;游戏类的应用,对玩家重要的是账户如何关联和管理(比如手机号注册、微信号注册绑定等),如何充值购买道具等。这些都是可以把自己代入到用户使用场景中去思考和总结的。
- 学会掌握改动点和分析影响范围。要学会了解项目要解决的问题,要改动的环节和点,才能更精确地去分析、界定对应的测试重点和影响范围。如果只是单纯地把所有功能都去回归测试一遍,是很难把容易发现的问题给识别出来,也无法更进行精确测试,测试效率也无法提高。这需要在需求之外,有识别产品设计结果、框架组成有一定的了解和分析能力。
- 合理使用测试工具去提升覆盖率和测试效率。自动化测试不是万能,也不是做项目的目的;但也不能完全把自动化测试抛开。自动化测试归根到底还是一个工具,可以帮你去覆盖更多的场景(比如使用参数化在接口测试中覆盖更多的组合)和提升测试效率(整个项目生命周期中有很多大大小小的迭代,以及后面的回归测试维护,没有足够的自动化测试对回归测试是非常大的负担)。 不要求每个同事都有整个框架搭建的能力,但必须要会用自动化去帮助你覆盖对应的用例。
- 沟通表达能力。不需要口若悬河,但要意识到,怎么样可以让自己的表达可以精确地反馈出你的问题和想法,让对方尽可能地理解你的意图;要注意自己在沟通过程中的思路,不要让对方无法理解你想要表达的重点;要学会抓自己要了解的重点和对方表达的重点,提升解决问题的效率。
- 其他软能力的提升:比如提升自己的英文沟通能力,在外企圈可以非常大地提升自己的竞争力。
- 寻求沟通。要定时、主动地和领导沟通,寻求对方对自己工作的评价,找到提升方向;也勇于把自己的疑惑和想法与领导沟通,得到更多的支持和实践机会。
- 开拓眼界。多去看看对应的测试论坛,看看别人在做什么。不一定要把每个东西都在自己的工作中落地,重要的是可以开拓自己的眼界,给自己的工作更多灵感和方向。
总而言之,每个人要找好自己的职业发展方向(测试业务专家、测试管理专家、测试技术专家,等等),去提升对应的能力;找到自己在测试行业中的核心竞争力,去重点培养和提升。
关于面试
每次换工作的过程中都需要接受对应的面试,而自己也在完成招聘任务过程中也面试了很多同事。下面是我自己的一些感受:
- 面试的礼仪非常重要。尊重每一个面试机会,整洁的装扮,遵循正确的称呼和礼仪。如果是线下面试,一定要提前规划好时间和路线,提前到达,做好准备;如果是线上的面试,准备好自己的面试环境,调试好设备,提前拨入会议中,保持顺畅的网络和语言设备。这些环节如果没做好,对面试效果都是减分项。
- 提前的准备和自我排练。提前排练好自己的自我介绍,在有限时间内,把自己的工作亮点和竞争力表现、展示给面试官;对自己简历上的每一个内容都要做到了如指掌,并且想好如何表达,才能更从容地面对面试官的问题。准备良好的情况下,对自己的自信心也有很大的提高。
写在最后
最近一年里整个行业形势都不太好,找工作越来越难。希望我个人的经历和小小的经验总结,可以起到一点小小的启发和帮助。