专注测试技术的课程订阅站点

不要害怕在周五部署

一般情况下我们都会避免在周五进行发布,毕竟大家都不喜欢

  • 周五留下来加班发布,周五还是早点回去比较好
  • 万一发出问题来了周六周日还要想办法去修复,休息的时间无形中被占用了

不过最近看到一篇文章观点很有意思,作者认为只要做的够好,在周五发布其实也不是什么大不了的事情。原文地址在这里,https://dev-tester.com/feel-free-to-deploy-on-friday/?utm_campaign=Software%2BTesting%2BWeekly&utm_medium=email&utm_source=Software_Testing_Weekly_147。 我稍微翻译了一下大意,也许它山之石可以攻玉。

省略前面若干字。

然而,我坚信,如果你想创建一个高质量的应用程序,大多数开发和测试团队的 “看在上帝的份上,不要在星期五部署 “的态度是不可取的。

为什么避免周五部署是一种不健康的质量控制习惯?

当一个团队像躲避瘟疫一样躲避周五部署时,通常可以认为他们对自己的的产品、流程或两者缺乏信心。这种不情愿通常源于组织需要知道或信任他们的应用程序已经准备好让客户使用。任何时候有人说 “我们不会在周五部署”,他们真正说的是 “我们不相信我们的应用程序或流程会在周五部署”。

从长远来看,这种想法并不能带来高质量的系统。团队并不把这些不确定性的作为一个表明他们需要专注于改进的信号。无论缺乏信任和信心是一个现实的问题还是一个想象中的问题,大多数团队都采取简单的方法来掩盖问题,而不是花时间去寻找改进问题的方法。他们想出了一些规则,比如周五不进行部署。

与其避免在周末进行部署,不如正面解决这些问题,加强现有的流程,让团队在任何需要的时候都能自由地进行部署。 作为一个开发人员或测试人员,如果不用担心因为在下班前要更新你的应用程序而使你的周末被打断,你会有什么感觉?

任何认真推动整个团队和产品的质量的组织必须在他们的公司中建立这种信任。虽然对你的系统完全有信心需要时间,但好消息是任何人都可以做到这点,无论他们认为他们的应用程序和流程在他们的组织中是多么的混乱不堪。下面的三步计划可以让你比你想象中的更快达到目的。

第一步:实现一个稳定的自动化测试集

自动化测试用例集合是任何想要快速构建和发布而不需要经常担心他们的应用程序的软件开发团队的必备工具。如果没有自动化测试套件,你就会严重削弱你的团队工作和部署的能力。如果你还没有给自己或你的团队一个空间来增加自动化测试覆盖率,你就会让自己处于不利的位置。

提升质量的第一步是用自动化测试去覆盖所有的关键路径,所以如果你是从头开始,请关注这一步。然而,比覆盖率更重要的东西是稳定性。即使有很高的覆盖率,如果你的测试自动化不断失败,也不会有什么帮助。如果你的测试用例很不稳定,你在任何时候都不会感到舒服,更不用说在星期五部署了。在测试覆盖率方面的工作,重点是建立一个强大的、可维护的测试框架,以保持你的团队长期的高信心。

另一个重点领域是你应该做什么类型的测试。根据你的应用程序的需求,你可能需要各种自动化测试的混合。有些团队写了几个单元测试就结束了,但今天的现代应用程序有很多变化的地方,你需要检查 E2E、验证性能、确保安全性和可访问性等这些都只是冰山一角,提前计划哪些类型的自动化测试可以使你的组织受益。

知道你需要什么类型的测试和你想覆盖的领域。拥有一个稳定的自动化测试用例集和正确的测试组合将加强你的团队对你的应用程序和部署的信心。

第二步:不要忘记手动探索性测试

当团队养成了为他们的应用程序建立稳定的自动化测试的习惯,他们可能会对他们的测试套件在部署前捕捉问题的能力过于自信。通常,一种错误的安全感导致组织内的人认为他们不需要用测试自动化实践来执行额外的测试活动。这种想法与事实相差甚远。不管你的测试自动化习惯有多好,或者你的测试覆盖率有多高,你都不能忽视手动、探索性测试的重要性。

