再谈测试

简介: 再谈测试

2022年的钟声已经响过,1972年出生的我已经在这个世界上度过了整整半个世纪,时间如流水,都去哪了?好像昨天还刚刚从大学的校门走出,可是当时刚从大学殿堂呱呱落地的婴儿,现在都变成了IT界的主力军。我的称谓也由以前的同学、男孩,小顾变成了现在的大佬、大咖,甚至是老前辈,好多人认为我很成功,好厉害,但是我自己知道我仅仅比现在的IT从业人员大几岁,多吃了几口盐,多过了几座桥罢了。


好吧,废话少说,我再和大家结合现在的情况谈谈软件测试,现在的软件测试和当年的软件测试不可同日而语,我当年进入测试部门正因为我的首任CTO是海归派,他与他的夫人当时都在美国硅谷学习和工作,他从事软件研发,而他的夫人从事软件测试,正因为他夫人的“教导”,使得他感觉到软件测试的重要性,所以在我们公司中开辟了独立的软件测试部,并且多次邀请他的夫人来公司作关于软件测试方面的普及,我也因为当时在软件测试方面表现出的特有气质,当选了软件测试部的部门经理,从而走上了软件测试之路,这一走就是整整20年之久,甚至会更长。后来回到上海,和李波、王威、周峰筹建了51testing,即现在的博为峰软件优先公司。博为峰软件优先公司在近15年内一直处于业界的领先地位,记得当时有个叫领测的公司也被它打败了。2015年开始,testwotestintesthome开始起来,Tid测试会议、QEConMTSC各种大会也纷纷起来。中国的软件测试行业由一家独掌的局势变成了百家争鸣的局势。随着BATTMD以及国外互联网公司的进入,出现了许多类似于茹炳晟、金鑫、熊志男、黄延胜、恒温、刘冉、刘琛梅、陈晓鹏、孔德晋、陈磊、赵明等一批优秀的软件测试人才,真是可喜可贺啊。

好,主题上场,我来谈谈我对现在软件测试的一些看法。


1 软件测试左右移


1)软件测试左移


a) 黑盒测试


关于软件测试的左移其实我在2001年刚刚从事软件测试的时候就提到过。当时我们开发了一个中国电信牵头的,名为“网上商品交易会”的项目(可惜这个最后放弃了,否则可能成为中国第一个B2B的平台),在这个系统中,包含了展会、展商、展位、展品几个实体,一个展会由多个展商参加;一个展商有多个展位(比如格力,包括家庭电器展位和办公电器展位)、一个展位下包括多个展品。我们测试人员在一开始就设计了这么一个测试用例:删除展位,试图查看展位下的展品;删除展商,试图查看展商下的展位和展品;删除展会,试图查看展会下的展商、展位和展品。大家如果学习过关系数据库,就会知道这属于关系型数据库的主外键关系。但是这个产品的产品架构师不太鼓励在数据库中加上外键锁,希望程序员在程序中进行控制。可是程序员在开发代码的时候,由于产品架构师没有过于强调,就把这个验证给忽略了,最后在项目末尾,出现了展品找不到展位、展位找不到展商、展商找不到展会这样的尴尬情形,只好打回,延期发布。如果在测试工程师书写完毕测试用例,由开发与测试一起坐下来进行一次测试用例评审,或者把这部分测试用例让开发测试工程师作为自测用例来执行,是不是就可以提前发现这个问题呢?记得济南的李龙同学提出了川模型软件测试模型,我在这里结合这个模型提出了洋葱软件测试模型,如下图:


image.png


最里面为冒烟测试用例,外面为开发自测用例(研发开发完产品代码,需要自己运行一次冒烟测试用例和自身相关的自测用例),外面是验收测试用例。最外面为所有测试用例,当然这些测试用例可以是手工的,也可以是自动化的。


b) 白盒测试


