我和你,永远写不出王子与公主的结局。
目前的现实物质世界与软件构造的虚拟世界几乎处在同一维度人的思维有多复杂软件代码就有多复杂不管是金融领域的核心系统还是工业嵌入式软件动辄上亿行的代码量几百万个函数数百个进程这样的研发与维护的工作量难度可想而知所以我们经常可以看到各种报道比如程序崩溃造成几亿元的金融交易损失机器人失控攻击使用者智能生产线效率低迷等随着软件开发技术的快速迭代以及互联网+智能化浪潮下软件复杂性和可靠性要求的快速提升软件测试技术的发展远落后于软件开发技术的发展然而软件测试是软件开发的伴生物有软件开发即存在软件测试软件本身越重要那么测试的要求越高国内专业测试行业历经10余年的发展测试行业已经取得了从业人数的一个巨大的发展然而大部分企业的测试依然采用人工经验型功能测试传统功能测试具有测试领域所常说的杀虫剂效应面对高复杂度的应用基于功能描述的缺陷检出后期的效率会快速下降无法发现隐蔽的缺陷同时伴随着智能化的发展产品的外在功能正在简化而内部实现将变得更加复杂仅仅从功能使用层面寻找办法解决软件测试的效率和质量将变得更加困难纵观各行业要做到快速发展依赖于人工为主的经验型方法显然是不现实的精确的度量方法和生产的高度量化控制以及智能化的辅助工具是一个行业真正发展所需要的最基本的条件而这一切正是几乎完全依赖于人工业务经验的软件测试行业所最欠缺的
软件测试的发展遭遇尴尬境地其主要原因是面临一些测试技术瓶颈问题目前没有突破其实造成软件维护困难的深层次的原因在于软件测试的整个过程和方法完全面对一个不知内部结构的BLACK BOX
(1)系统级的测试用的基本都是黑盒测试方法从根本上注定基于黑盒测试方法的各种方法都没有直接面对计算机所真正理解的程序层面去解决软件测试问题同时黑盒测试永远带有一种猜测的基因过程非常不稳定并且难以控制
(2)测试过程中所产生的数据基本都是人工录入数据的准确性无法保证也这是为什么软件测试永远强调团队的职业素质和管理能力软件测试本身的结果并不具备可信性因为不管通过测试找到了多少缺陷也无法精确的对软件质量进行定义和判断在极端情况下软件测试是否真正有效的开展和执行都是非常难以判断的软件测试和开发的最大区别是它并没有明确的产出物和开发相比工作目标也是不清晰的结果的不可信和成果的不可见性使得软件测试经常处于被动的局面也使得软件测试很难有创新的业务模式依然采用传统软件开发的作坊式方式
(3)传统的功能测试过程极其不稳定特别依赖于测试人员的业务能力和临场发挥能力即使很优秀的测试人员也会因为状态问题而导致测试用例设计水准出现波动更不要提有经验人员和经验欠缺人员的在测试质量上的巨大差别对于企业来讲将产品质量依赖于个人的经验水平上是非常危险的同时企业强调的是技术体系而依赖于经验的测试方法则非常难以传承同时从工程角度普通的测试工程师可能即使投入很大的工作时间也难以短期达到高级测试工程师的测试水准
(4)业界几乎将自动化测试作为解决软件测试效的灵丹妙药但实质上自动化测试无外乎是人的经验的机械执行而已完全无法解决测试的根本症结对于绝大部分企业自动化测试因为存在和被测程序很强的相关性和耦合性对程序的变化适应性差以及开发难度等因素自动化测试通常仅用来解决主干业务流程的测试真正有效实施的案例也比较少自动化测试是黑盒测试的一种高级形式它加快了测试执行的效率但并没有改变测试用例黑盒设计方法和引入先进的测试分析方法
(5)最后再分析下被认为高端的白盒测试技术白盒测试技术由来已久也并不缺乏优秀的商业工具但其在企业内的应用范围非常狭窄
1. 白盒测试难以脱离开发环境很难适应系统级的测试并且难以实施通常测试工程师在对代码内部不是很了解的情况下很难有效的进行测试
2.结果依赖于代码版本代码发生改变后很多数据都失效无法适应快速迭代的敏捷开发白盒测试技术诞生的时候软件迭代周期非常慢具有明显的开发-测试交替的界限而这些界限在当今的软件开发界随着敏捷开发模式的推行已经非常模糊当今的软件测试周期内是没有足够的时间节点对针对一个版本做完整的白盒测试
3.以单机在开发环境内测试方式为主不支持团队的分布式测试和分析不适合大型软件的测试这一点显然也是传统白盒测试不能有效应用的原因
4.以单元测试为主要方式无法有效适应大型复杂软件的测试构造驱动和桩程序以及完成所有单元的测试时间消耗和周期都是企业无法承受的同时对于复杂系统更多的逻辑错误是发生在系统各模块串接和组合以后而不仅仅是发生在单元内部
5.不支持用例级别的测试覆盖率分析目前几乎所有的白盒测试工具不特别强调用例级的覆盖率将所有测试结果混在一起让白盒结果无法区分覆盖率的贡献来自于哪个具体的测试用例这将大幅度降低白盒测试工具在用例分析上的作用
6.以覆盖率为主要目标也是行业无法接受白盒测试的原因因为高覆盖率在很多场合是不适合的普通的白盒测试数据并没有更加有效的应用到测试分析算法中去
那么到底什么样的测试技术才能改变软件测试的尴尬境地我们可以在车辆功能安全标准ISO26262安全管理生命周期的细则中总结出软件测试必须具备的基因从项目管理上来看测试工作需要达到两点第一实现开发与测试的交互管理第二实现可追溯的工程技术从项目测试执行上来看测试工作需要同时支持静态测试和动态测试
针对以上提出的问题如何能够给测试行业带来改革性的创新呢精准测试技术在各种我们所熟知的测试方法都无法解决软件测试的根本问题的情况下应运而生精准测试技术在2014年(当时用名穿线测试)和2016年的国际软件测试大会上发布更为难得的是精准测试并不是舶来品而是由国内顶尖的测试专家设计和带队自2012年初研发的星云测试平台 里的软件测试技术新路线方法
精准测试从诞生第一天起其软件产品工具属性就远超经验属性它的核心思想就是用软件测试软件具有天生的工具基因和智能分析系统的基因它的设计思想在于用非常精确和智能的软件来解决软件测试的问题并从根本上引领软件测试从经验型方法向技术性方法的转型
一精准测试的设计思想
总结传统的测试方法主要面临以下几方面的瓶颈问题
(1)低效主要基于人工评定的黑盒测试方法检测后期会遇到杀虫剂效应除非消耗大量的人工成本否则无法打造具有高软件可靠性的产品对于产品级功能和高可靠性要求比较高的产品因为无法采用互联网纯软件产品的灰度发布技术它必须要严格保证每一个产品版本的质量问题
(2)检测结果可信性检测数据人工因素占据绝大部分比重导致检测数据本身不具备技术公信力进而导致管理成本的升高传统测试管理难度很大因为很难保证测试的一些数据是正确和真实录入的
(3)无法精准量化控制无严谨的量化结果数据可追溯性差以人工干预的主观观测和定性评价结果为主导对人力经验依赖很大结果不稳定对于绝大部分企业一定需要依靠对业务和测试经验高的人员才能保证产品质量一旦人员发生变动质量会抖动的很厉害而对于测试新人可能投入数倍的时间都无法达到有经验人员的水平这是因为经验性方法没有量化控制看不到明确的测试差距和量化目标对于没有经验的人员投入数倍的时间都难以达到经验人员的测试水准
精准测试的核心特性如下
(1)不改变传统的软件测试方法在黑盒测试过程中由计算机软件去采集程序执行逻辑以及其他测试数据的过程测试过程不需要直接面对程序代码进行并实现测试用例和代码的自动关联将功能测试直接映射到代码层
(2)所有数据由系统自动原生录入不可人工直接修改保证数据精准和不可篡改精准的测试数据可直接用于测试的过程管理和实效分析
(3)支持测试数据的精准度量以及全面的多维度的测试分析算法将白盒测试的视角从覆盖率扩展到智能测试分析
(4)基于测试用例和代码的映射关系支持快速迭代过程中回归测试用例的自动选取算法
精准测试首先是一种通用的测试分析系统其内部算法实现与具体业务无关对于各种类型的应用软件都可以采用同一套方法进行确认其最底层的方法是建立测试用例与代码的关系任何类型表现形式的软件都会存在测试用例(功能)与代码的双向关联关系因此精准测试的应用范围是非常广泛的由于精准测试本身和用户的业务并没有直接关系因此初步的设计测试用例和执行测试用例还是用户原有的测试体系来进行的而一旦通过精准测试建立了测试用例和代码的关系那么后面将提供大量的有价值的计算机辅助测试分析的结果
精准测试的核心组件包含的软件测试示波器用例和代码的双向追溯智能回归测试用例选取覆盖率分析缺陷定位测试用例聚类分析测试用例自动生成系统这些功能完整的构成了精准测试技术体系精准测试系统的本质是一套强大的计算机测试辅助分析系统它的关键技术是测试用例和代码的双向追溯技术通过该项技术很多高级测试算法得以应用同时将测试和开发进行非常紧密的连接精准测试系统并没有取代人工设计用例执行用例的过程但是通过对该过程深入到代码层的分析可以相当大的程度改进人工测试所产生的各种问题上述精准测试框架还在不断的演化中截至目前星云测试已经发布了精准测试完整的解决方案和商业平台同时华为阿里巴巴Testbird搜狗等企业也在积极响应和推进该项技术在大型企业内部的实践和应用以下我们就针对精准核心技术以及解决的问题带来的效果做详细的介绍
3.1软件测试示波器
精准测试数字化测试在黑盒功能测试过程中采集动态覆盖率的技术组件即软件测试示波器它是对于软件测试的一大创新精准测试示波器能够在测试过程中自动分析程序运行的一些数据指标以波形的形式进行实时输出例如跟踪显示程序执行的逻辑块的速率指标程序执行的条件数速率指标等示波器还能够用来对程序的行为进行深度的分析例如可以通过示波器来判断不同的测试用例是否为等价类因
此示波器可以记录每个功能对应的输入精确的逻辑块执行的数量因此当程序的行为发生明显变化的时候示波器可以很精准的分析出来测试人员可以根据这些数据来进行等价类的判断它和电气示波器一样能够对程序的执行进行很多类型的分析和判断精准测试示波器改变了传统测试只面对被测试应用和一些简单的测试管理系统它将成为测试工程师身边强大的测试分析辅助工具在实际测试的过程中测试工程师可以看到类似于心电图的数据获取模式让软件测试过程因此变得可视精准具体的如图2所示
精准测试示波器在使用上对常规的测试几乎没有特别的干扰示波器内部也维护一套测试用例但是更多的是一种符号的象征示波器最大的作用是在测试用例执行的过程中采集测试用例对应的代码逻辑的运行信息测试工程师只要真正开始某个用例执行之前首先选择测试用例其次点击开始录制按钮最后回到应用上根据预先设计的用例流程操作被测试程序即可当执行结束后单击结束按钮在执行测试用例的过程中所有代码执行逻辑都会自动映射到这个测试用例上人工的点击开始和结束主要用来界定测试用例的执行边界示波器会把这个阶段产生的程序执行信息映射到所选择的测试用例上
示波器系统和被测程序一般采用网络连接进行通信当被测程序运行过程中将软件的执行序列通过网络传输给示波器整个过程由软件自动采集也保证整个精准测试的输入是精准的这个也是精准测试的精准数据的采集来源所有的用例数据都是通过示波器采集的并不是人工录入的没有做过的操作示波器自然不会采集相对应的程序逻辑现场执行的错误示波器也会如实记录这就使得原来由人工录入的测试数据变得非常的准确由人工录入的数据可以存在伪造失真以至于不可信而示波器则是和电气示波器原理类似会真实的记录实际的测试情况
软件示波器同样是测试人员的一个非常强大的辅助分析工具通过它可以轻易辨别测试用例是否为等价类和精确确定等价类的边界示波器可提供相近测试用例的代码执行序列的比对功能用于判断两组用例是否完全等价也可以通过不同用例执行后的指标终值判断两组用例是否等价同时示波器有助于对平时无法看到的程序行为进行判断例如不操作被测程序的过程中程序是否在有后台执行的代码也可以分析出来程序的计算量是否存在计算密集的功能区域等
3.2用例和代码的双向追溯
精准测试从开发和测试人员的最主要工作组件入手率先提出了测试用例和代码的双向追溯它也是精准(穿线)测试最核心技术之一即运行一个测试用例以后精准测试可以通过程序自动的记录和显示这个测试用例执行的代码如果测试用户关注某一些代码行它可以追溯出哪些测试用例在运行过程中跑过这段代码我们都知道软件开发的两大核心人员就是开发和测试人员这是完全不同的两类技术工种开发和测试一直没有办法进行真正的信息化沟通通过这个技术特性每个测试工程师的每个测试用例都可以进行量化的分析和统计这些量化数据既可以用来对测试工程师进行工作的考量也可以提供开发人员和测试人员之间进行信息化的交流
双向追溯技术记录了每个测试用例对应的程序内部的执行细节细致到每个条件分支语句块的执行情况可以理解为一个全景的调试器开发人员可以通过双向追溯的结果去理解程序逻辑进行软件维护以及进行可一致性的修改因此开发人员将很大程度上增加对测试人员工作的认同开发和测试交流最头痛缺陷复现的问题可以迎刃而解大大提升了测试和开发的交流效率
双向追溯技术分为正向追溯与反向追溯正向追溯是指将测试用例和海量的代码执行信息自动关联可精确到函数级别及代码块级别通过正向追溯可直接在代码级定位测试现场故障和缺陷逻辑并提供最后运行的时序数据通过正向追溯自动记录产生功能对应的详细设计实现辅助软件解耦和架构分析具体如图3所示
正向追溯的优势是迅速定位缺陷对应的代码执行逻辑帮助开发快速修复缺陷可追踪难复现缺陷精确详尽的记录测试用例运行的情况为精准软件测试提供大量原生分析性数据可以进行事后的缺陷分析追踪辅助开发进行功能实现确认
反向追溯是指分析代码关联的功能为研发分析系统和进行一致性修改以及回归测试分析提供精确数据具体如图4所示
3.3智能回归测试用例选取算法
精准测试为什么要使用智能回归算法呢究其原因可知
超过60%的对软件系统的修改会无意中引入新的错误
每修改6行代码就会引入一个新的错误
如何才能利用技术手段尽可能避免再次引入新的错误精准测试提出了智能回归测试用例选取算法最终要达到的目标是
(1)检查测试出的软件问题是否得到了正确的修改
(2)保证被测软件在被修改之后各项功能依然正确(未引入新的缺陷)
为了达到以上的最终目的图5展示了回归测试逻辑
智能回归算法选取的带来的效果如下
(1)适应快速的版本迭代周期适应庞大的工程项目
(2)在回归测试时自动筛选测试用例大大减少了回归测试的时间以及风险
(3)降低了传统人工回归分析产生的测试盲点
(4)精确计算回归用例的权重测试人员在时间有限的情况下可以重点回归受改动影响最大的用例
3.4 灰盒模式下的代码覆盖率分析
测试覆盖率是测试界公认的最佳的是测试结项的可用量化指标在黑盒测试中测试人员需要充分了解需求后逐渐细化到小功能进行测试用例的设计然后通过测试过程中出现的问题以及和客户的交流再加以完善这样的过程过度依赖个人经验和能力等因素并且也不一定能达到完美的效果在白盒测试中测试流程需要对每条代码每个语句每个判断进行运行分析测试周期冗长大多企业无法承受而精准测试的设计是通过软件示波器以透明的测试再系统测试阶段取采集代码覆盖率然后再后台完成运算这个过程是以灰盒的模式运行
精准测试覆盖率形式多样最高支持航天航空标准MC/DC的100%覆盖率要求并且提供了全新的覆盖率每日增长趋势图项目管理者可以通过该报表清晰的观察整个测试进度情况精准测试平台的覆盖率趋势图对于团队的质量控制具有很好的指导意义它能够让高级管理人员对测试进度进行预判也能够对测试效率进行有效的识别例如通过对覆盖率增长曲线的拟合可判断按照目前进度能够在上线日期到达前能够一个合理的测试水准通过覆盖率增长是否走平可判断是否达到黑盒测试的极限区主动地进行测试策略的调整
精准测试系统在设计上是开发与测试进行协同的系统强调在测试阶段首先自动采集系统级的覆盖率无需开发人员介入当测试进行基本完成后由开发人员将测试结果与代码绑定起来分析漏测逻辑由于软件的复杂性通常进行完功能测试后一般情况下会剩余至少30%以上的漏测点而通常由于黑盒测试的杀虫剂效应以及对需求把握的问题通过测试想完成覆盖会比前期的覆盖投入增加数倍而通过精准测试的覆盖率可视化将测试用例的执行结果映射到代码层以后让开发人员直接审核并且补充用例效率将会有平均3-5倍以上的提升
3.5测试用例的聚类分析
基于精准测试系统构建的测试用例与代码的的执行剖面的关系可以对测试用例的执行进行聚类分析根据真实的执行剖面进行聚类将会对测试用例的聚集性属性进行分析测试用例的执行剖面结构矩阵的输入为两维数据第一维为测试用例的名称(ID)然后是该用例对应的函数执行剖面或者代码块执行剖面然后将剖面数据向量化以后通过K-Means等标准聚类算法进行聚类分析聚类的数据主要可以用于一下几种场景
首先聚类结果可以在管理端识别测试现场错误执行的测试用例测试是用来检测开发的程序是否存在缺陷同样测试本身也会产生缺陷而通常由于测试已经处于产品发布周期的末端因此测试本身存在的缺陷则很大概率直接带入生产环境对于测试的缺陷本身的检测基于程序执行频谱的聚类分析具有强大的分析能力基于程序的执行频谱将按照实际测试用例运行的程序路径进行聚类和人工实现的分类最大的不同它可是识别测试用例的动态执行错误例如为了测试业务A结果实际由于出错跑的是业务B或者A业务没有按照实际需求的步骤执行那么聚类结果将显示测试用例A的业务B聚类到了一起那么管理者可以通过这个结果对各种原因造成的用例执行错误即测试环境产生的错误进行甄别
同时聚类结果非常有助于测试管理人员对用例的分布进行分析可以看出哪些功能范围经过了充分的测试哪些功能点用例数量较稀少根据这些结果以及系统本身的业务可以进行综合的宏观的判断软件的缺陷在理论上的分布具有规律通常缺陷会更多的分布在一些相近的功能区域基于这个原理我们可以利用聚类结果去组织测试计划当上线时间比较紧张测试时间不充足的情况下可以采用基于上一轮的聚类结果进行筛选用例从一个类中选出中心点用例和随机的几个用例如果都正确那么就可以不对这个功能点的其他用例进行重点测试反之则需要重点进行排查这样测试就可以更加从容的去选择用例集而不是在整个范围内进行随机选择将大幅度的提升测试发现缺陷的效率
传统的黑盒测试技术属于经验型模糊测试质量进度不可视系统与人员的管理成本极高没有实用的工业标准软件可靠性风险高并且传统的黑盒测试在70%前的阶段查找BUG是非常迅速的但之后缺陷的发现效率会急剧的下降而传统的白盒测试技术直接面对代码测试难度大效率低集成和单元阶段的附加成本很高无法云化仅关注覆盖率精准测试是结合传统的黑盒测试与白盒测试相结合的模式它可以在黑盒测试过程中通过专用程序自动采集白盒级别的运行逻辑数据根据可视化出来的不足点和漏洞点引导开发和测试有针对性的高效的补充用例精准测试的效率分析如图6所示
应用精准测试系统经过大量的实际企业案例的分析达到同等质量水平的时间可以缩短2-2.5倍左右对于人力成本昂贵的IT企业可以节省大量的测试投入对于企业抢占时间快速发布稳定的系统具有关键的意义对于软件可靠性要求极高的企业应用精准测试技术在人力投入不发生变化的情况下质量水平可以提升20-30%,能够非常有效的保证发布软件的质量如图7所示
图6是精准测试系统在长期的软件维护过程中精准测试系统对于维护的效率提升精准测试下的维护完全由计算机的分析系统所主导大型软件之所以难以维护是因为传统的软件开发过程对于软件维护更多的基于人对于软件系统的理解而随着维护的进行人的记忆以及人员的变动都很大程度影响维护的效率很多大型软件之所有因为无法维护而最终不得不重新开发主要原因之一就是老的系统维护成本会持续地增加而精准测试则通过测试过程中所记录的数据在持续的迭代过程中记录海量的分析数据随着迭代的进行数据记录的量更多更精确它反而可以得出更加精准的分析结果
本文框架性介绍了精准测试技术分别从精准测试的提出理念特性核心技术以及效率等方面进行了详细的说明精准测试是一个开放体系未来的发展方向主要是针对被测程序的质量验收与建立良好的测试体系对于现今软件定义的大趋势版本高速迭代与程序的质量都影响着各行业企业的发展精准测试在这方面凭借着自身的技术优势在不为企业增加多余的负担的情况下快速的提升程序质量以及建立一套完善的测试体系精准测试系统诠释者软件测试软件的全新的软件测试理念将人工分析转换为人工智能分析让测试理论算法落地到企业应用有效的指导企业进行高效率的质量保证
测试的价值提升除了在技术层面外同样大幅度提升了测试本身的价值传统意义上的测试仅仅是以寻找缺陷为第一目的甚至是唯一目的的当测试结束以后并不会留有多少有价值的资产测试对软件需求最精确的把握这一天生优势并没有有效的发挥传统测试也仅仅是软件生命周期中的一个小的环节而精准测试的则可以大幅度的提升测试的价值通过精准测试系统产生了大量对研发程序实现分析有价值的海量的数据并且可以随时追溯和分析将软件测试的价值进行了有效放大因此精准测试将大幅度提升测试的价值和意义推动测试行业进行深度的发展