自动化测试只能做他们被告知要做的事情,在快速开发周期中很好进行功能回归。另一方面,手动和探索性测试将允许你观察自动测试的盲点,并在没有人想到的地方发现问题–所谓的 “未知的未知”。忽视测试的这一重要部分而依赖自动化,不可避免地会导致产品质量下降。

人工测试需要时间和精力来完成。一些团队,特别是没有专门的 QA 团队的小团队,往往在最后一刻才进行这些测试。与我合作的大多数初创企业只在重大部署前几天甚至几小时做探索性测试。有时这很有效,但你有可能匆忙完成这个过程,让 bug 遗漏到了线上。

理想情况下,手动探索性测试应该在整个团队的开发周期中持续进行并伴随着新的构建在 staging 环境上进行部署。让你的组织有时间做这种测试,你会发现自己在任何时候都不会担心部署的问题。

第 3 步:建立一个自动化的构建和部署流程

在构建软件的组织中,开发和发布周期的一个部分经常被遗忘,那就是构建和部署过程。在我工作过的一些地方,构建和部署一个新的版本几乎感觉像是一个神秘的过程,只有少数被选中的人才能完成。他们的部署通常由一个漫长的步骤组成,按照精确的顺序和几乎完美的时机进行。如果执行这种仪式性行为的人在途中寄掉,这个过程的脆弱性可能会在瞬间使整个应用程序崩溃。

我描述这个过程的方式可能略显夸张,但却非常接近事实。我合作过的许多公司都有不必要的复杂部署程序。当被问及原因时,一些团队试图证明为什么需要这样做,但他们回答背后的潜台词其实是 “我们一直是这样做的,所以我们从未改变过”。常见的原因是,很久以前有人创造了这个复杂的过程。既然它是有效的–不管这个过程变得多么微妙或曲折–他们从来没有费心去改善现状。

如果你的团队必须执行多个步骤来构建和部署你的应用程序的新版本,那么你就对你的组织造成了巨大的伤害。无论你的整个系统包含多少模块,你都可以将几乎所有的发布过程自动化–甚至将其浓缩为一个命令。如今,我们有大量优秀的工具,从 Jenkins 到 AWS CodePipeline 到 CircleCI 和无数其他工具,使构建和部署过程自动化变得非常简单。你的组织没有任何借口可以避免自动化部署。

部署过程中一个同样重要但被遗忘的部分是回滚失败的部署。尽管有一个经过良好测试的自动化过程,它仍然可能由于许多不同的原因而失败,从糟糕的代码被合并到你的应用程序的基础设施的故障。大多数团队发现他们没有任何回滚策略,当部署失败时,他们的应用程序就会停机。在这种情况发生之前,制定一个适合你的情况的回滚策略,并经常测试,以确保当墨菲定律发生时,你不会感到惊讶。

总结

这篇文章的目的不是让你的团队每周五进行部署,而是让他们在需要时可以毫无顾虑地进行部署。自信部署而不用担心某些幺蛾子会发生的能力,会让每个开发人员和测试人员在他们的项目周期中不用担心太多。如果我们幸运的话,也许我们会看到更少的 memes 在我们的 LinkedIn feeds 上乱窜。

总之作者的观点是如果你够强,什么时候部署都没问题。然而时间总是自己的,为了不必要的节外生枝,还是建议大家在周五下班前或者下午不要进行部署,多一事不如少一事,不在周五部署不是真理,而是生活。

假如我被裁员了

最近在一些微信群里看到某互联网大厂裁员的消息,跟老同事确认了一下,他们部门的指标是 20%,5 个人里就要走 1 个,冰冷的数字背后是一个个鲜活的身影,一段段故事以及一声声的叹息和一阵阵的无奈,作为从业者,也不免有鸟尽弓藏兔死狐悲之感。

作为一个 35 岁以上,可能会被大部分用人企业所婉拒的老互联网人,老测试人,我今天一直在思考,假如我被裁员了那应该怎么办?

还完房贷

