测试人生 | 从外包菜鸟到测试开发,薪资一年翻三倍,连自己都不敢信!

原文链接


本文为霍格沃兹测试学院优秀学员学习心得与面试经验分享,进阶学习文末加群!
本人本科就读于某普通院校(很普通的那种技术示范学院),毕业后懵懂的加入了软件测试这个行业,至今有三年工作经验。通过在霍格沃兹测试学院的这段学习经历,我的职业角色完成了从功能测试到外包测试,再到测试开发的转变,并顺利拿下某互联网企业测试开发岗位Offer,年薪35W+(跳槽两次,薪资一年内翻了近三倍)!这里特别感谢各位老师和同学的帮助,也分享下自己的一点学习心得和成长经验。

吃过手工测试的苦,才懂测试开发的甜

我之前主要在两家公司呆过,工作的第一家公司是某通讯服务小公司,在接近2年时间里,大部分都是以功能测试为主,还一度被派出差,以及兼职各种产品、运维、运营的活,感觉自己都不像一个测试人员。出差期间(半年左右),根据工作需要学习各种技能,对Linux操作逐渐熟练起来,这也为我后面学Docker、持续集成等打下了基础。
出差归来,我主动提议公司去搞UI自动化测试。虽然当时用公司提供的Java代码框架,还非常落后低级(需要由测试人员来维护Excel编写用例元素定位),但总算是初步接触了自动化。而且,在编写用例时候遇到很多方法在框架里没实现,更是一度激发起自己修改代码的冲动。尤其是在后期的时候,面对越来越多的本地化客户环境,却无时间去编写自动化,每天都加班加点到各个环境去手动点击,实在是忙不过来,非常痛苦也愈发感到自动化测试和持续集成的好处。
2020疫情期间的大胆抉择:跳槽+报班学习
在2020过年放假期间冷静思考下,觉得自己不能再这么点点点下去了。虽然当时正赶上疫情爆发,身边大多数亲友都建议不要跳槽,然而恐惧最终被自己内心深处的那个声音所战胜,决定不再迁就,开始寻找新的工作机会。

干货公开课,助力我第一次成功跳槽

在找工作的时候,在网上看到了霍格沃兹测试学院的《测试开发实战进阶》课程简介,课程内容很系统,与自己想学的很接近,但一开始考虑价格原因并没有直接报名,只是加了助教好友,蹭了很多公开课。然后惊喜的发现只是公开课所学就很有裨益,直接用到了找工作面试中,并成功让我在疫情期间收获到多家公司的Offer,然后就正式报名了测试开发课程。
第一次跳槽,我从多个Offer中最终选择了去某互联网大厂做外包测试。虽然是外包岗位,薪资也较低,但感觉大厂的技术体系和学习氛围要更好,自己也想亲身体验下在大厂工作是怎样的体验,也利于进一步深入的学习先进测试技术。

外包随时离岗的压力,成为我努力学习的动力

外包期间,无论是工作还是心态上,都经历了不少挑战。
由于我是第一批测试外包人员,当时公司很多测试流程还不完善,测试用例时间来不及编写,同时提测多个需求,一度是吃老本直接提测。于是,我跟相关的部门领导多次提议,并利用在学院所学,自己加班编写了接口自动化测试框架,成功地帮助项目解决了一部分痛点问题。
然而,外包人员的流动性真的太大了,随着项目结束和外包合同终止,随时都可能被离岗。这种不安定和惶恐的感觉一方面让我倍感压力,一方面也促使我狠下心来努力学习,立志成为大厂正式的全职测试开发人员。在每天加班回家后,我仍然会学习霍格沃兹测试学院的测试开发实战课程,经常学到凌晨两三点,持续了接近半年时间。在看到不少同班同学都成功拿到BAT大厂Offer,自己也开始了尝试投递简历,并最终很幸运可以收获了某互联网企业测试开发岗位Offer(第二次跳槽后年薪达到35W+,是原来的三倍左右)。说实话,能拿到这么满意的薪资,我自己也被震惊了,当时都有点不敢相信。从鼓起勇气选择改变,到默默无闻的坚持学习,再到努力实践应用,直至能被企业所认可,内心其实非常感动。