白盒测试包括静态白盒测试和动态白盒测试,在测试左移中,白盒测试起着至关重要的作用,我个人认为嵌入式软件是最难测的软件,而这种软件最重要的是做好白盒测试。对于静态白盒测试(包括Code Review和代码扫描),在这方面测试人员真的不具备优势,让专业的人作专业的事,所以这个我认为还是让开发人员自己来完成;动态白盒测试往往通过书写单元测试代码来实现,由于测试人员具有独特的逆向、系统、变向等思维能力,我认为应该让测试人员参与单元测试的设计。我当时在从事机顶盒软件测试产品,我们的CTO真是这样要求我们的,测试一个函数,对于函数中变量的空值,0值,非法值、边界值,开发人员开始都是不考虑的。由于有测试人员与开发人员的共同参与,我们当时机顶盒的质量是非常高的(这算不算结对测试),可惜的是后来清华与上海交大争夺机顶盒的标准权(一个信号强,但是覆盖率低;另一个信号弱,但是覆盖率高),搞得两败俱伤,最后被IP TV取代,真是鹬蚌相争,渔翁得利啊(所以质量好,不代表销售就好,这需要公司各方面的努力)。


2)软件测试右移


在我刚毕业的年代,软件测试右移是想都不敢想的,现在随着分布式、大数据和人工智能的发展,使得软件测试右移成为了可能。软件测试右移说白了就是在生产环境中进行软件测试。下面来介绍一下测试右移下的几种技术(特别强调一点,在在线测试中,监控和告警是非常重要的):


a) 灰度发布(又叫金丝雀发布)


在英国,由于金丝雀对瓦斯极为敏感,矿井工人携带金丝雀,以便及时发发现危险。在分布式系统中,我们可以通过将不太确定的新版本软件反挂在分布式系统的一个节点上,让少部分用户来使用,通过监控和告警来及时发现问题。当所有问题都解决了再逐步扩展新版本的发布。


image.png


在这张图中,绿色的为新版本,10%的用户使用这个版本,当所有问题都解决了,可以把新版本扩大到30%50%80%停顿一段时间,从而验证性能质量。


b) 全链路压测


在全链路压测中,分离测试数据和测试链路,测试数据放到影子库和影子表中,对试链路进行染色;测试完毕必须复原,删除测试数据和测试链路;当全链路测试过程中发现了问题,需要有良好的灾备机制,在灾备机制下,精确记录故障原因,并且尽快把环境恢复正常。


c) 流量回放技术


收集线上的流量数据,在线下回放。


d)混沌工程


混沌工程(Chaos Engineering)是在分布式系统上进行实验的学科,通过主动制造故障,测试分布式系统在各种异常情况下的行为,对系统稳定性进行校验和评估,识别并修复故障问题,进而建立对系统抵御生产环境中失控条件的能力和信心。


image.png


这里强调一下,混沌工程与故障注入法的区别:

故障注入法:是指当故障注入后,应该发现什么事故,是固定的。

混沌工程:是指当故障注入后,什么事故会发生,是未知的。


在《性能之巅》一书提及到已知的已知;已知的未知;未知的未知。对于缺陷而言:已知的已知,即已经被发现的缺陷;已知的未知,即已经知道操作后可能会出现的缺陷;未知的未知,即不知道什么操作后是否存在缺陷。所以故障注入法是发现已知的未知缺陷;混沌工程是发现未知的未知缺陷。但是混沌工程不是随意进行的(据说当年切尔日核电站爆炸,就是在一次类似于“混沌工程”演练后发生的)。


混沌工程实施规范


1. 建立一个围绕稳定状态行为的假说(Build a Hypothesis around Steady State Behavior

2. 多样化真实世界的事件Vary Real-world Events

3. 在生产环境中运行实验Run Experiments in Production

4. 持续自动化运行实验Automate Experiments to RunContinuously

5. 最小化爆炸半径Minimize Blast Radius

以前我在大学里面学习软件工程,主要批判大棒模型,鼓吹瀑布模型,而现在瀑布模型遇到淘汰,在敏捷思想提出后,各种Ops思想运运而生,下面简单来给大家介绍一下。


2 XxxOps


1) DevOps


