learn-tech/专栏/JavaScript进阶实战课/34测试(三):非功能性测试.md
2024-10-16 06:37:41 +08:00

122 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

因收到Google相关通知网站将会择期关闭。相关通知内容
34 测试(三):非功能性测试
你好,我是石川。
上节课我们学习了功能类测试。今天我们来看一下非功能性测试中的性能、安全和辅助功能测试。对于一个Web应用而言性能测试的复杂程度并不低于后端或端到端的测试。导致前端性能测试复杂度很高的主要原因是影响Web应用性能的因素有很多并且很多是应用本身不完全可控的。所以今天我们重点来看一下关于性能测试都有哪些指标、影响性能的因素和性能调优的方式。
性能测试
在任何测试前我们都需要对要达到的目标有清晰的认识针对性能测试也不例外。所以首先我们要来看看对于Web应用来说都有哪些性能指标。
性能指标
之前我们说过JS虚机开发中做内存管理和优化的时候会关注浏览器和应用的流畅度smoothness和响应度responsiveness。其实对于JS应用的开发者来说也可以参考类似的 Rail 指标。Railresponse, amination, idleload是响应、动效、空闲和加载这4个单词的缩写。下面我们来分别看下它们所代表的意义。
关于响应原则是我们的应用应当在50ms内处理响应并且在50-100ms内提供一个可见的响应
关于动效如之前讲过的在处理渲染时我们的帧预算是每秒60帧也就是每帧要控制在16.6ms内渲染完成;
关于空闲无论是在加载模式还是垃圾回收的一讲中我们都提到过应该最大化地利用空闲时间但是这里需要注意的是这个利用也需要一个度如果利用这个时间需要处理的任务超过了50ms就会影响我们第一点说的100ms内的响应
关于加载对于页面的加载而言我们的应用应该尽量在5秒内完成初次加载并且在2秒内完成后续页面的加载。
影响性能的因素
说完了测试指标我们再来看看影响Web性能的因素。前面我们说过影响性能的因素是错综复杂的。从大的种类来看其中就包括了但不限于网络环境、资源的加载和浏览器渲染等外在因素以及内存管理、垃圾回收等内在因素。
面对这么多的因素如果完全通过手动的方式来做性能测试会非常耗费时间和精力而且要把这些测试的结果叠加转换成上述指标又会是一个繁琐的过程。为了解决这个问题大多的浏览器都提供了开发者工具帮助我们进行这些测试。以Chrome为例我们可以用到的就有Lighthouse和Performance Insights两个工具。
性能测试工具
首先我们可以看下Lighthouse。在开发者工具的 Lighthouse 页签下我们可以选择性能检测的选项。从检测的结果中我们可以看到之前提到的在渲染和加载中关注的FCP、TTI等指标。同时我们可以看到一些性能诊断的建议比如减少过多的DOM节点、针对静态资源使用高效的缓存策略。同时我们可以验证一些已经优化项比如压缩后的JS和CSS文件。
但是上述的结果中我们得到的基本上是一个个的数字对加载过程中的时间分布没有直观的感受。而通过性能洞察Performance Insights的页签我们可以更直观地基于页面实际的使用场景让页面加载的过程中产生的耗时在一条时间线上展示出来。这样我们可以更直接地对一些性能瓶颈做分析判断和优化。
性能瓶颈排查
上面我们通过Lighthouse和Performance Insights可以很好地对外在因素做分析。可是针对一些内存管理和垃圾回收类的问题就无从知晓了。所以我们可以看到表象但无法分析后面的根因。这个时候我们就需要对内存管理有深入的分析工具。Chrome同样在开发者工具中提供了相应的分析排查工具。
首先,我们可以通过更多工具->任务管理进入到内存管理的窗口在这里我们可以看到内存列展示的内存使用情况。这时如果我们右键选择JavaScript Memory也可以同时加载出JS的内存使用信息。那么Memory和JavaScript Memory这两列有什么区别呢
这里的区别是Memory中包含的是我们的页面产生的DOM元素。而JS Memory包含的是JS生成的对象的数量和括号中包含的目前有的存活的对象数量。如果这里的数量过高则需要进一步排查。
在排查的过程中,我们可以从空间和时间的维度来分析。
首先从时间的维度我们可以通过开发者工具中的性能页签Performance Tab来做性能分析。在这里我们可以勾选内存选项然后选择录制并且在开始和结束的时候通过点击垃圾桶的标志各做一次垃圾回收来避免来自测试时间段以外的干扰。
在结果的总览窗口中heap图表示的是JS的堆概览下方是计数器窗口。在这里你可以看到按JS堆、节点和GPU内存等细分的内存使用情况。如果此时我们看到随着记录的进行结尾处的JS堆或节点的数量高于开始处则意味着过程中可能存在着内存泄漏。
另外通过内存页签Memory Tab我们可以通过空间的维度来分析性能瓶颈。对于浏览器而言只有当DOM节点在页面的DOM树或JavaScript代码中没有被引用时才会被垃圾回收。当节点从DOM树中被移除但仍然被一些JavaScript引用时这些节点就被称为“脱离DOM树的节点”。脱离DOM树的节点是造成内存泄漏的常见原因。
堆快照是识别分离节点的一种方法。顾名思义堆快照向我们展示了在快照时页面的JS对象和DOM节点之间的内存分布情况。在内存页签中我们可以看到JS堆快照的选项它可以帮助我们了解页面上JS对象和相关DOM节点的分布。
在获取快照后在对象类型的筛选器中通过“detached”关键词我们可以搜索脱离DOM树的节点。这时我们可能会看到红色和黄色两种节点。而我们需要关注的是黄色节点因为它们是直接被引用的节点在使用后需要被及时回收它们的回收会顺带删除下面被间接引用的红色节点。
另外我们也可以通过JavaScript内存分配的时间线从时间的维度来看对象的内存分配排查内存泄漏点。
安全测试
说完性能测试,我们再来看看安全测试。在网络的安全测试中,主要包含渗透测试和漏洞扫描。
渗透测试可以是黑盒或白盒的,也就是扮演入侵者的测试人员通过前端提供的测试环境和相关开发出来的应用来测试。在黑盒的情况下,入侵者默认没有代码访问,通过尝试,试图渗透到系统内部。
而漏洞扫描通常是白盒测试,比如很多的云服务厂商都会支持代码托管,在这个基础上,一般会附加漏洞扫描的测试工具。在这个扫描的过程中,负责自动测试的程序可以访问代码库中的代码,并对代码进行扫描,从中发现漏洞。
无论是渗透测试,还是漏洞扫描,这两种测试都是在软件工程中由专门的测试人员或云平台提供的工具来执行的,所以我们就不在开发测试这里展开讲了。
下面我们就从开发的角度看看我们在程序开发中可以做哪些初步的测试。之前我们也讲过前端开发过程中可能会遇到的安全问题和解决方案并且在讲到HTTP的时候我们也了解了由传输层安全TLS和安全套接层SSL组成的HTTPS。所以从前端如何测试安全连接呢
这里我们同样可以通过浏览器提供的开发者工具。以Chrome为例在安全页签Security Tab看到的主源的安全证书和连接的安全性以及相关的资源的安全性可以帮助我们对安全问题做初步的排查。
辅助功能测试
说完了安全,下面我们再来看看辅助功能测试。
辅助功能在很多欧美的网站是很重要的一个功能,它允许一些残障人士通过辅助功能浏览我们开发的页面。这里包含了色弱症、色盲症和失明的人等,他们按道理也应该可以无障碍地访问我们所开发的页面。在开发辅助功能时,我们一般要考虑两个问题,一是用户是否可以用键盘或屏幕阅读器浏览页面,二是页面元素是否为屏幕阅读器做了正确标记。
这里插播一条数据信息当我们说到视障人士大家可能会觉得这部分人群的比例很低但实际上中国视障群体超过1700万其中超过800万人完全失明。另外一个经常被忽略的群体是色盲或色弱的群体中国色弱人数有6000多万色盲人群有2000多万加在一起又是惊人的8000万人。也就是说光在国内上亿人可能都会因为我们的页面没有辅助功能而没法正常访问相关的内容。
开发对这部分人群友好的应用,不仅对大公司来讲是企业责任,即便是从功利的角度来看,这部分人群也是购买我们服务或产品的潜在客户。而越是访问量高的网站,要面对的这个群体就越大。如果我们对这部分用户不加以重视,那影响的不仅是声誉,也是我们的业务。所以无论是从社会发展进步的角度,还是市场角度,我们都应该尽可能为这部分用户提供相关的功能和测试。
色盲或色弱的人群所面临的主要困扰是无法分辨一些对比度较低的颜色。那么我们怎么能对这部分用户选用更友好的界面颜色呢我们可以参考相关的指导性的技术标准WCAG这是一部内容无障碍指南。其中一共有3级A级是残障用户能够访问和使用Web内容的基本要求AA级表示了内容总体可访问并消除了访问内容的较大障碍AAA级为一些残障用户提供了网络辅助功能的改进和增强。
还是以Chrome开发者工具为例在 CSS 总览页签CSS Overview Tab下面我们可以在对比度问题上看到对比度有问题的字体和背景。比如在下面的例子中我们可以看到当文字的灰色和背景的灰色相差不多的时候是没有达到AA标准的而基于蓝色背景的白色字体达到了AA标准但是相比较AAA还是差一些。
另外除了CSS总览页签外在开发者工具中我们也可以通过在Lighthouse页签中勾选辅助功能来对网站做审计。通过审计我们可以看到通过的结果、需要额外手工查看的问题以及在本次测试中不适用的测试用例。
总结
通过这一讲我们看到如何在开发中针对非功能性的性能、安全、辅助功能做测试。而通过测试的这三讲我们也知道了需要关注的是在开发过程中测试的重要性。从功能性测试中我们了解了测试并不是一项开发后丢给测试人员的工作而是测试驱动下“以终为始”的起点。从非功能测试的角度我们可以看出基于JavaScript开发的前端应用无论从性能、安全还是辅助功能角度都有很多的容易被忽视的问题而单独靠手工的测试无法有效地解决这些问题。这时就需要借助工具来帮助我们提高测试的效率。
思考题
之前我们说过在JavaScript的多线程开发中会用到ArrayBuffer和SharedArrayBuffer。那么你知道如何通过浏览器提供的工具或独立的开发者工具来分析、排查和解决多线程开发中的性能问题吗
欢迎在留言区分享你的经验、交流学习心得或者提出问题,如果觉得有收获,也欢迎你把今天的内容分享给更多的朋友。我们下节课再见!