懂得为什么学,找到专精方向

也真的很感谢霍格沃兹测试学院的导师和测试开发班的各位同学。在报名学院的4个多月时间里,真心学到了非常多的干货知识,我也第一次体会到了有大咖导师带着学习,目标清晰,方向正确,不走弯路的美好感受。这也是我认为报班学习的最大价值——重要的不是学到知识,而是要懂得为什么学;可怕的不是不努力,而是不知道努力的方向。
霍格沃兹测试学院的课程体系覆盖非常全,让我知道了测试技术的发展方向。在学员群里,有问题随时@导师,回复非常迅速,另外同班的一堆大佬们,也是才富五车,个个抢着给答案。即便没有任何问题,在群里看各位大佬分享平常的工作心得,面试经验等,都会有很大的启发。而且课程内容一直在更新,至今还在加课,第一次见这么良心的培训班~~平常学院的各种活动,例如知识分享,答疑区,金羽毛杯,内推活动,报名当学习委员(以教促学)等等,都很有意思。
课程内容真的非常多,个人建议如果录播课程暂时无法跟上,可以先放一放后面再补,但是直播内容一定要坚持跟下来,直播课大部分是精华讲解和实战演练,一定不能错过。尤其是要选择自己想专长的方向,专精一部分去学习提升,我自己选择的是UI与接口自动化测试。我认为尤其要掌握好自动化测试、性能测试这部分实战技能,对于平台开发可以暂时放缓,毕竟我们测开的定位还是倾向于测试左右移,对代码的精准测试,而非一个三流的开发。
以下分享我个人的学习心得和面试经验:

测试开发成长路线和面试经验

首先,我认为一定要有自己的学习方向,目标是要做到T字型人才,保证广度的时候也一定要有一两项专精,这样才能够在面试时候脱颖而出。
分享下我个人的学习路线和面试前重点准备技能:
pytest->完善接口自动化框架->UI自动化框架->Linuxs三剑客->计算机网络->自动化原理->MySQL->排序算法->数据结构->Python->Shell脚本->Docker->持续集成/交付->安全->测试用例计划思维->中间件->socket->pandas->前后端框架
重要是完善接口,UI自动化测试框架实战技能,这部分是一定要去落地实施的,不然你无法真正接触到业务核心难点。所谓师傅领进门,修行在个人。

pytest

是最流行的Python自动化测试框架,需要重点掌握。
UI自动化测试
除了学院教授的PO思想,简单完成页面封装后。我们要去增加用例,只有用例数足够多时候,你会发现还需要如何在多个py文件中管理用例顺序?driver调度是否合理这一系列问题。也可以去增加相关的日志,报告模块的封装,将部分JS处理同步集成到Basepage模块中,还有一系列的系统操作,SeleniumGrid的集成等等。
UI自动化扩展:增加log存储,Allure报告存储(此处的Allure必须要结合趋势图,例如这一次生成报告后,你需要保存result中的history文件,等下一次生成时,覆盖到report中的histroy中),seleniumgrid的执行命令,使用pytest.ini进行定制,使用pytest钩子函数定制,使用pytest-xdist进行并发用例等)。

对于接口自动化

其实很多时候,企业不仅限于满足只断言接口状态响应码,部分字段等。对于编写速度,稳定性,数据真实性也是有很多的要求。对于速度,我们可以通过mustache模板技术生成测试用例,可以通过Charles生成的chls文件进行部分处理生成JSON或者YAML文件;对于稳定性,可以通过在设计阶段,生成对应接口正确的jsonschema进行对比;对于数据真实性,可以通过mitmproxy,让流量走特地接口,直接生成线上数据,真实模拟用户操作回放。
接口自动化扩展:(增加log存储,Allure报告存储,异常处理机制,链接数据库,失败用例重跑pytest-rerunfailures,用例执行控制pytest-ordering,重复执行pytest-repeat,使用jsonschema进行断言,通过charles文件自动生成YAML或JSON文件,通过mitmproxy进行线上流量回放等)。
对于Linux三剑客

  • (1)匹配 nginx.log 中 404 和 500 有多少行?