我想第一步可能是想尽办法还清房贷。这可能有点反直觉,丢了工作难道不应该先开源节流吗?房贷等与是长期定投,而且相对来说利率是较低的,失业之后把现金流丢到房贷里去岂不是没有任何的抗风险的空间了吗?其实我们可以反过来想,如果现在手上有些资金不去还房贷,那么很可能会去想办法创业或换个赛道做些自己不擅长的事情,这样一来如果投资或者创业失败,就目前的经济情况来看市场普遍缺乏信心,投资获益的可能性是比较低的,假如一不小心蚀了本金,那么房贷就难以为继,最后断供法拍,征信受损,大家可以了解一下失信的惨重代价。所以还清房贷,降低未来几十年的利息支出反而是更理智的选择。另外没有了房贷,每个月的生活成本其实是要低不少的,这样生存的压力也会相应降低,一石二鸟,何乐而不为。

节流节流

今年居民负债率没有提升,可能是因为大家手上真的没钱了吧。没有富余的资金,杠杆也撬不动空气。如果在这个节骨眼上没有了收入,那么我会选择尽量的降低生活成本,先活下去熬过这段时间,如果整个社会对经济都没有期待,那么经济的复苏反而指日可待。节流的方式有很多种,比如每天老老实实买菜在家里做饭,尽量少出行,不仅省钱还能预防新冠,卖掉一切不需要的东西,比如汽车,这样可以省油费,停车费和保险费用;停掉一切可能产生账单的服务,比如注销掉之前因工作需要而办理的手机号,停掉有线电视等等。这样算下来一天 100 块的话一家三口就可以生活下去,一年只需要 3.6 万,加上其他的一些成本和支出,一年最低的生活成本大概在 5 万,如果稳健理财每年的年化收益是 4%的话,那么有 125 万的本金就可以完全靠利息苟延残喘下去,寒冬总会过去,现在步入黑暗,但我仍然心向光明。

坚持交社保和保险

社保是一种对未来的投资,坚持交其实就是对未来不确定性的对冲,不过现在社保和商业保险的成本还是比较高的,应该是苟活阶段家庭年度支出的大头。

锻炼身体

前几天看到一个数据,大约在 2050 年,全球 65 岁以上人口的数量将是 5 岁以下人口数量的两倍。所以等我们这代人老去的时候,将是全球步入人口老龄化的时候。掐指一算,还有 28 年,按照中国人口结构和医疗水平推算,这个时间点可能会来的更早一些。最近一年见过一些生老病死,经历了一些世事无常,强烈的感觉到等我们步入老年之后

  • 身体的健康和神智的清晰是最大的福报
  • 社会上应该有不少岗位会向高龄人群开放

假如未来真是这样的话,为什么不在社会对 35 岁左右群体横眉冷对的时候蛰伏一段时间,锻炼好身体,不让年轻时候的工作透支年老时的健康,积极学习,跟上时代的脚步,过些年之后,当最后一波人口生育高峰的红利过去,也许届时会有更好的复出和发展的机会。总之健康生活的越久,在未来的社会可能会越有竞争力。

开源开源

做一些低成本的小生意,能赚就赚到,赚不到就当交了学费,当成是提升自我的必要投资。如果恩格尔系数过高,那么想办法种点菜补贴家用,灵活就业,赚不了大钱但心态好些就当是体验了生活。

读万卷书或行万里路

合格勤勉的打工人是没有太多时间读书充实自己的。没有工作了可以多读书,一来可以了解这个世界是如何运转的,二来可以通过不同人群的视角去展望未来,也许以后的机会就在我们对未来的憧憬中慢慢萌芽。低成本的行万里路真正让我们认识到这个世界,尽管我们是农耕民族,但迁移的基因也许从我们的祖先由非洲出走时就扎根在了我们的基因里,我们大部分人还是希望在有生之年可以亲眼看一看更大的世界。另外时不我待,前几天我去爬了座山,强烈的感受到如果年纪再稍微大一些,那么这项运动可能会跟我割席断交,失之交臂,当时就感叹,有些事情应该趁年轻去做。工可以留着年纪大了再打,毕竟从趋势上看,未来是属于老年人的,到时候孩子也长大了,每天睡的时间也少了,吃的也不多了,心态也更加平和了,模范的打工人就这么完美的炼成了。读书的经济成本不高,不过难在坚持,旅行与节流冲突,需要权衡和取舍。

培养一门爱好

有一门爱好可以全身心投入的话,那么人可能就不会那么焦虑吧。不过爱好除了投入时间之外还需要持续投入金钱,在经济压力比较大的情况下,一些烧钱的爱好可能就不太方便参与了。

