这里记录过去一周我们看到的软件测试及周边的行业动态,周五发布。
本周刊开源(GitHub: SoftwareTestingWeekly ),欢迎提交 issue,投稿或推荐软件测试相关的内容。
科普
愚人节
昨天是愚人节,朋友圈流传着一句话:成年人的世界里没有愚人节,只有 Q2。
一语中的,直击灵魂。
啥是 Q2?
其实就是英文 Quarter2,通常指一年的第二个季度。人们常把一年平均分成四份,按照春、夏、秋、冬的顺序分为四个季度,也就是 Q1、Q2、Q3、Q4。
『乡村四月闲人少,才了蚕桑又插田』。你的人间四月天,却是成年人 Q2 的开始,也意味着 2021 年已经过去了 1/4。
啥是愚人节?
愚人节(英语:April Fools' Day)为每年的4月1日,是从 19 世纪开始在西方兴起流行的民间节日。
在这一天人们习惯以各种方式互相欺骗、捉弄及取笑,而往往玩笑在最后才被揭穿。但如果玩笑开得过大,则很可能会引起人们的恐慌,产生较大规模的反响及进一步衍生成为谣言或都市传说等。
一则起缘故事:
1565年,法国国王查理九世颁布法令改以1月1日为一年的开端,改变了过去以4月1日为新年的传统。
一些守旧派反对该改革,依然按照旧历法在新历4月1日送新年礼,庆祝新年。支持新年改革的人借此对守旧派大加嘲弄,在当天给他们送假礼物,邀请他们参加假聚会。
从此在4月1日捉弄人的习惯便流传开来。当有人上当受骗的时候,捉弄他的人就会高呼“Poisson d'avril(四月恶作剧)”。
招聘黑话
菜饼
很多新人不太了解互联圈的招聘「黑话」,比如 HC、JD、Base 等,这里科普一下。
- HR:Human Resource,人力资源,一般来说,我们指代具体的,负责招聘工作的小哥哥&小姐姐。
- HRBP:Human Resource Business Partner,人力资源业务合作伙伴,调薪、入职、离职、各种问题都可以找 TA。
- HC:Head Count,人头数,可以理解为招聘名额/转正名额。
- JD:Job description,职位描述。
- Base:这个词要看语境
-
- 在职位描述相关的语境下,就是岗位所在城市。如:Base 在杭州。
- 在薪资背景下,就是基本工资的意思。
- OC:Offer Call,也就是通知录用的电话。
- Offer:Offer letter,意为录用通知。
- 三方:全称(
全国普通高等学校毕业生就业协议书
),三方其实就是你(毕业生)、学校和公司之间要签订的就业协议;一般是你秋招取得正式 offer 后才要签订的。
- KPI:Key Performance Indicator,关键绩效指标,简单点说就是考核指标。
- OKR:Objectives and Key Results,即目标与关键成果法,是一套明确和跟踪目标及其完成情况的管理工具和方法。
- 薪资计算方式:例如:
18.5*16 + 6/2 + 3
意思是,每月基本薪资18.5k
(也就是base 18.5k
),年终奖按4
个月算,然后价值6w
的股票分2
年发放,一次性签字费3w
。
- 薪酬构成:
-
- COMP 1=基本薪资
- COMP 2=津贴+COMP1
- COMP 3=浮动奖金+COMP2
- COMP 4=长期激励+COMP3
- COMP 5=COMP4+福利(薪酬总额)
文章
1. 软件开发管理的 11 条真理
Nick Hodges
软件项目的开发管理是一门不精确的科学,作者根据多年工作经验总结了 11 条真理:
- 估算总是错的,你不可能精准的估算时间,实际执行时总会有误差,所以大概的估算是比较好的。
- 项目越大,参与的人越多,未知的变量就会越多,时间也就会增加,你在开始的估算就越不准确。
- 注意力和专注力是团队最宝贵也是最稀缺的东西,完成一个项目所需要的最有价值的工作就是团队不受干扰的工作。
- 霍夫斯塔德定律是真理
-
- “即使你考虑到了霍夫施塔特定律, 项目的实际完成时间也总是比预期的要长。” -- 维基百科
- 这个定律具有递归性,反映了预估复杂项目的难度,尽管你可能已经做出了最大的努力,而且也知道任务的复杂性。
- 你不能加快软件开发的速度,只能限制其减慢的程度,你所能做的就是减少他们的干扰。
- 你只能在非常短的时间内要求团队投入更多的时间(加班、熬夜),但不可持续,否则会崩。
- 坐在位子上长时间工作不代表什么,用大脑思考才是一切。
- 优秀的开发人员时间很贵,不要因为硬件差而阻碍了他们的生产。
- 你无法客观的衡量开发人员的生产力,只能从主观上度量,但需要经验和方法。
- 如果你没有读过《人件》,就不是一个真正的软件开发经理
- 质量是一种认知,而不是缺陷数量
-
- 你的软件只有在客户认为它质量够高的时候才可以说是高质量的,而缺陷数量不一定能说明这一点。
2. 我为什么离开字节跳动?
董芷菲
- 在扁平的管理结构下,最疲惫的是中层。
-
- 什么级别算中层?
-
-
- 字节跳动的职级有 5 级 10 档(1-1,1-2...5-1,5-2)
- 3 级算中层,如果是程序员,应该对标阿里 P8,团队一般 20 人左右。
- 4 及以上级别算高层,5-2 是张一鸣。
-
- 中层为什么很累?
-
-
- 中层的压力之源是张一鸣,因为他会跟 3 级直接沟通工作。
- 中层既要做业务,又要做管理。
- 中层不仅要陪着下属一起加班,还要向上管理保证完成业绩。
- 还有超长的工作时间:日常 9 点后到家,每周都有一次开到半夜的例会。
-
- 中层的工作是什么?
-
-
- 中层日常工作的起点是接到一个协同任务,然后拆分任务,再分派给自己的下属。
- 其实就是就是白天开会,晚上干活。
- 张一鸣的实用主义人文观
-
- 他对旗下中高层的“拼”劲儿要求很高。
- 他会看员工敬业度和满意度统计。
- 他觉得为了公司利益个人的情绪、ego、满足感都应该往后放。
- 跑不动、或经验不再能为公司所用的中高管很快会被冷落或架空。
- 字节永远都在找更好的人
-
- 你面试的人,其实可能就是来代替你的。
- 字节跳动是激进执行冗余招聘的公司。对内,冗余意味着大家要争抢、打仗、要有赛马的余地、要急不可耐地去开疆拓土。
- 闲下来就是死去的先兆,冗余反而是激活员工在 996 的海洋中寻找新方向的激活器。
- 失速之忧
-
- 字节跳动全球员工已经达到 10 万人,出现了业务之间争抢和内耗。
- 可蛋糕并没有变大多少,海外业务受阻,国内教育和游戏没能壮大。
- 这就让中层的协同更加复杂,部门间有了相互挑战的潜台词,大家都想争夺影响力和话语权。
- 日报、周报、双周报、月报、双月 OKR,“说故事”、“向上管理”成为了必备技能。
- 因为干得好更要说得好,表明自己的贡献、影响力很重要。一段简单的发言都要改 2 个小时。
- 没有精力去思考事情长期应该怎样更好,变成服务于一个又一个的双周的目标,以及如何‘生存’。
- 热锅上的蚂蚁
-
- 你看向周围陌生的同事,觉得他们每天都能开开心心的工作,风风火火的做事,不要太羡慕。
- 直到有天你参加了她的离职 Party,才发现大家都是热锅上的蚂蚁,焦灼、怀疑、抗拒、抵触、甚至都想拜拜了互联网。
3. 什么是 Mock 测试?
雷架
什么是 Mock?
- 作为动词,Mock 是模拟、模仿的意思。
- 作为名词,Mock 是能够模仿真实对象行为的模拟对象。
那么,在软件测试中,Mock 所模拟的对象是什么呢?
模拟的是 SUT(System Under Test:被测系统) 的依赖,而不是其本身。
比如,我要测试 A,但 A 依赖 B,要模拟的对象就是 B。
为什么要模拟 B 呢?
- 提高 A 的测试覆盖率:通过 Mock 模拟 B 返回的正常和异常的结果,使用 A 的测试更充分。
- 避免 B 的因素对 A 产生影响:当 B 因各种原因无法正常使用时,导致 A 无法测试。
- 提高 A 的测试效率:B 的真实行为可能很慢,但模拟可以很快。
Mock 的两大功能:
使用 Mock 的问题是什么?
- 可能导致问题遗漏:毕竟是模拟的,是理想可预见的情况,真实的情况可能更复杂。
- 可能导致维护成本变高:接口变更 Mock 用例要跟着改,改错和漏改都可能出问题。
常见的 Mock 类型:
- 方法级别:Mock 的对象是一个函数调用,例如:获取系统环境变量。
- 类级别:Mock 的对象是一个类,例如:一个 HTTP server。
- 接口级别:Mock 的对象是一个 API 接口。
- 服务级别:Mock 的对象是整个服务。
使用 Mock 做接口测试时,一般分二步:
- 1. 打桩:创建 Mock 桩,指定 API 请求内容及其映射的响应内容。
- 2. 调桩:被测服务来请求 Mock 桩并接收 Mock 响应。
在这二步之间还有一个 Mock 桩的注入,啥是 Mock 注入?
Mock 的本质就是用模拟桩
来替换真实的依赖
。所谓 Mock 桩注入就是阻断被测服务与真实服务之间的链路,建立被测服务与 Mock 之间的链路过程。
如下图所示:
如何注入 Mock?
常见的方式包括但不限于以下五种:
- API 请求构造
客户端 Mock:在被测服务内部工作,直接拦截被测服务的 API 请求方法,直接从方法内部返回预定义的 Mock 响应。
服务端 Mock:在被测服务外部工作,作为 HTTP 服务器接收被测服务发送的 API 请求,并返回预定义的 Mock 响应。
- 本地配置:
对于服务端 Mock,打桩之后会生成唯一的 Mock 桩地址,被测服务提供一个依赖服务地址配置项,在需要使用 Mock 时将依赖服务地址修改成 Mock 地址。
- 配置中心
对于服务端 Mock,为了避免修改依赖服务地址配置项导致被测服务重启,可以采用配置中心存储和管理依赖服务地址配置,或者使用注册中心记录服务与服务地址的映射关系。
- 反向代理
在微服务架构下,被测服务与依赖服务之间可能不是直连的,而是经过了一层反向代理,例如 API 网关。在这种情况下,被测服务是通过调用 API 网关来间接调用依赖服务的接口。
- 前向代理
服务端 Mock 除了作为 HTTP 服务器,还可以兼备 HTTP 代理的功能,这种架构又叫做 Mock 代理。
对比:
Mock 类型 |
注入类型 |
优势 |
不足 |
客户端 |
请求改造 |
性能好 |
实现成本高 |
服务端 |
本地配置 |
实现简单 |
需要重启 |
服务端 |
配置中心 |
无需重启 |
可能存在延迟 |
服务端 |
反向代理 |
无侵入、细粒度 |
可能存在延迟 |
服务端 |
前向代理 |
细粒度、自动生成 Mock |
需要重启 |
常用 Mock 工具:
-
- easymock、jMock、Mockito、Unitils Mock、PowerMock、JMockit..
-
- Wiremock、Mockserver、Moco、Mock.js、RAP...
工具
1. 学而思开源的流量回放平台:Conan
学而思网校的质量团队开源了他们的流量回放平台 Conan,旨在为行业内更多的质效保障团队提供更专业更稳定的质效保障方案。
Conan 的核心功能:
基于 ES 日志源的流量录制采集,平台化配置接入,降低使用成本,并且提供详细的流量采集数据。
分布式的后端架构,为流量回放提升执行效率,支持服务鉴权配置,基于 http 协议的回放符合真实业务场景。
流量回放的常规校验方式基本上是以流量结果的 DIFF 为主,但大量的流量噪声(时间戳,自增数据...)一直影响结果的准确性,Conan 平台在回放中基于配置的 jsonSchema 做第一层校验,再结合自研的降噪比对服务进行流量 DIFF 的第二层校验,从而保障了结果校验的准确性,大大提升了流量回放结果的可信度。
开源地址:https://github.com/tal-tech/conan
文档地址:https://dengkunnanmayun.gitee.io/conan-docs/#/use/README
方法
1. 如何进行前端性能优化?
谭光志
- 减少 HTTP 请求
-
- 一个完整的 HTTP 请求需要经历 DNS 查找,TCP 握手,浏览器发出 HTTP 请求,服务器接收请求,服务器处理请求并发回响应,浏览器接收响应等诸多过程,下载数据只是其中一部分。
- 建议将多个小文件合并为一个大文件,从而减少 HTTP 请求的次数。
- 使用 HTTP2。 相比于 HTTP 1.1 :
-
- 解析速度快、多路复用(多个请求可以共用一个 TCP 连接)、首部压缩
- 可以设置请求的优先级
- 可以对不同的流的流量进行精确控制
- 除了对最初请求的响应外,服务器还可以额外向客户端推送资源,而无需客户端明确地请求。
- 使用服务端渲染
-
- 客户端渲染: 获取 HTML 文件,根据需要下载 JavaScript 文件,运行文件,生成 DOM,再渲染。
- 服务端渲染:服务端返回 HTML 文件,客户端只需解析 HTML。
-
-
- 优点:首屏渲染快,SEO 好。
- 缺点:配置麻烦,增加了服务器的计算压力。
- 静态资源使用 CDN
-
- 内容分发网络(CDN)是一组分布在多个不同地理位置的 Web 服务器。
- 使用 CDN 在多个位置部署服务器,让用户离服务器更近,从而缩短请求时间。
- 将 CSS 放在文件头部,JS 文件放在底部
-
- 所有放在 head 标签里的 CSS 和 JS 文件都会堵塞渲染,如果时间很久就会使页面空白,所以 JS 文件要放在底部,不影响用户的观感。
- 如果 JS 文件非要放在头部,只要给 script 标签加上 defer 属性,异步下载,延迟执行。
- 为了避免用户只看到 HTML 没有样式的情况,CSS 文件要放在头部。
- 使用字体图标 iconfont 代替图片图标
-
- 字体图标就是将图标制作成一个字体,使用时就跟字体一样,可以设置属性。
- 字体图标是矢量图,不会失真,而且生成文件特别小。
- 使用 fontmin-webpack 插件对字体文件进行压缩。
- 善用缓存,不重复加载相同的资源
- 优化图片
-
- 图片延迟加载:当图片出现在浏览器的可视区域时,才去加载真正的图片,这就是延迟加载。
- 响应式图片:优点是浏览器能够根据屏幕大小自动加载合适的图片。
- 调整图片大小:一开始,只加载缩略图,当用户悬停在图片上时,才加载大图。
- 降低图片质量:通过压缩适当降低图片质量,基本看不出区别。
- 尽可能利用 CSS3 效果代替图片
- 使用 webp 格式的图片
- 通过 webpack 按需加载代码,提取第三库代码,减少 ES6 转为 ES5 的冗余代码。
- 减少重绘重排
-
- 重排:当改变 DOM 元素位置或大小时,会导致浏览器重新生成渲染树。
- 重绘:当重新生成渲染树后,就要将渲染树每个节点绘制到屏幕。
2. 如何做好前端稳定性监控?
墨辉
- 监控的核心能力是什么?
报警的有效覆盖率、线上问题的发现能力以及如何快速定位问题。
- 安全生产的整体目标是什么?
1-5-10,1 分钟发现问题、5 分钟定位问题、10 分钟修复问题。
- 为什么多数故障不能被发现?
- 业务未接入监控:安全意识缺乏、基础设施并不完备
- 核心指标未订阅:多数页面引入了监控,但是没有订阅报警,或者指标订阅不全。
- 监控指标不完整:只关注了页面运行时的异常,没有关注 CDN 节点异常、页面加载白屏、页面执行 Crash 等问题。
- 为什么快速恢复很难?
一个完整的开发流程包含 :开发 -> 发布 -> 线上验证回归流程
如下图所示:
按这个流程很难做到 10 分钟恢复,怎么办呢?
聚焦到页面发布之前的开发阶段和发布阶段:
- 发布之前:完整的自动化测试流程,例如在发布之前对资源异常、JSError 等做检测拦截。
- 发布过程:页面发布过程具有可灰度、可监控、可回滚的完整过程。
- 整体方案是什么?
5.1 提升监控覆盖率
-
- 完善基础设施:在搭建层做默认统一接入,在源码层统一采集规范和数据规范。
- 业务治理推动:通过统计团队维度的覆盖分布和指标情况,度量页面安全分(度量&红黑榜),引导和推动其快速接入。
-
- 订阅指标补齐:通过治理流程,统计页面未订阅关系分布,走一键订阅指标补齐。
- 完善发布流程:页面发布后,订阅发布消息,对核心指标做增量订阅。
- 3. 提升指标覆盖率:从安全视角来看,整个链路(从容器启动 -> air渲染 -> 页面加载执行)的稳定性都需要做到可监控。
-
- 容器层:比如 webview 容器等,加载运行过程可以检测页面加载是否白屏 和 crash。
- 源站层:在 CDN 就出现异常,从前端的视角是无法感知的。
- 页面层,依赖本身 SDK 的能力,全局捕捉过程异常点作为监控指标点。
全链路保障过程,在数据链路层对数据指标过程做了统一接入,通过页面地址对齐指标:
5.2 灰度监控区分新版问题
快速恢复的核心是需要更快发现问题,更快的对变更进行回滚。数据表明,80% 的线上问题是由变更导致的,而这些故障都有监控,只是新版本的问题在错误量上不明显,又没有专门的区分,导致被忽略。
所以对于变更的过程的监控 【灰度监控】需要标识异常日志,判断是否是新版本带来的。
解决方案如下:
- 指标采集:采集脚本通过读取模板全局变量获取,容器层通过 response header 拿到灰度标识。
- 监控指标:采集脚本和容器层需要统一和标准化灰度字段规范,在日志上报过程中携带,小程序通过版本号区分。
- 灰度应用:主要表现在指标灰度实时日志呈现和报警。
3. 如何写出高质量的技术文章?
张建飞
- 为什么要写文章?
-
- 写文章是一个逼迫自己深入理解问题、把问题想清楚,整理好思路,并能清晰表达出来的过程。
- 其本质是一种自我学习、自我提升、构建知识体系的最佳方法。
- 什么是好的技术文章?
-
- 一个是要传达有价值的信息。
- 要结构和逻辑清晰,具备一定可读性和可理解性。
- 如何写好技术文章?
-
- 内容有用:要让读者有获得感,要对读者有用,要言之有物。
- 结构清晰:金字塔原理 + 3W2H
- 刻意练习:多写多改多思考
言论
1、关于油腻最好的解释之一
2、认识到自己的无知程度,需要有相当程度的知识。
3、改变拖延习惯的三大驱动要素:责任、目标、deadline
图片
1、以已度人集大成者...
2、是你吗?
3、领导让你临时接手一个快要上线的项目时...
订阅
本周刊每周五发布,会同步更新在微信公众号。
微信搜索“毕小烦”或者扫描下面的二维码,即可订阅。
如果文章对你有帮助,请随手点个赞吧!
(完)