cat nginx.log |awk '{print$9}' |grep -E '404|500' |wc -l  // 过滤输出了$9一列 awk '$9~/404|500/' nginx.log | wc-l  // 只将$9匹配,输出的仍是完整行
  • (2)统计 nginx.log中 出现次数最多的 IP
cat nginx.log |awk '{print $1}' | sort |uniq -c |sort -rn |head -3|awk '{print$2}'
sort 排序  sort -n 按数字排序  sort-r 反转
uniq 去重  uniq -c 去重并统计重复次数
head -3 头三个   tail -3 尾三个
  • (3)将 nginx.log 中的 topics 后面的数字替换成 number
sed -E 's/topics/[0-9]*/topics/number/g' nginx.log
-E 采用正则   's/old/new/g' 固定替换公式
[0-9]匹配数字,[0-9]*匹配 0个或者多个数字
/ 表示 / 符号,进行转义
  • (4)讲 nginx.log 中的 ip 地址横向打印
awk '{print $1}' nginx.log  | sed -e ':1;N;s/
/|/g;t1'
:1 ~ t1 指设置一个标记,若成功,则重复执行
N指追加前面的IP 例如:216.x.x.x 
 216.x.x.x
s/
/|/g 指将换行符替换成|

三剑客方面除了常见的一些命令之外,建议熟练掌握正则使用,正则非常强大。

对于计算机网络

(1)网络七层模型

|OSI七层模型|TCP/IP模型|5层结构|| |—|—|—|—| |应用层|应用层|应用层|TELENT,HTTP,DNS,FTP,SMTP,POP3| |表示层|—|—|—| |会话层|—|—|—| |传输层|传输层|传输层|TCP/UDP| |网络层|网络层|网络层|P,ARP,RARP,ICMP,IGMP| |数据链路层|网络接口层|数据链路层|以太网,物理网络,LAN/WAN| |物理层||物理层||

(2)UDP与TCP区别
  • TCP有连接;UDP无连接(基于无状态传输); - TCP需要建立三次握手,含有确认、拥塞、重传机制,对系统资源要求多; - UDP不需要一系列复杂认证,速度快;TCP速度慢; - TCP含有确认机制,数据可靠,有序; - UDP不可靠,无序;TCP面向字节流(流模式);UDP面向报文(数据报模式);
    #####(3)HTTP与HTTPS区别
  • 端口:http80;https443; - 资源:https需要加解密需要消耗更多CPU内存; - 安全:https需要认证证书,http无法验证身份;
    #####(4)HTTPS的通信加解密过程,证书为什么更安全
  • HTTPS含有证书,CA证书需层层认证,用上层公钥解开CA的hash签名获取hash值;且与权威机构存储hash值对比,判断认证可信; - 过程: - 客户端使用HTTPS的URL访问服务器,要求建立SSL连接,发送相关数据及随机数给服务端 - 服务端收到请求,发送相关数据,随机数,证书信息(含公钥)给客户端 - 客户端校验证书,生成随机数pre-master,并用服务器公钥进行加密,发送已加密随机数pre-master与客户端证书给服务端 - 服务端校验证书 - 客户端,服务端通过对端随机数,已方随机数,pre-master推算出对称密钥 - 通过对称密钥加密传输