2009 Velicity大会,全球大型图片分享网站Filckr的运维部经理John AllspawPaul Hammond分享,每日10次部署:DevOpsFilckr的协作。DevOps之父:Patrick Debois在比利时首次发起DevOpsDay活动。


image.png


许多人不太理解DevOps之间的关系,看了上面这张图,大家就能一目了然了。


DevOps六大武器

  • 标准化作业:pipline
  • 快速失败(Fast Fail
  • 快速反应
  • 高质量与高效率
  • 降低成本
  • 团队协作(研发、运维、测试)


DevOps七个阶段

  • 持续开发:计划、编码。工具:代码仓库、版本控制、包管理、甘特图、燃尽图。管理:分支管理、单元测试。
  • 持续集成:频繁提交代码->频繁编译代码->频繁构建项目->频繁单元测试->频繁集成(快速失败)
  • 持续测试
  • 持续监控:各项工作的监控
  • 持续反馈
  • 持续部署
  • 持续运营:事件和变更配置管理、容量管理、高可用管理、用户体验管理。


2)DevSecOps


 将软件安全贯穿于软件开发始终。

      2012 著名IT研究机构Gartner公司DevOps报告:DevSecOpsCreating the Agile Triangle提出DevSecOps概念。

   2016Gartner公司:DevSecOpsHow to Seamlessly Interate SecurityInto DevOps.(如何将安全性无缝集成到开发平台中)更加阐述DevSecOps概念


安全相关的成熟度模型

  • 软件安全构建成熟度模型(Building Security InMaturity ModeBSIMMl)
  • 软件保证成熟度模型(Software AssuranceMaturity Model,SAMM)
  • 安全开发生命周期模型(Security DevelopmentLifecycle,SDL)
  • 运维安全保障模型(Operational SecurityAssurance,OSA


软件安全工具

  • 动态应用安全测试(Dynamic ApplicationSecurity TestingDAST):
    开源的Zed AttackProxy (ZAP)AcunetixWVS,Burpsuite,OWASP ZAP,长亭科技X-Ray,w3af

  • 静态应用安全测试(Static Application SecurityTesting ,SAST):
    KlocworkHelix QACHCL AppScan、国内的腾讯xcheckWukong(悟空)、Coverity,Checkmark FindBugs,CodeQL,ShiftLeft inspect

  • 交互式应用安全测试(Interactive ApplicationSecurity TestingIAST):
    CodeDxCheckmarx  CxIASTContrast Secutity,默安LAST,玄镜。IAST相当于是DASTSAST结合的一种互相关联运行时安全检测技术

  • 软件成分分析(Software Composition AnalysisSCA):
    Synopsys Black DuckRedRocket-SCAX-raySonatypeIQServerDependencies Check


3)DevPerfOps


将软件性能质量贯穿于软件开发始终。


4) AIOpsAritificial Intelligence for ITOperation


AI来辅助运维,

整合大数据和机器学习,通过松耦合、可扩展方式去提取和分析在数据量(Volume)、种类(Variety)、和速度(velocity)这三个方面不断增长的IT数据,为所有主流的IT运维管理(IT Operations Management, ITOM)产品提供支撑。


AIOps关键技术

  • 数据采集
  • 数据处理
  • 数据存储
  • 数据分析
  • AIOps算法


AIOps应用场景

  • 保障运营
  • 异常检查
  • 故障诊断
  • 故障预防
  • 故障自愈


  • 成本优化
  • 资源优化
  • 容量规划

          性能优化


  • 效率提升
  • 智能预测
  • 智能变更
  • 智能问答
  • 智能决策

5) DataOps


用大数据支持运维。主要是用把线上日志作为大数据来进行分析处理,在这里我特别要提一下Splunk软件,这个工具非常强大,唯一的缺陷就是价格也非常的昂贵。

正像瀑布模型取代大棒模型、敏捷、DevOps取代瀑布一样,随着技术和管理进步,以后肯定有一门新的技术取代敏捷、DevOps,我估计可能是人工智能技术。但是人人就是主体,如何利用软件工程化为以人为主导软件项目,人的要素始终是最重要的。


