软件测试

收藏 / 订阅

论测试用例的有效更新及杀虫剂悖论

  在2014年,我们团队试图推动一件事情——把产品后端(客户、客服、生产制造等等)出现的问题,反向增补为测试用例,扩充到测试用例库中,避免后续重复的出现问题——早些年柳传志在创业类的节目问一个选手,作为老板,你每天第一件要处理什么事情。选手按照自己的优先级和重要性说了一堆。柳传志说:你应该优先处理反复出现的问题。

  复盘论是联想的看家本领,这也仅借用一下这个意思。

  尝试这么做了一段时间,把已经形成的反向增补测试用例,推广到相关测试用例库,然后在实际中执行和检查,一段时间大致有如下几种现象:

  一、绝大部分,根本不执行。

  二、小部分,有选择的执行。

  三、小部分,重新编写,纳入到原有的测试用例中执行。

  第一种现象的原因有很多种,光明正大的以及不那么光明正大的——我更愿意认为是下文会提到的原因。

  对于第二、三种现象,我被反问的问题是:如果没有按照我们写好的格式,单独的拉取出来并有执行结果,那么就无法通过人工或者工具来统计这些新增的用例是否被执行过?数据拿不到,由此就不能判断大家在测试方面是否有优化和进步。

  先暂时放下复杂的执行和检查的针对性问题,仅仅从测试本身——一个问题出现,是否要把这个问题出现的步骤、缺陷的场景,类似可能出现的逻辑,都写在测试用例中,在后续的项目中,反复的执行?

  答案是不一定——测试设计是一个领域的高手才做的事情,而不是单纯的有一说一的死板描述。或者换个说法,测试用例是测试工作的核心,是充满创造力的事情,而不是可以有一个什么绝对正确的方法论,就可以一劳永逸搞定的。

  列举一些不同的例子,来展示表象和本质之间的复杂关系:

  一、问题产生的原因,它的频率是什么?

  EX1——如果问题是因为开发人员错手把一段代码注释,或者因为各种笔误产生的缺陷,发现之后修改代码重新编译,问题解决。

  那么这种问题的概率就是一次性的。这个缺陷修复后,再次出现的概率就非常小——除非这代码是别人留下来的,然后换个开发,又胆大的修改了一些老代码。然后自己的组长还没有代码审核,直接提交了。那么这问题才有可能重见天日。正常针对这种情况,是没有必要写上几条case,后续的项目每次都执行的。

  EX2——有一个资源,多个模块都会调用,而且这几个模块业务逻辑耦合的较为紧密,而且联调一直做的不好,甚至因为解决缺陷还发生过多次扯皮到底是你的我的他的等破事儿。

  那么这种问题应该是有概率出现的。这个缺陷修复后,不仅仅这条缺陷产生的操作后续要增补,甚至这几个模块调用资源的一些方法,之前没有太过注意,后续也要适当的加强测试设计。

  二、问题涉及的组件、分支流、版本多少情况?

  EX3——在嵌入式设备中,“兖”字无法显示,显示为“口”。问题的原因是在嵌入式设备内存较小时,可能字库采用的是一级字库,那么可能所有的二级字库的文字都会显示异常。

  2.1、具有唯一性:

  如果全公司使用的都是统一的font字库。那么只更新这个font,所有嵌入式设备的二级字库问题都会得到解决,这个缺陷一次性修复后,就不需要纳入到测试用例。

  2.2、存在多分支:

  有好多的外包项目,要显示不同字体、不同国家的语言,简而言之就是有好多的分支font存在。

  2.A、如果有好的全面的缺陷分析和波及通知方式,大家各自修复,也不需要写到测试用例中,因为是一次性的行为。

  2.B、如果有一定的缺陷知会方式,不同的分支流可以感知,但是时效性较差,那么这事儿就要固化在测试用例中,执行上一段时间。

  2.C、如果没有一定高度的缺陷知会方式,大家基于一个流,后续各自开发维护,那么肯定要写在测试用例中,甚至要组织小的专项测试,来集中暴露不同版本的问题。

  三、是否有强顺序依赖关系?

  EX4——如果一个问题,和业务逻辑顺序强相关,需要经过必须的1、2、3、4、5等步骤,才会导致一个必然的bug。从测试人员的本职工作来说,能发现这样的bug(俗称神级bug),简直是自己对业务知识了如指掌的最好表现,甚至可以作为自己的江湖轶事不断的吹嘘下去。

  但是,这种bug,回归测试之后,真心不用把它形成测试用例,让后面每一个项目,都去反复的执行——强业务顺序关系修复了,后续自然不会出现。至于是否有其他隐含的逻辑,是否需要进行其他的分支状态测试,那是另外一回事儿。

  四、验证条件具不具备?

  EX5——各种复杂的外厂商对通问题。

  此类的bug,多是在现场,通过抓包分析、码流分析,然后不停的替换临时版本才能修复。如果是协议标准化方面,可以在测试环节加强,如果是各厂家飞速发展中产生的非标协议,谁也没办法,只能现场解决。

  所以,你可以写一条,A设备,需要接入甲厂家的XXX产品/乙厂家的YYY产品,进行ZZZ功能测试。但是,这些测试用例,不具备可执行性。

  对于此类的互联互通问题,最好的解决方案是,找到一个设备型号很多的客户,维系好客户关系,发布新产品的时候,自己带台设备过去,联调就搞定了。

  这个例子需要的是此类问题的测试策略和方案,而不是生硬的补充无法执行的测试用例。

  EX6——长时间运行后导致的问题,比如XX设备运行三年后,器件老化,或者版本、文件无故丢失。

  这就分别涉及了可靠性和flash反复读取,碎片和黑天鹅事件等。

  测试这类的问题,要在短时间内模拟三年的效果,只能是通过上测试设备量,以及通过公式推导大概的稳定性。写在测试用例里面,在日常的工作中,显然是无法实现的,还不如老老实实的做专项测试,集中人力、设备等等。把此类问题一次性搞定。

  以上是由缺陷反向提炼测试用例的第一个概念——从问题中汲取经验,避免以后再犯同样的问题,思路和逻辑都是对的。但是绝对不意味着比着葫芦画瓢,有的问题可能就是一次性的,有的问题背后可能有更大的问题,有的问题你知道但是还只能看概率和投入产出比,或者尝试通过其他方法来解决。

  第二个概念和团队和人有关系,一个团队真实的运作,往往只有内部人知道。同理,问题产生的真实原因,往往是一个团队内部被隐藏的,所以是否能写出精准的测试用例,也只有团队内部自己人才能搞的定。这就意味着如果测试用例更新不是自己部门内部主动触发,而是第三方部门(质量部门、流程部门)驱动的,那么就注定只会拿到一些样子货。

  五、问题产生的真实原因,会让你写的case完全不一样。

  举个例子:软件客户端解码无声音。

  但是如果你增加一条测试用例:“软件安装/更新成功后,查看编解码状态是否正常,预期结果:图像、声音正常。”拿到这条用例的人会认为编写人秀逗了,这么基本的东西早就测烂了,还正儿八经的新增,最后的结果要么是不执行,要么就是无脑打钩通过。

  但这个最基本的问题,会一次次的出现,背后自然有深层次的东西存在。

  EX7:兼容性问题,某音频格式经过翻转,未考虑兼容性。

  早期版本的音频码流发过来,解码失败,这种无声音就是标准的兼容性问题——所以增补测试用例,就要写成,和各产品各版本进行兼容性测试,看视音频是否正常。

  看起来是不是抓到实际问题了?但是这种用例也是理论上的全面用例,实际也不可能会被执行(参考六、测试用例的可执行性)——历史产品可能有二十几个,历史版本可能也有二十几个。你动动嘴皮子互联互通,且不说是不是测试环境有这么多设备,就是在一切顺利的情况下,版本更换并测试一轮,也要个几个工作日。在测试资源、时间一贯紧张项目背景的下,这条case会被执行才怪。

  结合上面的观点,看编解码组件的版本是否有变更,然后再决定是否执行编解码不同版本之间的兼容性测试,然后通过等价类,选取产品和版本,让测试执行在半个小时到一个小时可以被执行,才是正解。

喜欢 (88) or分享 (0)
首页  上一页  12345678910  下一页 尾页 共73条记录 3/10

网友评论:7

  1. 小编 1年前 (2015-03-22) #5

    软件测试入门 :mrgreen:

留言主题 *

您的姓名 *

电子信箱:

电话号码:

请你留言: