JetBrains前端团队:我们像造飞机一样测试软件
sinye56 2024-10-25 16:22 6 浏览 0 评论
在IDE界有句话"JB出品,必属精品!"。 JetBrains以其高质量的IDE在广大程序员中赢得了口碑。那么我们不禁要问,JB的高质量工具究竟是如何开发测试出来的?
对这个问题虫虫和大家一样也倍感好奇,最近JB博客揭露了其TeamCity UI前端团队软件测试的做法给我们给出了些许端倪,见微知类,从此我们终于了解了其打造精品软件的方法那就是:"像造飞机一样开发软件"。
概述
开发精品软件不容易,就像建造飞机一样,需要有天才程序员、开发流水线和测试框架。如果这一切未能就绪,检查并不断检查确认之后,软件才能发布,飞机也才能起飞。
在JetBrains,采用和造飞机同样的理念来构建软件。严格的测试可帮助最终产品发布之前发现错误和问题。就像建造飞机一样,软件开发是一个包含多个阶段的过程。产品越大,步骤和模块就越多。为了确保的软件已准备就绪,每个模块都必须经过测试并与其他模块完美集成。
CI/CD流程可以帮助自动执行此过程。最重要的是,它们消除因为人为的粗心大意而导致的故障。
与人们通常的看法相反,测试在前端开发也非常重要。就像是一架飞机,它不仅需要飞行,而且还必须坐着舒适。此外,它的外观会大大影响飞机的飞行方式。软件的前端UI也一样,必须测试其可用性、交互性和功能。
UI测试不仅涉及单元测试。还有截屏、行为、可访问性、性能、安全性和感知测试。
测试系统和CI/CD可帮助我们专注于真正重要的事情。
问题分类
在JetBrains中,它可以在多个级别上运行,并且大多数都基于CI/CD。每个测试,每个部门,每个级别都在揭示和问题报告过程中发挥作用。下面一张图表,其中Y轴表示应用程序可能存在的问题数,图上的蓝条。在X轴上显示了过滤器,问题的种类。该图反映了不同的层如何影响问题数量。
捕获的大量UI问题都属于截屏测试阶段。少部分的问题属于Linters/Unit/Render测试。当然这并不意味着这些测试就没有意义。相反,这意味着在这些领域开展了足够的工作以防止大量问题。
此处的显示关键点:质量保证部门仅面临三分之一的问题。通过使用CI/CD,可以帮助节省检查容易预测的问题的时间,这些问题可以由组织良好的测试系统发现。
当然该图表并非100%具代表性,并且发行版本之间也会变化很大,某个级别可以消除更多的问题。但是它也表明测试系统非常重要,即使单独的测试仅涵盖一种情况。
其次数量不等于质量:测试可能仅仅发现了唯一的一个错误,但是如果不引起重视,该唯一的错误可能会导致整个应用程序崩溃。
Linters, typings和单元测试
我们常说代码应该干净且一致,但这是有问题的。每个人对干净代码都有自己的理解。JetBrains内部有200多个规则,以确保其代码保持客观清晰。当Linters探测到一个问题时候,就会在IntelliJ Idea中发出告警。TypeScript,Flow,Kotlin或Reason的静态类型并不是多余的,对复杂应用程序来说是必需的。TeamCity团队使用了Flow,用于构建前端的第一个测试只是eslint/stylelint检查。其目的不光是查找代码样式问题,而且还包括变量丢失,import,non-cheap/safe操作(比如无依赖的React Hooks)等等方面问题。
当然,还有单元测试。单元测试很简单:编写纯原子函数,然后assert其输出。如果输出正常,TeamCity将其标记为绿色,并让CI管道继续执行。
截屏测试
在多个设备和平台上显示一致的UI是主要目标之一。团队需要在不使用浏览器的情况下,确保所有组件均正确显示,包括布局或视口大小。所以要测试如何以不同的配置直观显示组件。这就是截屏测试的主要工作。
其中一项更新之后,注释部分会添加到未授权代理列表中。没关系,这种测试可以揭示元素的消失。它不时就会发生,团队发现该测试非常有用。
测试步骤如下:
1. 启动呈现组件的服务器(在本例中为Storybook)。
2. 使用WebDriver API连接到服务器;API允许在没有真实用户的情况下以自动模式与网站进行交互。
3. WebDriver调用相关组件。
4. Yandex的实用工具Hermione使用WebDriver连接到Storybook,并在每个浏览器中获取所选区域的多个屏幕截图。
5. 然后将这些屏幕截图放到文件夹中,Hermione使用Mocha将其与默认屏幕截图进行比较。
6. 如果有什么变化,就发出通知。差异也以在可视化方式高亮显示。
React和渲染
通过减少不必要的渲染量可以提高接口的性能。对此, React非常擅长。但是,在某些情况下,需要注意:如果更改组件中的某些内容,React会创建一个新组件,而不是修改原始组件。
想象一下,将新的道具传递到组件中。为了节省重新渲染所需的资源,React检查所传递的道具是否与先前版本不同。如果它们相同,则不会进行任何重新渲染。然而,很多人可能会忘记在JavaScript中,两个数组或内容相同的对象是不同的实体(因为这些对象/数组将具有不同的引用)。结果,会导致不必要地对同样的组件进行了渲染。
为了解决此问题,可以对React Developer工具启用React Updates Highlighting。这样会显示应用中的所有重新渲染。例如,在光标移到趋势页面的组件上时会重新渲染。
但是如果真将这些添加应用程序将可能会触发一百次以上的渲染!
可以定使用why-did-you-render
(github/welldone-software/why-did-you-rendertests)检查冗余渲染。该组件帮助发现了很多效率低下的情况。具体步骤:
1. 创建了一个虚拟动作:它会触发对商店的更改。
2. 如果更改存储中的某些内容,将使所有组件(订阅此存储)再次收集数据。它发生在mapStateToProps回调中。
3. 收集数据后,将其传递给组件并启动比较功能以检查道具是否已更改。
4. 同时,虚拟动作实际上不会更改存储中的任何值,这样实际不会将新的道具传递给组件。
5. 如果新的道具导致组件重新渲染,就知道在不应该创建的地方创建了新的对象/数组。
为了解决这个问题的技巧,两个技巧:重新选择库和不变的数据结构。
重新选择库:
使用重新选择库,如果生成函数的所有参数都相同,则可以记住结果。如果传递的参数等于先前的参数,将不会收到新的对象,而会收到对旧对象的引用。不会进行任何重新渲染。
不变的数据结构:
可以通过冻结将对象或数组预定义为不可变的。下次,只要想返回一个预设值,就会返回该不可变对象。它保证了对该对象的引用始终是相同的,因此该组件不会被重新渲染。
快照测试
快照测试可验证是否对重要组件的结构进行了任何更改。拿飞机来类比。想象有一个飞机结构的快照:它有一个机身,一个机翼和四个喷气发动机。现在需要拆除其中一台喷气发动机,并用涡轮机代替。尽管这可能是个好主意,但它不再匹配快照。因此,就会收到通知。
如在上图中,变更是是主动的,有明显的后果。想象一下由数百个组件组成的飞机快照:跟踪所有交互非常困难。
JavaScript项目和这类似。对一个组件进行很小的更改可能会对整个项目的结构造成不良后果。可以通过创建快照来保护结构。每当打印错误,更改HTML类或添加新组件时,都会破坏结构。快照测试将通知是否这样做。
检查以下示例:
创建一个重要结构的快照,假定为IL-76LL引擎:
始终希望将未来的飞机与都会和前面的快照进行比较。
将发动机类型从涡轮风扇更改为涡轮螺旋桨发动机。只是为了测试它是如何工作的。由于新引擎不再匹配的快照,因此测试失败。将会创建一份报告,通知工程师检查该问题。
React组件与此相同:
E2E端测试
E2E测试与飞机试飞非常相似。与飞机一样,必须确保界面在现实世界中实际可用。由于成千上万的组件相互影响,永远无法在飞行员实际将飞机升空之前知道飞机是否可以起飞。
E2E测试旨在从头到尾测试应用程序流程。这些测试模拟了一个真实的用户,该用户一次又一次地通过相同的特定用例。
E2E测试流程如下:
1. 创建一个用户POV(用户故事)关键方案列表。
2. 为每个列出的方案创建一个自动化测试。
3. 这些测试中的每一个用例都描述Selenium应该如何与UI交互。
详细步骤描述:
打开浏览器。
登录。
转到第X页。
按下按钮Y。
确保显示窗口Z。
声明式描述:
"确保用户在转到页面X并开始过程Y之后获得窗口Z。"
4. 使用最后一个TeamCity实例启动Docker容器。
5. 启动测试;这些测试使用Selenium连接到Docker并执行算法。
其他测试
团队还实施了其他的一些测试,比如依赖安全审计(Dependencies Security Audit),可访问性测试,以及一些新测试类别也会陆续加入。
TeamCity和构建链
TeamCity使可以创建无限复杂的逻辑来启动测试和部署构建。这就是TeamCity如何显示其自己的UI的构建链/时间表的方式。
如图所见,TeamCity并行运行测试,因此,一些构建正在等待其他构建成功完成。而且,如果出现问题,则可能会中断整个流程,这只是为了防止浪费肯定会失败的测试资源。
下面是TeamCity如何可视化像大型项目的方式(以自己为例子):
重点是,TeamCity仅可以构建复杂的管道,而且可以良好地使它们复杂,复杂。例如,流水线的某些部分必须基于OS X代理构建,而某些则必须在Linux系统上构建,而其中的某些将要使用Amazon Cloud Agents构建。
结论
本文阐明了前端测试的基本原理和JB实践过程,包括Linters, typings,单元测试,截屏测试,React和渲染,快照测试,E2E端测试等一系列的自动化测试,像建造飞机一样,软件项目也是一项系统工程,需要严格的系统性流水线的自动测试来保证其质量,精品软件打造更是如此。
相关推荐
- 程序员:JDK的安装与配置(完整版)_jdk的安装方法
-
对于Java程序员来说,jdk是必不陌生的一个词。但怎么安装配置jdk,对新手来说确实头疼的一件事情。我这里以jdk10为例,详细的说明讲解了jdk的安装和配置,如果有不明白的小伙伴可以评论区留言哦下...
- Linux中安装jdk并配置环境变量_linux jdk安装教程及环境变量配置
-
一、通过连接工具登录到Linux(我这里使用的Centos7.6版本)服务器连接工具有很多我就不一一介绍了今天使用比较常用的XShell工具登录成功如下:二、上传jdk安装包到Linux服务器jdk...
- 麒麟系统安装JAVA JDK教程_麒麟系统配置jdk
-
检查检查系统是否自带java在麒麟系统桌面空白处,右键“在终端打开”,打开shell对话框输入:java–version查看是否自带java及版本如图所示,系统自带OpenJDK,要先卸载自带JDK...
- 学习笔记-Linux JDK - 安装&配置
-
前提条件#检查是否存在JDKrpm-qa|grepjava#删除现存JDKyum-yremovejava*安装OracleJDK不分系统#进入安装文件目...
- Linux新手入门系列:Linux下jdk安装配置
-
本系列文章是把作者刚接触和学习Linux时候的实操记录分享出来,内容主要包括Linux入门的一些理论概念知识、Web程序、mysql数据库的简单安装部署,希望能够帮到一些初学者,少走一些弯路。注意:L...
- 测试员必备:Linux下安装JDK 1.8你必须知道的那些事
-
1.简介在Oracle收购Sun后,Java的一系列产品就被整合到Oracle官网中,打开官网乍眼一看也不知道去哪里下载,还得一个一个的摸索尝试,而且网上大多数都是一些Oracle收购Sun前,或者就...
- Linux 下安装JDK17_linux 安装jdk1.8 yum
-
一、安装环境操作系统:JDK版本:17二、安装步骤第一步:下载安装包下载Linux环境下的jdk1.8,请去官网(https://www.oracle.com/java/technologies/do...
- 在Ubuntu系统中安装JDK 17并配置环境变量教程
-
在Ubuntu系统上安装JDK17并配置环境变量是Java开发环境搭建的重要步骤。JDK17是Oracle提供的长期支持版本,广泛用于开发Java应用程序。以下是详细的步骤,帮助你在Ubuntu系...
- 如何在 Linux 上安装 Java_linux安装java的步骤
-
在桌面上拥抱Java应用程序,然后在所有桌面上运行它们。--SethKenlon(作者)无论你运行的是哪种操作系统,通常都有几种安装应用程序的方法。有时你可能会在应用程序商店中找到一个应用程序...
- Windows和Linux环境下的JDK安装教程
-
JavaDevelopmentKit(简称JDK),是Java开发的核心工具包,提供了Java应用程序的编译、运行和开发所需的各类工具和类库。它包括了JRE(JavaRuntimeEnviro...
- linux安装jdk_linux安装jdk软连接
-
JDK是啥就不用多介绍了哈,外行的人也不会进来看我的博文。依然记得读大学那会,第一次实验课就是在机房安装jdk,编写HelloWorld程序。时光飞逝啊,一下过了十多年了,挣了不少钱,买了跑车,娶了富...
- linux安装jdk,全局配置,不同用户不同jdk
-
jdk1.8安装包链接:https://pan.baidu.com/s/14qBrh6ZpLK04QS8ogCepwg提取码:09zs上传文件解压tar-zxvfjdk-8u152-linux-...
- 运维大神教你在linux下安装jdk8_linux安装jdk1.7
-
1.到官网下载适合自己机器的版本。楼主下载的是jdk-8u66-linux-i586.tar.gzhttp://www.oracle.com/technetwork/java/javase/downl...
- window和linux安装JDK1.8_linux 安装jdk1.8.tar
-
Windows安装JDK1.8的步骤:步骤1:下载JDK打开浏览器,找到JDK下载页面https://d.injdk.cn/download/oraclejdk/8在页面中找到并点击“下载...
- 最全的linux下安装JavaJDK的教程(图文详解)不会安装你来打我?
-
默认已经有了linux服务器,且有root账号首先检查一下是否已经安装过java的jdk任意位置输入命令:whichjava像我这个已经安装过了,就会提示在哪个位置,你的肯定是找不到。一般我们在...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle忘记用户名密码 (59)
- oracle11gr2安装教程 (55)
- mybatis调用oracle存储过程 (67)
- oracle spool的用法 (57)
- oracle asm 磁盘管理 (67)
- 前端 设计模式 (64)
- 前端面试vue (56)
- linux格式化 (55)
- linux图形界面 (62)
- linux文件压缩 (75)
- Linux设置权限 (53)
- linux服务器配置 (62)
- mysql安装linux (71)
- linux启动命令 (59)
- 查看linux磁盘 (72)
- linux用户组 (74)
- linux多线程 (70)
- linux设备驱动 (53)
- linux自启动 (59)
- linux网络命令 (55)
- linux传文件 (60)
- linux打包文件 (58)
- linux查看数据库 (61)
- linux获取ip (64)
- linux进程通信 (63)