3 自动化软件测试


关于自动化软件测试,在DevOps下是非常重要的,在以前几年业界讨论也是非常热烈的,我也写过许多类似的文章,业界甚至出现的软件测试就是软件自动化软件测试的怪圈,还好这几年这个怪圈回归了理性。总之,自动化软件测试不是万能的,但是没有自动化软件测试是万万不能的。由于以前这方面讲述了很多,在这里不再进行详细展开。


4 基于技术的软件测试


1)性能测试


关于性能测试,可以说上三天三夜,在这里我特别需要指出得到是,在线下,特别是第一次性能测试,必须需要给一个相对独立网段的测试环境,如果测试环境与研发环境在同一网段(前几天刚刚给一家企业作测试咨询,他们竟然在WiFi环境下进行性能测试),在这种环境下进行测试,由于网络的抖动性是非常不确定的,一方面影响大家的工作,另一方面测试出来的数据也是不完善的。


2)安全性测试


大家都认为安全性测试是非常困难的,就测试而言,安全测试是非常容易的,参看下表:


注入类型

测试方法

XSS注入

输入"onclick=alert(/XSS/)//--><script>alert(/xss/);</script>  <!—

,观察JS代码是否会被激活

CSRF

拷贝form表单在本地HTML文件中,去掉js验证,修改action为绝对地址,观察表单是否可以提交

点击挟持

目前基本上不可能存在

HTML5

<audio><video><image> href=中引入外部的js代码或文件

iframe安全性,防止href=中引入外部的js代码或文件

检查a标签的rel="noopener noreferrer" 属性

获取地理坐标:需要得到用户允许

本地存储:防止存储恶意代码

SQL注入XPath注入

GET请求,如果URL中出现id=数字,修改数字的值,观察请求是否成功

POST请求,通过1=1HTML闭合观察请求是否成功。

一般而言,开发如果在访问数据库的时候,使用预编译机制,SQL注入是可以防范的。

XML注入

插入XML代码,比如<name>Jerry</name>,观察是否会被写入xml文件中

JSON注入

插入JSON代码,{"name": "John  Doe", "age": 18, "address": {"country" :  "china", "zip-code": "10000"}},观察是否会被写入json文件中

文件上传

防止exe,php,jsp等可执行文件上传,如果可以上传,不要给执行权限

命令行漏洞

如果系统中要认为执行命令行,检查执行命令者的权限,当然要避免越权执行发生。

XXE

如果系统中不存在外部XML实体,XXE是不会出现的,否则进行对应测试

HTTP参数污染

?name=jerry&name=<script>alert(/xss/);</script>或者?name=<script>alert(/xss/);</script>&name=  jerry


对于与业务相关的安全测试,需要根据对应的业务,做好测试。


5软件测试分析与设计


特别提出软件测试分析与设计是作为一个软件测试工程师的看家本领,在这里我介绍两本书,一本是邰晓梅女士书写的《海盗派测试分析 MFQ&PPDCS》,另一本是刘琛梅女士书写的《测试架构师修炼之道》


6,精准测试


精准测试是我特别崇拜的一门技术,发明者是苏州洞察云科技有限公司的赵明先生(现在精准测试提及很多,但是提及赵明非常少,我深感不解,难道在中国软件行业内内卷是如此厉害)。


利用精准测试,我们可以做到:

  1. 发现软件缺陷可以精准定位到所在缺陷的近N条代码,便于调试;
  2. 为回归测试做到精准定位。版本N+1与版本N哪些代码受到了影响,哪些不受到影响;哪些测试用例需要回归,哪些不需要;
  3. 对测试人员的工具进行有效的度量,这些用例覆盖了哪些代码?哪些代码还没有用例覆盖


8Model-Based Testing


基于模型的测试(Model-Based TestingMBT)我个人不太看好,不详谈。


9,对目前比较关注的测试问题


最后对目前比较关注的测试问题阐述我的人的观点

1)如何在短时间内执行测试

第一:基于深度优先的策略执行优先级高的测试用例;