多陪陪家人

打工的时候春节假期往往令人矛盾,想回老家跟家人团聚,奈何时间紧票难买;想多请几天假,奈何卷王当道,难以启齿。没有工作了终于可以多陪陪家人了,亲情也是一种治愈,能让人不那么焦虑。

总之

如果在这个时间节点我没有了工作,在有选择的情况下,我会跟家里人沟通,告诉他们我想先退一步海阔天空,调整好身体状态和心态,尽可能长的苟延残喘一段时间,然后充实自己,等待合适的机会复出;如果没有选择的话,我会默默的找出之前的简历,然后在开头加上一段话:“xx 年工作经验,xx 年管理经验,沟通能力强,有很强的抗压能力,能够适应高强度的工作”,加粗保存,发给之前有联系的一众猎头。最后盘算着离职补偿可以撑多久,从撑不住的那天倒推,给自己的求职行为立项,定目标,编 okr,最后跟家人对齐 deadline。好一似食尽鸟投林,落了片白茫茫大地真干净!

接口测试进阶:在接口测试中框架中使用json schema

当今接口测试越来越重要,一般情况下我们总是会对接口的返回的 json 字符串进行验证,看返回是否跟我们的预期相符。不过很多情况下我们会遇到下面的问题

  • 响应结果在测试中不停的发生变动,比如昨天还是 3 个字段,今天可能返回值里只有 2 个字段了,测试这边没有比较好的方式感受到后端的变化
  • 我们需要对 json 的返回值进行一些校验,需要写很多的断言,大部分时候这些断言都是相似的,或者是重复的,比如说校验某个字段的长度必须小于 10 之类的

那如何解决呢?

  • 与前后端沟通好返回值的字段,类型以及校验规则,最好有前后端+测试端统一一份合约,大家都按照合约来进行数据的处理
  • 测试的时候通过合约里定义好的校验规则进行数据校验

这时候 json schema 就派上用场了。

json schema

JSON Schema 是一种 JSON 媒体类型,用于定义 JSON 数据的结构。 JSON 模式旨在定义 JSON 数据的验证,可用于验证响应和请求 JSON。 在 JSON Schema 中,我们可以验证数据类型、字段是否为必填、最小长度或最大长度等。

举例

下面的数据代表了一个员工的信息

  • id: employeeId
  • 员工名称: employeeName
  • 年龄: employeeAge
  • 职称: jobTitle
  • 爱好: hobby
{
  "employeeId": 1,
  "employeeName": "Fulan",
  "employeeAge": 23,
  "jobTitle": "SDET",
  "hobby": [
    "watch movies",
    "play football"
  ]
}

上面的定义其实是有一些疑问的,比如

  • id 是什么意思
  • employeeName 的最大长度是多少
  • employeeAge 的最小值是什么
  • jobTitle 是必填吗
  • hobby 可以填几个

我们可以通过生成 JSON schema 来回答上面的问题

如何编写测试计划

测试计划在国内其实不是很流行。之前在外企工作的时候,每一次的测试工作基本上都是以编写测试计划开始的。好的测试计划可以让团队成员对测试整体进行和测试策略以及方法有一个大体的认识,在一定程度上可以节约沟通成本。最近正好在 github 上看到一份测试计划文档,我们就一起来学习一下其中的精华吧。项目地址:https://github.com/fityanos/awesome-quality-assurance-roadmap#test-plan-sample

1 介绍

1.1 项目介绍

介绍项目上下文

1.2 读者

描述一下读者人群,比如来自 A 团队的 alice 以及来自 B 团队的 bob

2 测试策略

2.1 测试目标

比如完整的回归测试,还是增量的功能验证等;

2.2 测试假定

假设某些东西不需要考虑或者满足某些条件,比如测试环境上可能没有配置负载均衡,这时就可以假定大家都理解这个点,并可以进行适当的忽略

2.3 测试原则

比如所有 bug 必须 fix 之类的原则性的东西

2.4 测试范围和级别

这里可以定义测试的范围,该做的就做,不该做的就先约定清楚。比如可以定义

  • 功能测试范围和时间以及交付物
  • 性能测试范围和时间以及交付物
  • 回归测试范围和时间以及交付物
  • UAT 测试的范围和时间以及交付物

