构建高效Presubmit卡点,落地测试左移最佳实践
樊登有一节课讲的挺有意思,说中国有个组织叫绩效改进协会,专门研究用技控代替人控的事情。其用麦当劳来举例子,他说麦当劳其实招人标准很低,高中文凭就可以,但是培养出来的人,三五年之后,每一个都是大家争抢的对象。为什么呢?因为麦当劳的标准化做的很好。其中有一个例子是说,麦当劳的汉堡,出炉之后,15分钟之后没卖掉就扔了。大家想想,如果你是领导,你如何让员工遵循这个标准?而麦当劳的解决方案说起来也简单,汉堡做出来之后就放入保温箱,15分钟后保温箱就会报警,通知餐厅经理该批次的汉堡过期了需要丢弃。
人是组织不确定性的最大来源,让人去记每个汉堡的出炉时间铁定不行。而我们做工程效能,质量保障的,也同样需要思考如何用技术手段消弭不确定性,以确保更好的做组织升维。
借此,今天就想谈谈如何通过强化Presubmit卡点模式,落地实实在在的测试左移,让提效言之有物。
PS: 针对PR(github叫法)/MR(gitlab叫法)触发的CI检查就是Presubmit模式
Presubmit卡点模式可以包含哪些检查?
- 单元测试,必须要有。行业内的基本认知,普及度很高。
- 静态检查,必须要有。每种语言都有其推荐的检查工具,建议配上。
- 集成测试/e2e,强烈建议有。
- 系统性能基准测试,如果你在Presubmit阶段,能够针对系统的核心KPI,持续自动化的做性能基准测试,用于辅助Code Review阶段的代码合入。恭喜,你当属于行业领先地位。
相信单测、静态检查,大部分项目都有,此处不表。本篇想重点谈谈为什么要在Presubmit阶段引入后几种测试类型,以及行业参考。
为什么要在Presubmit阶段跑集测、e2e、甚至性能基准测试?
笔者有以下几点认知:
- 提前发现回归问题,降低修复成本。Presubmit阶段,是研发的编码阶段,在这个阶段,如果在测试未介入的情况下,就能提供充分、即时的质量反馈,必然可以极大的提高研发迭代效率。要知道很多时候,QA和研发都是在并行工作,手上会有很多事情在排队处理。而如果一个回归缺陷在QA验收阶段才被发现,那可能已经过去一段时间了。研发需要重新将需求拾起,修复并再提测,很可能会浪费很多时间。这种情形下,隐性的成本损耗会非常大。
- 保障提测标准,建立和谐产研关系。很多QA团队都会要求研发在提测上,要有一定的质量标准。这很好,但人非圣贤,孰能无过。尤其在时间紧,任务重时,必然会发生研发自测不充分,遗漏低级问题到QA手上的情况。所以,与其主观约定,不如用自动化建立标准。
- 强化测试价值,增加曝光度 很多时候,QA同学写了很多自动化,但是业务无感,研发无感。这时候,你会发现,自动化就成了QA同学手里的玩物,不能有效交付。但是如果在Presubmit阶段就充分执行,不断执行,尤其是能早早的检测出bug时,整个团队必然会更加关注集测产物。长此以往,认可度就会比较高。
- 测试左移,真正优雅的保障入库代码质量。谈到测试左移,我看到了太多的流程范,意识流。大家很多时候会放大主观能动性,强调尽早的参与到项目早期。这一点没错,但流程还是依赖于人的值守,但人最是喜新善变。针对回归问题,如果能够建立行之有效的检测手段,必然可以极大的降低心智负担。
在Presubmit阶段落地复杂测试类型,有哪些挑战?
好处很多,但落地也非易事。
- 被测系统怎么建设? 不管是集成测试还是e2e,被测对象都是较为完整的业务系统。而要在Presubmit阶段执行起来,就需要通过代码,自动构建和部署整套系统。另,业务通常会有多个仓库,多PR/MR同时执行,所以被测环境应该是按需而起,多套并行。
- 资源哪里来? 既然是多套环境,必然会涉及到很多资源,资源哪里来,环境如何有效管理?PR合并之后是不是应该自动回收等等问题。
- 使用什么样的系统和姿势来构建? Presubmit阶段对应的是CI系统,而CI的执行必然需要足够的快。毕竟,提个PR,等十几分钟才有结果反馈,有点不雅。笔者经验认为,对于绝大部分的业务,CI要控制在10分钟以内。
其实深入分析,问题还会有很多。但是挑战即机遇,方法总比困难多。只要价值足够大,收获才能足够多。
业界有哪些可以参考的?
七牛云
七牛云比较早的开始围绕Presubmit阶段建设各种质量反馈,落地测试左移。并且还进一步做了测试覆盖率收集和受影响服务分析,以及devops建设等工作。其使用的方案和工具大部已开源,比较有借鉴价值。
PS:想进一步了解细节的同学,可以搜索 MTSC2020 Topic: 基于云原生的测试左移技术实践 by 储培
开源工具:
- github.com/qiniu/goc | go语言系统测试覆盖率收集利器
- github.com/qiniu/go_dep_search | go语言依赖分析
谷歌
谷歌建设Presubmit模式的历史由来已久,其代码大仓的工作模式,也让其在这方面多了一些推陈出新。比如通过Machine Learning / Probabilistic Safety来筛选有效的执行用例,减少Flaky tests等。具体可以参考:
- https://testing.googleblog.com/2008/09/presubmit-and-performance.html
- https://testing.googleblog.com/2018/09/efficacy-presubmit.html
往期推荐
觉得不错,欢迎关注:
构建高效Presubmit卡点,落地测试左移最佳实践的更多相关文章
- [翻译] API测试的最佳实践 - 介绍
API测试的最佳实践 - 介绍 在上一篇“是什么让API测试很叼”一文中,我们讨论API与其他形式的软件测试的差异.部分是因为API之间的通信压根就没考虑让你能读懂,纯粹是为了方便计算机之间的交互而设 ...
- Salesforce 开发整理(一)测试类最佳实践
在Sales force开发中完善测试类是开发者必经的一个环节,代码的部署需要保证至少75%的覆盖率,那么该如何写好测试类呢. 测试类定义格式如下: @isTest private class MyT ...
- 编写高效SQL最佳实践
编写高效 SQL 语句的最佳实践 秦玮, 高级软件工程师, IBM 王广成, 软件工程师, IBM 王韵婷, 高级软件工程师, IBM 简介: 本文列举了一些在编写 SQL 查询语句时可能导致 DB2 ...
- 微软构建高效DevOps团队培训总结
9.21和9.22这两天参加了微软DevOps的培训,主要是围绕TFS2015的不少新功能来讲的,相比较之前我们一直使用TFS2013来管理团队,确实强大了不少,也更加实用了. 首先,什么是DevOp ...
- 使用Nginx+CppCMS构建高效Web应用服务器
使用Nginx+CppCMS构建高效Web应用服务器 1:Why当前,越来越多的网站使用了各种框架,大部分框架使用了脚本语言.半编译语言等.比如Java.Python.Php.C#.NET等.这些框架 ...
- 使用Nginx+CppCMS构建高效Web应用服务器(之三)
使用Nginx+CppCMS构建高效Web应用服务器(之三) --充分利用服务器和客户端计算能力 欢迎测试,攻击:http://www.litelottery.com 网页右上角,选择博彩,演 ...
- 使用Nginx+CppCMS构建高效Web应用服务器(之二)
使用Nginx+CppCMS构建高效Web应用服务器(之二) 上一篇 使用Nginx+CppCMS构建高效Web应用服务器(之一) 大致介绍了网站的整体架构,实际上通过调用REST获取数据并没有实现. ...
- 使用Proxmark3进行MIFARE Classic卡的安全测试
使用Proxmark3进行MIFARE Classic卡的安全测试 Proxmark3的MIFARE安全测试是很多朋友都非常重视的一部分,所以我们特地以这个部分进行介绍,告诉大家如何当你完成前期操 ...
- 在java中构建高效的结果缓存
文章目录 使用HashMap 使用ConcurrentHashMap FutureTask 在java中构建高效的结果缓存 缓存是现代应用服务器中非常常用的组件.除了第三方缓存以外,我们通常也需要在j ...
随机推荐
- 英特尔内存革新助平安云 Redis 云服务降本增效
英特尔内存革新助平安云 Redis 云服务降本增效 英特尔 傲腾 数据中心级持久内存的引入,为平安云的降本增效开启了一条新的道路.通过对平安云 Redis 数据库产品的支持,用户能享受到性能优异且价格 ...
- springMVC源码解读笔记
1: DispatcherServlet 的初始化流程(调用的init方法) a) 初始化spring高级容器,WebApplicationContext(容器初始化12个步骤) Servlet类的i ...
- QT环境变量设置
首先找到自己对应的目录 我的如图 还有一个路径 将这两个路径添加到系统变量的Path中
- 【NX二次开发】图标图像
用户定义位图的目录位置的环境变量 UGII_BITMAP_PATH 在NX日志中查看NX图标需要设置的变量 变量名:PRINT_DIALOG_BITMAP_NAMES 变量值:1 查看系统图标的方法1 ...
- 基于kerberos的hadoop安全集群搭建
目录 前置条件 kerberos相关 给hadoop各组件创建kerberos账号 将这些账号做成keytab core-site.xml HDFS datanode的安全配置 证书生成和安装 hdf ...
- 大白话带你认识JVM
如果在文中用词或者理解方面出现问题,欢迎指出.此文旨在提及和而不深究,但会尽量效率地把知识点都抛出来 一.JVM的基本介绍 JVM 是 Java Virtual Machine 的缩写,它是一个虚构出 ...
- 【题解】codeforces 8c Looking for Order 状压dp
题目描述 Lena喜欢秩序井然的生活.一天,她要去上大学了.突然,她发现整个房间乱糟糟的--她的手提包里的物品都散落在了地上.她想把所有的物品都放回她的手提包.但是,这里有一点问题:她一次最多只能拿两 ...
- 通过ffmpeg转换为mp4格式
FFMPEG -i example.wmv -c:v libx264 -strict -2 output.mp4FFMPEG -i example.wmv -c:v libx264 -stri ...
- SpringCloud Alibaba实战(8:使用OpenFeign服务调用)
源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 在上一个章节,我们已经成功地将服务注册到了Nacos注册中心,实现了服务注册和服务发 ...
- 你的电脑适合升级 Win11 吗?「GitHub 热点速览 v.21.26」
作者:HelloGitHub-小鱼干 WhyNotWin11 是个有意思的项目,本以为是从 360 度"抨击" Windows 11 的不好用之处,但它是一个实实在在地从硬件角度告 ...