测试,没有分析与设计就失去了灵魂;
测试人员在编写用例之前,该如何进行测试分析与设计呢?上次在《测试的底层逻辑》中讲到了【输入输出测试模型】,还讲到了【2W+1H测试分析法】,但2W1H分析法是初步的分析方法,具体在测试中如何落地,还需要更细的设计。
今天就给大家介绍一下由测试领域专家James Batch总结的测试分析与设计模型,HTSM启发式测试策略模型。
HTSM是一套测试思路启发的方法,旨在帮助测试人员更好地思考测试策略,指导测试人员在进行测试分析和设计的时候如何去思考,思考哪些点。HTSM包括四个重点领域:测试技术、项目环境、产品元素和质量标准。James Batch建议:你可以随意地使用它们,它对任何类型的软件都是通用的,另外在落地应用的时候,建议根据实际场景调整模型的内容,以适应自己的组织环境。
James Batch原文解释:The Heuristic Test Strategy Model is a set of patterns for designing and choosing tests to perform. The immediate purpose of this model is to remind testers of what to think about during that process.
下面是HTSM和2W1H分析法进行的对比,通过对比可以看出HTSM可以与2W1H进行对应,通过分析项目环境,了解为什么测试这个项目,了解项目背景;通过分析产品元素,确定了我们的测试范围,明确我们要测什么;然后通过测试技术和质量标准指导了我们该怎么去测。
在HTSM模型中,项目环境、产品元素、质量标准、测试技术每一项都列出了很多子项;其中【项目环境】和【产品元素】不需要按照模型提供的子项进行全量的分析,所以大家可以作为参考,挑选对自己有用的信息进行分析即可。
我也会结合自己的经验增加一些内容;【质量标准】和【测试技术】参考的价值会更大一些,我对原文进行了详细的翻译;因为只是模型,所以作者也不会对每一种测试方法或测试标准进行详细的讲解说明,只是作者根据他的经验进行的总结,大家都可以结合自己的经验总结更具体的方法;但测试技术和质量标准的每一个子项是可以作为测试人员进行测试设计的参考标准,质量标准也可以参考ISO9126软件质量模型。
总之,模型不是详细的知识讲解,而是指导大家进行测试分析和设计的思路方法集合。
下面分别讲解HTSM的四个领域:项目环境、产品元素、质量标准、测试技术。大家也可以按照这个顺序去使用HTSM,按照2W1H的方法去分析,参考HTSM提供的子项和经验,最终形成完整的测试方案。
项目产生背景: 为什么要做这个项目?项目产生的背景原因是什么?
所解决的问题: 这个项目解决了什么问题?
通过了解背景,能够更好的帮助我们分析需求,了解最原始的需求和目的;了解了最原始的需求,才能去分析PRD中的功能设计是否能够满足用户最原始的需求,也才能更好的理解业务,理解需求,从而可以去挖掘需求文档中存在的问题或不足。
项目所属级别: 是战略项目?还是技术维护升级项目?了解项目的级别也就是重要程度,也决定了我们应该投入的资源;对质量的要求是什么级别,用户对质量的要求是什么样的。
项目期望完成的时间: 对完成时间的了解,可以决定我们后续会采取什么样的测试策略,哪些测试方法是必须采用的,哪些可以不用或者上线后再使用等等。比如时间特别紧张,最重要的还是要保障功能,其他性能可以根据上线的方案决定;是一上线就会有大量用户使用还是只有少部分种子用户;兼容性是否可以上线后进行,还是说针对C端的,兼容性必须保障;自动化测试可能就无法做了,也或者自动化技术已经非常成熟,有录制相关的工具,且经验丰富,那这个时候自动化录制工具或录制回放工具就可以起到很大的作用。
系统用户情况: 系统的用户是谁?用户量有多大?关注用户量,第一是了解系统是否有性能压测方面的需求,第二是了解系统的用户量级是几个,几十个、几百个人还是成千上万?用户的数量不同,他的价值必然不同。
系统客户是谁: 系统的客户是谁?客户最原始的述求是什么?
下面的是HTSM【项目环境】的具体内容,部分内容我做了补充和调整。
产品最终就是为客户提供的一种经验或解决方案;产品有多个维度,要测试好,我们覆盖的维度必须要全面。每一个维度都代表了产品独特的一个面 。如果测试只是覆盖了一部分,就有可能错过严重的bug。 分析产品的元素,就是分析我们的测试范围,有哪些方面或内容是需要我们测试的。一般人确定测试范围都来自于需求文档,其实需求文档之外还有很多东西需要我们关注,需要我们测试。下面是HTSM的【产品元素】:
HTSM模型【产品元素】列出的内容比较多,也比较复杂,这些内容可以作为我们的参考,绝不是要求完全按照下面的内容进行测试。
Structure结构:产品所包括的一切;
这一部分我觉得是我们最容易忽略的,我们大部分时间都是在测试软件,硬件部分很容易忽略;另外容易忽略的就是非执行文件,例如帮助文档、许可协议等,这些虽然很多都是业务提供,但出于对公司负责、对产品负责、对用户负责,我们还是需要再检查一下这些非执行的文档;帮助文档是否简单易懂,是否有缺失,是否有错误或与系统功能不符;因为上线前对系统最熟悉的不是产品经理,也不是研发,而是测试人员。
另外分享一下我的一些经验;首先,测试范围的确定是非常重要的,大部分人会忽略这一步,这样就有可能会导致漏测。这一步容易忽略,是因为我们的测试依据就是PRD,所以测试范围都在PRD里;但实际情况是,大部分测试范围都在PRD里,还有一部是在设计文档中,或者在文档之外。
对于从0开始的新项目,可以从两个角度去考虑测试范围:
一、产品角度,通过分析PRD基本就够了;当然有些内容PRD可能也会疏忽遗漏,我们就需要对需求进行分析,挖掘出可能存在的隐性需求。
二、技术角度,除了用户看到的可以操作的功能,有些功能是用户无法直接用到的,或者是给其他系统技术开发用户使用的;例如对外提供的接口服务、系统后台异步处理的任务、定时执行的任务、上线前刷的基础数据、前置数据等。
从1.X到1.(X+1)或2.0的升级维护项目:
除了正常的测试范围评估,最重要也是最难的就是回归测试范围的评估了,也就是对原有系统的影响范围是最难评估的。
对于回归测试范围的确定,其实就是成本与质量的博弈;对于质量要求非常高的软件,每一次测试都会要求进行全量的回归,所以这种场景下,自动化回归测试是非常重要的;对时间要求非常紧急质量风险可承受或可控的,回归范围可以缩小到本次修改的相关功能即可;但大部分场景是时间要求比较紧,但质量也不能出现问题。这时如何圈定范围,首先是本次修改的相关功能的回归必不可少;其次就是要守住系统的底线,也就是确定这个系统哪些功能是不能出问题的,这些功能就需要作为这个系统每一次回归的必选范围。另外还可以通过代码diff的功能,分析本次改动点,影响到的功能。
除了功能回归范围的评估,对于升级项目,一定要注意对原有数据的兼容验证;大概有以下几种情况:
1)功能变化,对原有进行中的数据的操作是否会影响;
2)流程变化,对流程中的数据或驳回重新提交的数据是否可以正常进行;
3)数据传输对象(PO、VO、DTO等)发生变化,进行中的数据或重新编辑后的数据是否能正常操作,最主要时要验证数据的传输或存储。
4)底层数据库表发生变化,是否影响原有数据的展示、操作;新增字段是否需要刷数;刷数后功能是否正常。
质量标准就是产品定义的应该满足的一些要求,测试人员判断一个系统是否验证通过的规则;通过考虑不同类型的标准,你可以更好地规划测试,并可以快速发现重要问题。下面的每一个类型都可以被视为是潜在的⻛险区域。
功能性(Capability) :系统功能是否正确,是否满足了用户需求?
可靠性(Reliability) :在任何情况下是否都可以正常工作?
易用性(Usability): 真实用户使用产品是否很容易?
安全性( Security ): 产品对未经授权的使⽤或⼊侵的保护程度如何?
可扩展性( Scalability ): 是否有合理的规划,应对系统的增长(数据量、流量、复杂性)
兼容性( Compatibility ): 与外部的组件以及配置等是否可以兼容,正常工作?在不同的硬件平台上、不同的应用软件之间、不同的操作系统中、不同的网络环境中是否可以正常的运行。
性能( Performance ): 系统的响应速度是否够快?
性能测试很多时候是由专门的性能测试人员负责,但作为功能测试人员也一定要关注;性能测试除了常见的并发压测,其实更多的场景是由于系统的数据量大,最终导致查询、导入、导出等功能响应很慢;尤其再同时发生并发,或多任务并行,最终就很有可能导致一个导出任务,需要几天之后才能完成。
易安装性( Installability ): 系统是否能够很容易得安装到对应的平台。
易维护性( Development ): 系统是否容易进行开发、测试、维护?
可⽀持性: 是否可以以较低的成本向产品用户提供协助支持
可测试性: 是否可以用尽可能简单的方法进行快速测试
可维护性: 构建、修复或增强产品的难易程度及成本如何?
可移植性: 在其他地⽅移植或复⽤该技术的经济性如何?
可本地化: 将产品应⽤于其他地⽅的经济性如何?
测试技术就是进行测试的策略分析,常用的测试技术有下面九种。
Function Testing功能测试: 对产品的各功能进行验证,根据_功能测试_用例,逐项测试,检查产品是否达到用户要求的功能。
Claims Testing 约束测试: 挑战每⼀项声明!保证用户看到的任何资料中提到的功能的正确性及一致性。
1)明确相关的参考资料,如 SLA、⼴告、说明书、 帮助⽂本、操作⼿册等 ;(_SLA_一般指服务级别协议。 服务级别协议是指提供服务的企业与客户之间就服务的品质、水准、性能等方面所达成的双方共同认可的协议或契约。)
2)参照上面的资料,测试产品的每⼀项声明
Flow Testing 流测试:按照一定的顺序操作执行的测试
测试由多个处理步骤相连的流程
在相关操作或处理间不要重设系统
改变时间和顺序,并且进行并发操作
Domain Testing领域测试:
1)分析产品任何可能的输入、输出
2)确定测试采用的数据进行测试。例如边界值、典型值、常用值、无效值、以及最具代表性的值。
3)考虑测试的数据的组合。
Scenario Testing场景测试
1)⾸先考虑可能发⽣的⼀切实际场景
2)设计测试用例,包括对产品有意义的功能,以及复杂交互的场景
3)⼀个好的场景测试是⼀个引人入胜的故事,讲述⼀个重要的⼈如何 做⼀些对他来说很重要的操作
Stress Testing压力测试
1)确定压测的范围,这个子系统或功能可能会承受量非常大的数据压力,或由于资源受限,出现大并发导致系统过载或“损坏”;
2)识别与这些⼦系统和功能相关的数据和资源;
3)选择或⽣成具有挑战性的数据,或限定条件下的资源;例如,大型或复杂的数据结构、⾼负载、⻓时 间的测试运行、大量测试⽤例的执行、低内存情况下运行
Automatic Checking自动化测试
Risk Testing风险测试
1)思考产品可能会出现哪些问题、风险?
2)哪种问题出现的可能性会最多?专注于这些出现几率较多的问题
3)如果它们存在,你将如何检测并发现它?
4)列出这些问题并设计相应的测试用例,专门用来挖掘他们
5)另外还可以咨询相关的专家、查看设计⽂档、过去的缺陷报告或应⽤⻛险启发式⽅法,这些可能都会有所帮助
User Testing用户测试
1)识别用户的类别和角色
2)确定每个类别的用户日都都会做什么操作,他们一般会如何操作,他们重点使用的功能有哪些?
3)获取真实的用户数据,或引⼊真实的用户,提前使用系统进行测试
4)系统地模拟真实用户使用场景(虽然你不是真实用户,但也很容易把自己想象成用户去使用)
5)最好的用户测试是涉及多种用户角色,并且多用户并行、交叉操作,不仅仅是单一一种用户或一个用户操作。
作者:京东零售 张强
内容来源:京东云开发者社区
2022年7月28日,由中国互联网协会人工智能工作委员会主办,北京国双科技承办的“AI智荟沙龙——人工智能发展主题研讨会”第二期在国双大厦成功举办。人工智能工作委员会主任委员、智源研究院院长黄铁军,北京国双科技创始人、董事长兼CEO祁国晟,北京国双科技CTO刘激扬,科大讯飞集团北京研究院院长伍大勇,联通数科首席AI科学家廉士国,紫光集团华山智安科技副总裁苏佳,北京澜舟科技合伙人李京梅等20余位专家学者们出席了活动。本期会议紧密围绕“如何推进人工智能与实体经济深度融合”这一主题,通过线上线下相结合的方式,深入研讨了“人工智能产业化进程目前所处阶段、近年来人工智能与实体经济融合的成效与不足、挑战与建议”等问题。在开场致辞中,黄铁军主任委员指出,经过十多年发展,人工智能进入关键时期,大家都在关注未来人工智能对社会的影响。犹如20年前互联网泡沫引发的不同观点,当今的人工智能也面临同样的问题。一方面,从提高效率、赋能实体经济发展而言,人工智能仍然会发挥积极作用。另一方面,未来一定会出现今天还没想到或者少数人才能想到的全新的商业和形态。作为承办方,北京国双科技创始人、董事长兼CEO祁国晟对参会专家
新版本的“Cerberus”安卓银行木马将能够窃取谷歌认证应用程序生成的一次性代码,并绕过受2fa(双因素认证)保护的账户。安全研究人员称,安卓恶意软件现在可以提取并窃取通过谷歌认证器生成的一次性密码。谷歌认证器是一款移动应用,用于许多在线账户的双因素认证层。谷歌在2010年推出了认证手机应用。这款应用的工作原理是生成六到八位数长的唯一代码,用户在尝试访问在线账户时必须在登录表单中输入这些代码。谷歌推出了认证器,作为基于短信的一次性密码的替代品。因为谷歌认证码是在用户的智能手机上生成的,并且从不通过不安全的移动网络传播,所以使用认证码作为2FA层的在线账户被认为比那些受基于短信的代码保护的账户更安全。在本周发布的一份报告中,来自荷兰移动安全公司ThreatFabric的安全研究人员表示,他们在Cerberus的最新样本中发现了AuthenticatorOTP窃取功能,Cerberus是一种相对较新的Android银行木马,于2019年6月发布。ThreatFabric团队说:“滥用Accessibility特权,该木马现在还可以从GoogleAuthenticator应用程序中窃取2F
参考链接:C++strstr()strstr() constchar*_cdeclstrstr(constchar*_Str,constchar*_Substr);char*_cdeclstrstr(char*_String,constchar*_SubString);strstr(str1,str2)函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL #include<iostream>#include<string>usingnamespacestd;intmain(){ charstr1[]="abcdefg"; charstr2[]="cde"; char*p1=strstr(str1,str2); cout<<p1<<endl; //输出str2在str1中第一次出现的位置开始以后的所有字符 cout<<(p1-str1)<<endl; //输出s
为什么我们真的需要一个类似Flume的系统呢? 为什么不直接将数据从应用服务器写到HDFS?将系统之间彼此隔离的消息系统已经存在了很长时间,在Hadoop环境中Flume做了这样的工作。Flume是专门设计用来从大量的源,推送数据到Hadoop生态系统中各种各样存储系统中去的,例如HDFS和HBase。一般来说,当在Hadoop集群上,有足够数据处理的时候,通常会有很多生产数据的服务器。这些服务器的数量是上百甚至是上千的。这样庞大数量的服务器试着将数据写入HDFS或者HBase集群,会因为多种原因导致重大问题。HDFS确切地需要一个客户端写入到文件——因此,在同一时间可能有成千上万的文件写入。每次一个文件被创建或者一个新块被分配,在NameNode节点会发生一组复杂的操作。如此庞大数量的操作同时发生在服务节点上,可能会造成服务器承受巨大压力。而且,当成千上万的机器写大量数据到小数量机器的时候,连接这些机器的网络可能会不堪重负并且开始经历严重的延迟。很多情况下,存在于多个数据中心的应用程序服务器,在托管Hadoop集群的单个数据中心聚合数据,这意味着应用程序必须通过广域网(WAN)写数据
小编自从毕业后开始做软件开发,做着做着发现不爽了,钱赚不了太多,头发也白了。于是拿着一点小资本,想着做点小生意。瞅着眼前的餐饮行业还不错,于是打算开一家餐馆。开参观可不是一件容易的事,仅仅行政类的审批流程就不少。至少包括办理卫生许可证,办理税务登记,办理工商登记等。我们先来看一下行政审批接口:interfaceExecutive{ publicvoidapprove(); }复制卫生局类的定义:classHealthOfficeimplementsExecutive{ @Override publicvoidapprove(){ System.out.println("卫生局通过审批"); } }复制税务局类的定义:classRevenueOfficeimplementsExecutive{ @Override publicvoidapprove(){ System.out.println("税务局完成登记,定时回去收税"); } }复制工商局类的定义:classSaicOfficeimplementsExecutive{ @Overr
前言:需要进行自动化办公或者自动化测试的朋友,可以了解下此文,掌握Python读取Excel表格的方法。 准备工作 1、安装Python3.7.0(官网下载安装包) 2、安装Pycharm(官网下载安装包) 3、安装openpyxl 命令行窗口执行:pipinstallopenpyxl,出现Successfullyinstalled表示安装成功。 4、准备一份Excel表格,绝对路径:D:\zxt\test_data.xlsx, test_data.xlsx内容如下: 了解几个常用概念 workbook工作簿 worksheet表单 row行 column列 cell单元格 active活跃的表单(即:正打开使用的表格) index索引(注意:Excel中的索引值是从1开始!!!) Python读取Excel importopenpyxl#一、打开工作簿wb=openpyxl.load_workbook(r"D:\zxt\test_data.xlsx",read_only=False)#二、从工作簿中获取表单#1.遍历表单名称forsheetinwb:print(shee
一泛型 泛型提供了一种更优雅的方式,可以让多个类型共享一组代码。泛型允许我们声明类型参数化的代码,可以用不同的类型进行实例化。 也就是说,我们可以用"类型占位符"来写代码,然后在创建类的实例时指明真实的类型。 C#提供了5种泛型:类、结构、接口、委托和方法。 二泛型类 如下代码声明了一个SomeClass的泛型类,类型参数T1和T2列在尖括号中,当作真实类型在声明的主体中使用。 classProgram { staticvoidMain(string[]args) { //使用泛型类声明对象,提供short、int类型实参。 SomeClass<short,int>s1Class=newSomeClass<short,int>(); SomeClass<int,long>s2Class=newSomeClass<int,long>(); } } classSomeClass<T1,T2>whereT1:new()whereT2:new() { publicT1SomeVar=newT1(); publicT2OtherV
legend3---laravel报419错误 一、总结 一句话总结: js中对象写成了数组,导致后端读不到csrf的token报错 二、legend3---laravel报419错误 419错误肯定是 CSRF 验证没通过 而在其它操作都正常的情况 才发现是js数据data定义的时候写成了数组,本来应该是对象 我的旨在学过的东西不再忘记(主要使用艾宾浩斯遗忘曲线算法及其它智能学习复习算法)的偏公益性质的完全免费的编程视频学习网站: 【读书编程笔记】fanrenyi.com;有各种前端、后端、算法、大数据、人工智能等课程。 版权申明:欢迎转载,但请注明出处 一些博文中有一些参考内容因时间久远找不到来源了没有注明,如果侵权请联系我删除。 微信:fan404006308 录播课资料github地址:https://github.com/fry404006308/fry_course_materials
1.验证枚举类型 varschema={ "properties":{ "data":{ "type":"object", "required":["code","status","message","data","token"], "properties":{ "code":{ "type":"number" }, "status":{ "type":"number", "enum":[0,1]//枚举 }, "message":{ "type":"string" }, "data":{ "type":"array",//数组 items:{ type:"number" } }, "token":{ "type":"string" } } } } }; 2.验证email(format、minLength、minimum、default) constAjv=require('ajv'); letschema={ type:'object', required:['username','email','password'], properties:{ username:{ type:
实现弹出窗体对象的单例模式 结合泛型后,可以用于所有窗体的弹出操作 publicclassBaseFrm<T>whereT:Form,new() { //定义一个静态的,私有的类型变量, privatestaticTt; //程序运行时创建一个静态只读的进程辅助对象:因为要加锁时,实例有没有被创建出来,(有没有被创建过实例)还不知道。 privatestaticreadonlyobjectsyncRoot=newobject(); //将构造函数做成私有的,防止此工具窗体在其它地方被实例化 publicstaticTGetInstance() { if(t==null||t.IsDisposed)//先判断实例是否被创建,不存在则再加锁处理 { lock(syncRoot)//在同一个时刻加了锁的那部分程序只有一个线程可以进入(但是如果每次还没有确定,是否已经有实例就去加锁,很浪费资源) { if(t==null||t.IsDisposed)//单纯的这样无法解决多线程程序中,多个线程同时访问这个类的情况 { t=newT(); //OrderBo
WindowDataLayer windowdatalayer的数据是存在硬盘上的图片,需要在一个txt里指定用于训练或测试的图片以及boundingbox,boundingbox对应的标签,以及boundingbox和groundtruthboundingbox的overlap,一个例子如下 #0 /home/xxx/0001.jpg 3 641 677 7 11.0353356393396 13310.5338344379384 39640.7339336379376 45330334330374370 46891.0330324370364 48651.0335319375359 49271.0341313381353 #1 /home/xxx/0002.jpg 3 600 400 3 11.0353356393396 13310.5338344379384 39640.7339336379376复制 其中第一行是图片的index,从0开始,接下来三行依此是图片的channel,height,width, 接下来一行表示boundingbox数量.再接下来的每一行都
/** <p>给你一个数组<code>nums</code><em></em>和一个值<code>val</code>,你需要<strong><ahref="https://baike.baidu.com/item/%E5%8E%9F%E5%9C%B0%E7%AE%97%E6%B3%95"target="_blank">原地</a></strong>移除所有数值等于<code>val</code><em></em>的元素,并返回移除后数组的新长度。</p> <p>不要使用额外的数组空间,你必须仅使用<code>O(1)</code>额外空间并<strong><ahref="https://baike.baidu.com/item/%E5%8E%9F%E5%9C%B0%E7%AE%97%E6%B3%95"target="_blank">
(一)CSS样式相关 1.禁止拖动图片 img{ -webkit-user-drag:none; } 复制 2.去除select默认下拉图标 .select{ appearance:none; -webkit-appearance:none; background-image:url('../../statics/tir.png'); background-repeat:no-repeat; background-size:12px; background-position:50pxcenter; } 复制 3.CSS限制字数,超出部份显示点点点 .text{ width:400px;/*要显示文字的宽度*/ text-overflow:ellipsis;/*让截断的文字显示为点点。还有一个值是clip意截断不显示点点*/ white-space:nowrap;/*让文字不换行*/ overflow:hidden;/*超出要隐藏*/ } 复制 4.自定义滚动条 /*滚动条整体样式*/ .main::-webkit-scrollbar{ -webkit-appearance:none;
写在前面: 这个文章核心并不是程序优化的具体技巧,而是拿到一个问题如何思考和利用工具的通用方法。比如即使我们不知道profiler这个东西,通过搜索"代码每一行时间"也可以很快知道有这样的工具叫做profiler,并且学会怎么使用。即使不知道rand这个函数怎么加速,通过搜索引擎也可以找到别人写好的现成代码。另一方面是发现瓶颈之后也不要着急自己修复,如果不是特别一目了然的话,先看看别人是怎么做的。站在巨人的肩膀上,事半功倍。 1.多看看「官方文档」 我们很多的问题和技术细节,其实,只要我们认真将官方文档过一遍,会发觉大部分的问题和认识模糊的地方都消失了。甚至,你还能发现自己之前通过搜索获得的到一些资料,可能是不准确或者已经过时的。官方文档是真正的好东西,因为编写文档的人群,通常就是这些技术或者软件的开发者,他们才是对这些东西最了解的人,因此,他们写的文档质量是很高的,通常也是最新的。 官方文档的不足的地方,大概是中文版本不多,看起来可能会比较吃力。不过,请相信我,下载一个翻译辅助软件,慢慢看还是可以的