第二:开展探索式测试,根据缺陷的80/20原则,对80%产生缺陷的模块进行强力测试


2)哪些用例需要写测试用例,哪些不需要

a,用户用例中提及的基本测试(正向、反向)的功能需要书写测试用例。

b,上面提及的洋葱软件测试模型内三层冒烟测试、开发自测、验收测试需要书写测试用例。

c,其他根据情况书写或不书写测试用例


3)哪些需要书写自动化测试用例

a) 保证这个用例执行次数超过5次,必须书写测试用例。

b) 同一缺陷被修复在其他版本中又发现(非合并出现的问题),必须书写测试用例。

最后祝大家工作顺利,生活愉快。

相关实践学习
基于MaxCompute的热门话题分析
Apsara Clouder大数据专项技能认证配套课程:基于MaxCompute的热门话题分析
目录
相关文章
|
网络架构 网络协议
|
Kubernetes Ubuntu 安全
Linux|科普扫盲帖|配置网络软件源---阿里云镜像仓库服务使用(centos,Ubuntu)
Linux|科普扫盲帖|配置网络软件源---阿里云镜像仓库服务使用(centos,Ubuntu)
4551 0
|
9月前
|
人工智能 数据挖掘 API
Kimi K2开源炸场,1万亿参数碾压GPT-4.1,成本仅Claude 4的1/5!
月之暗面开源的万亿参数大模型Kimi K2引发行业震动,48小时内即登顶OpenRouter API调用榜,GitHub项目激增200%。该模型在代码生成、Agent任务及中文创作上超越Claude 4,标志着中国大模型首次在三大核心能力上达到全球顶尖水平。
|
数据采集 消息中间件 人工智能
AI Agent:构建以数据为中心的智能体
在过去一年里大模型领域主要有两大领域的热点,一个是 LLM,几乎每月速度革新,大家关心的是效果和成本。另一个是 AI Agent,大家尝试解决各个领域应用问题,大家关心的是场景和竞争力。下面我们重点分享一下 AI Agent 的趋势和实践。
2056 14
|
供应链 安全 芯片
台积电7nm芯片断供影响分析:中国大陆半导体产业的挑战与机遇
近日,有关台积电可能断供中国大陆7nm芯片的消息引发了业界的广泛关注。这一事件不仅关系到全球半导体供应链的稳定性,也对中国大陆半导体产业的发展提出了新的挑战。本文将探讨这一事件背后的原因、可能的影响以及中国大陆半导体产业的应对策略。
876 0
|
JavaScript 前端开发 编译器
vue 代码高亮 prismjs 或 highlight.js插件的用法
vue 代码高亮 prismjs 或 highlight.js插件的用法
1089 0
|
Shell Linux API
C语言在linux环境下执行终端命令
本文介绍了在Linux环境下使用C语言执行终端命令的方法。首先,文章描述了`system()`函数,其可以直接执行shell命令并返回结果。接着介绍了更强大的`popen()`函数,它允许程序与命令行命令交互,并详细说明了如何使用此函数及其配套的`pclose()`函数。此外,还讲解了`fork()`和`exec`系列函数,前者创建新进程,后者替换当前进程执行文件。最后,对比了`system()`与`exec`系列函数的区别,并针对不同场景推荐了合适的函数选择。
|
SQL 数据可视化 定位技术
见证数据的视觉奇迹——DataV Atlas
阿里云DataV的DataV-Atlas是一款专注于地理数据可视化的工具,提供时空数据分析和地图发布功能,适合快速创建地图并分享。与ArcGIS Server相比,DataV.GeoAtlas更侧重于数据可视化和云服务集成,适合非专业用户,而ArcGIS Server是全面的GIS服务平台,适合复杂分析和定制化应用。用户可通过阿里云免费试用DataV-Atlas,体验包括数据上传、地图制作和分析在内的功能。
见证数据的视觉奇迹——DataV Atlas
|
XML 编解码 前端开发
wkhtmltopdf 代替 itext 将 url 转成 pdf
wkhtmltopdf 代替 itext 将 url 转成 pdf
322 0