2.5 LOE(level of effort)

%E5%A6%82%E4%BD%95%E7%BC%96%E5%86%99%E6%B5%8B%E8%AF%95%E8%AE%A1%E5%88%92%20fb24f300af014335945a795002909ca8/Untitled.png

这里就是工作量的分解了,越清晰越好。

3 执行策略

3.1 开始和退出条件

比如功能测试的开始条件是产品体验通过和开发自测通过,结束的条件是所有的 bug 都被 fix

3.2 测试轮次

  • 第一轮
  • 第二轮
  • ……

对于敏捷测试团队来说,其实可以忽略测试轮次的概念。对于瀑布流开发团队来说则需要定义清楚,因为每一轮的时间都很宝贵。

先收藏 测试同学的成长之道—from github

今天在 github 上看到一份测试同学的成长之路图谱,不敢独享,在这里给大家汇报一下。

%E5%85%88%E6%94%B6%E8%97%8F%20%E6%B5%8B%E8%AF%95%E5%90%8C%E5%AD%A6%E7%9A%84%E6%88%90%E9%95%BF%E4%B9%8B%E9%81%93%E2%80%94from%20github%2047ddeb01df294765bd908d165758d602/roadmap.png

基本概念

首先明确几个基本概念

  • STLT: Software Testing Life Cycle 软件测试生命周期
  • SDLC:Software Develop Life Cycle 软件开发生命周期
  • TDD: Test Driven Development 测试驱动开发
  • RPA: Robotic Process Automation 过程自动化

必须掌握的基础能力

测试策略

  • 白盒测试
  • 灰盒测试
  • 黑盒测试

测试类型

  • 功能测试
    • 单元测试
    • 冒烟测试
    • 集成测试
    • 回归测试
    • 健全性测试(sanity testing)
    • 用户接受性测试(uat)
  • 非功能性测试
    • 负载测试
    • 压力测试
    • 安全测试
    • 性能测试

上面的负载,压力以及性能测试在国内其实不怎么分,可以统一看作是性能测试,只不过测试策略不同而已。

STLC 管理工具

  • qTest
  • TestLink(常用)
  • Zephyr
  • Testrail

项目管理工具

  • Jira(常用)
  • Youtrack
  • Trello
  • Assembla

软件研发模型

  • V 模型
  • 敏捷模型:迭代式,较为常用
  • 瀑布模型

深度手工测试技能

手工测试目前看来还是软件测试工程师的核心能力,优秀的手工测试能力可以让你的职业生涯发展更加平滑。

为什么探索测试和敏捷项目八字不合

原文地址: https://www.stickyminds.com/article/exploratory-testing-why-it-not-ideal-agile-projects

下面是 gpt4 的总结。

探索性测试是一种灵活的测试方法,它不需要预先定义测试用例,而是让测试人员根据自己的判断和发现来设计和执行测试。探索性测试有以下优点:

  • 它可以适应需求不明确或变化频繁的场景,提供及时的反馈和建议。
  • 它可以发挥测试人员的创造力和直觉,发现一些预期之外的缺陷或风险。
  • 它可以节省测试文档的编写和维护的时间和成本,提高测试效率。

然而,在敏捷软件开发中,探索性测试并不是最佳选择。原因有以下几点:

  • 探索性测试缺乏可追溯性和可重复性,难以评估测试覆盖率和质量。它也不利于与其他团队成员或利益相关者分享测试结果和经验。
  • 探索性测试依赖于测试人员的经验和技能,可能导致测试结果不一致或遗漏重要的缺陷。它也不利于培养新手测试人员或提高团队的测试能力。
  • 探索性测试不利于自动化和持续集成,无法实现敏捷开发的快速反馈和交付。它也不利于与开发人员协作,实现测试驱动开发或行为驱动开发等敏捷实践。

因此,作者建议在敏捷项目中使用结构化的测试方法,结合需求分析、测试设计、测试执行和测试评估等步骤,提高测试效率和质量。

同时,也可以在适当的时机进行探索性测试,以补充结构化测试的不足。例如,在需求分析阶段,可以使用探索性测试来理解用户需求和业务流程;在回归测试阶段,可以使用探索性测试来检查系统的稳定性和完整性;在发布前阶段,可以使用探索性测试来模拟用户场景和操作。