(5)http1.0与https1.1有什么区别
  • http1.0为短连接;http1.1请求头携带connetion:keep-alive,建立长链接 - http1.0一个连接对应一个请求一个响应;1.1连接过程中可实现多个请求多个响应,且不需等待响应可发送下一个请求 - http1.1增加了100状态码,允许客户端向服务端发送请求头待确认后再发送请求体内容,节省了带宽 - http1.0认为一个主机拥有唯一IP;http1.1中一个IP对应多个主机,增加了host指明主机名 - http1.1增加更多新请求头,错误响应状态码与缓存机制
(6)get和post区别
  • GET请求参数在URL中;POST请求参数放在请求正文中 - GET请求参数有限制(例如浏览器对URL长度限制); - POST无限制GET参数存放在链接中直接保存在浏览器历史记录中,较不安全 - GET大多数用于信息获取,POST用于信息修改,对服务器安全影响程度不同
(7)session,token,cookies区别
  • Cookie:由服务器生成,保存在客户端中 - Session:一般通过Cookie传输,用于区分用户,存储在服务器中(容易占用服务器资源,且服务器故障,负载均衡等容易丢失或请求到其他服务器中) - Token:一般通过Cookie传输,将用户数据进行签名(加密),并将签名和用户数据整合成token发送给客户端,客户端携带token请求时,将token中用户数据再次签名,与token中的签名进行对比,一致认为用户已认证登录,不需要存储在服务器中
(8)http三次握手四次挥手过程
  • 认知概念: - 序号:Seq序号,用来标识从TCP端向目的端发送的字节流 - 确认号:Ack序号,当ACK标志位为1时,确认号有效,Ack=Seq+1 - 标志位:URG(紧急指针有效),ACK(确认序号有效),PSH(接受方应尽快把报文交给应用层),RST(重置连接),SYN(发起新连接),FIN(释放链接)
  • 三次握手与四次挥手:
  • 补充说明:在客户端与服务端传输TCP报文中,双方Ack与Seq都在彼此Ack与Seq基础上计算,这样保证了TCP报文传输的连贯性,一旦报文丢失,则无法继续握手
  • 四次挥手:
  • 补充说明: - 与“三次握手”一致,在彼此Seq,Ack上计算,保证TCP连贯性 - “三次握手”被动服务器方不需要任何准备 - “四次挥手“被动服务器方不能立即释放连接,还有必要数据处理,经过CLOSE-WAIT阶段准备 - 客户端在最后需等待2MSL,确保客户端收到服务器端FIN,FIN发送后,若2MSL内未收到ACK则再次发送FIN
    ####(9)请求一个网址发生的完整过程
  • DNS解析:通过浏览器缓存->操作系统缓存->路由器缓存->DNS缓存(运营商)->根域名服务器 - 建立TCP连接,发起三次握手 - 发送HTTP请求 - 服务器处理请求浏览器解析渲染页面: - 浏览器读取响应加载HTML - 静态资源加载 - 动态资源加载 - 释放TCP连接,四次挥手
(10)常见网络状态响应码
  • 1XX指示信息,请求已接受,等待继续处理 - 2XX请求接受 - 3XX重定向 - 4XX客户端错误 - 5XX服务端错误 - 301永久性转移,302暂时性转移,400客户端请求有错(安全拦截),401请求未授权,403禁止访问,404资源未找到 - 501服务器内部错误,502错误网关,503服务器不可用,504网关超时
    #####(11)HTTP请求,响应结构

对于自动化测试原理

  • 重点掌握Selenium自动化原理,接口Request原理,接口Mitmproxy代理原理(中间人攻击),Appium自动化测试原理;

对于数据库MySQL

  • 重点复习innerjoin,leftjoin,rightjoin,union,子查询,orderby,groupby…having,distinct,事务,索引类型、原理,存储过程,慢SQL,优化等。

对于排序与数据结构

  • 主要掌握冒泡法,插入排序,选择排序,快排,归并算法,希尔排序等(大部分面试过程,快排是最核心的,其余排序掌握两三种即可)。 - 个人学习题目:GitHub - testQx/math - 主要掌握顺序表,链表(单向,双向,循环等),栈,队列,树
    对于算法,除上方的数据结构外,还需掌握hash散列表,动态规划等,建议刷LeetCode初中级题目,刷一百题左右足够了。

