霍格沃兹学习路线和面试重点准备
分享下我个人的学习路线和面试前重点准备技能:
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/\n/|/g;t1'
:1 ~ t1 指设置一个标记,若成功,则重复执行
N指追加前面的IP 例如:216.x.x.x \n 216.x.x.x
s/\n/|/g 指将换行符替换成|
三剑客方面除了常见的一些命令之外,建议熟练掌握正则使用,正则非常强大。
对于计算机网络
(1)网络七层模型,TCP/IP模型
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 区别
- 端口:http 80 ; https 443;
- 资源: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
重点复习 inner join,left join ,right join,union,子查询,order by,group by …having,distinct,事务,索引类型、原理,存储过程,慢 SQL,优化等。
对于排序与数据结构
主要掌握冒泡法,插入排序,选择排序,快排,归并算法,希尔排序等(大部分面试过程,快排是最核心的,其余排序掌握两三种即可)。
个人学习题目:https://github.com/testQx/math 37
主要掌握顺序表,链表(单向,双向,循环等),栈,队列,树
对于算法,除上方的数据结构外,还需掌握 hash 散列表,动态规划等,建议刷 LeetCode 初中级题目,刷一百题左右足够了。
对于 Python 学习
- 深浅拷贝
- 各数据结构特点、区别
- 垃圾回收机制
- Python 缓冲池
- 装饰器原理与实现
- 线程,进程,协程区别、实现
- 迭代器与生成器等
对于 Shell 脚本
Shell 语法编写规则:
同一个 shell 中编写函数 a,function a() ,不需要事先定义有多少个变量,需要调用函数时,直接传参 a 123,则此"123" 想要在 function a 中体现时,则
echo $1
,参数由1开始计数,调用函数返回值,则在执行完函数时,echo $?
则输出上一个运算的返回值。
编写循环语句:
- while xxx; do xxxxx done 结构
- for i in {0…9};do xxx done 或者 for i in((i=1;i<=j;i++)) 编写条件判断语句;
- if [ “xxx” = “xxx” ]; then xxxxx fi 注意[ ]中间各个空格必须隔开
- 多重判断: if [ “xxxx” = “xxxxx” ];then xxxxx else if [ “xxxx” = “xxxx” ];then else xxxxx fi
- 判断条件逻辑符号:&& 与,|| 或,!非 ;
- 判断条件数值大小符号: -eq 等于,-ne 不相等, -gt 大于, -ge 大于等于,-lt 小于,-le 小于等于;
- 跟踪 shell 执行:sh +x xxxx.sh (会将可能输出的结果进行打印);
- a=‘123’ 想要输出a的变量 尽量使用${a} 而不是$a ,避免拼接变量时搞错值 $( )与等同,执行里面的程序命令 执行一串命令,可用()和{} 当使用(xxxx;xxx)中间使用;隔开使用{xxx;xxxx;},中间、尾部必须使用
;
隔开,且第一个命令前必须有空格; - $(( )) 表示进行整数计算;
- 条件语句中[ ]表示匹配中括号的字符,[!..]表示不匹配中括号的字符;
- =代表赋值,==代表判断;
对于 Docker
重点复习学院课程的 dockerfile,docker 网络模式,dockercompose,docker 文件管理系统等。
对于持续集成/交付
这部分主要复习学院课程相关视频即可,掌握 Jenkins 的构建,插件,Maven 打包等。
对于安全
- 命令注入:只用
;
拼接 shell 命令; - SQL注入:使用 OR 类似拼接引号达到绕过;
- XSS漏洞:注入 HTML 闭合 JS 这些
><script></script>
- CSRF漏洞:伪造请求,将链接发给已登录的浏览器,点击时自动触发更改;利用 URL,图片这些点击;
- 使用 zap、appcran 等工具扫描,zap 可集成到 Jenkins 中,也可以通过调用 API 实现自身特殊的安全扫描;
对于测试思维
面试时候大部分会询问你以往工作经验中某一个模块功能,让你说出你是如何设计测试计划(此处需重点查看,面试官非常喜欢问)和测试用例。
例如从点线面出发编写功能性用例,UI层用例,兼容性用例,安全性用例,性能用例,接口用例等。
对于中间件
这部分个人也仍在探索,需要多看一下 Kafka,Zookeeper,Redis,mq 原理,相关消费机制,优化机制等(面试测试开发是很好的一个加分项);
对于 Socket
如何简单建立一个服务端与客户端的通讯等等;
对于 pandas
通过 Python 进行数据分析,后续课程中也有涉及,这部分为扩展加分项;
对于前后端框架
学院的测试开发后续课程中也有涉及,这部分为扩展加分项;
面试测试开发的时候,大家也不需要太紧张,除了以往的测试经验外,更多会考察你对开发方面的理解,对语言的熟悉程度,以及你站在测试开发方向,对软件测试和质量保障全局的一个理解。
另,Python 开发进阶,个人比较推荐《流畅的 Python》这一本书。