对于Python学习

  • 深浅拷贝 - 各数据结构特点、区别 - 垃圾回收机制 - Python缓冲池 - 装饰器原理与实现 - 线程,进程,协程区别、实现 - 迭代器与生成器等

对于Shell脚本

  • Shell语法编写规则: - 同一个shell中编写函数a,functiona(),不需要事先定义有多少个变量,需要调用函数时,直接传参a123,则此’123’想要在functiona中体现时,则echo$1,参数由1开始计数,调用函数返回值,则在执行完函数时,echo$?则输出上一个运算的返回值。 - 编写循环语句:
1.while xxx ; do xxxxx done结构
2.for i in {0..9}; do xxx done 或者 for i in ((i=1;i<=j;i++)) 编写条件判断语句;
3.if ['xxx'='xxx'];then xxxxx fi 注意[]中间各个空格必须隔开
4.多重判断:if['xxxx'='xxxxx'];then xxxxx else if['xxxx'='xxxx'];then else xxxxx fi判断条件逻辑符号:&&与,||或,!非;
5.判断条件数值大小符号:-eq等于,-ne不相等,-gt大于,-ge大于等于,-lt小于,-le小于等于;
6.跟踪shell执行:sh+xxxxx.sh(会将可能输出的结果进行打印);
7.a='123'想要输出a的变量尽量使用${a}而不是$a,避免拼接变量时搞错值$()与等同,执行里面的程序命令执行一串命令,可用()和{}当使用(xxxx;xxx)中间使用;隔开使用{xxx;xxxx;},中间、尾部必须使用;隔开,且第一个命令前必须有空格;
8.$(())表示进行整数计算;条件语句中[]表示匹配中括号的字符,[!…]表示不匹配中括号的字符;
9.=代表赋值,==代表判断;

对于Docker

  • 重点复习学院课程的dockerfile,docker网络模式,dockercompose,docker文件管理系统等。

对于持续集成/交付

  • 这部分主要复习学院课程相关视频即可,掌握Jenkins的构建,插件,Maven打包等。

对于安全

  • 命令注入:只用;拼接shell命令; - SQL注入:使用OR类似拼接引号达到绕过; - XSS漏洞:注入HTML闭合JS这些> - CSRF漏洞:伪造请求,将链接发给已登录的浏览器,点击时自动触发更改; - 利用URL,图片这些点击; - 使用zap、appcran等工具扫描,zap可集成到Jenkins中,也可以通过调用API实现自身特殊的安全扫描;

对于测试思维

  • 面试时候大部分会询问你以往工作经验中某一个模块功能,让你说出你是如何设计测试计划(此处需重点查看,面试官非常喜欢问)和测试用例。 - 例如从点线面出发编写功能性用例,UI层用例,兼容性用例,安全性用例,性能用例,接口用例等。

对于中间件

  • 这部分个人也仍在探索,需要多看一下Kafka,Zookeeper,Redis,mq原理,相关消费机制,优化机制等(面试测试开发是很好的一个加分项);

对于Socket

  • 如何简单建立一个服务端与客户端的通讯等等;

对于pandas

  • 通过Python进行数据分析,后续课程中也有涉及,这部分为扩展加分项;

对于前后端框架

  • 学院的测试开发后续课程中也有涉及,这部分为扩展加分项;
    面试测试开发的时候,大家也不需要太紧张,除了以往的测试经验外,更多会考察你对开发方面的理解,对语言的熟悉程度,以及你站在测试开发方向,对软件测试和质量保障全局的一个理解。
    另,Python开发进阶,个人比较推荐《流畅的Python》这一本书。
    最后,再次感谢学院各位老师尤其是思寒大佬的指导,祝学院越办越好,也祝大家都学有所成,找到心仪的工作~~(end)
关闭