解析产品测试的常见误解

对于产品测试,往往存在许多误解,下面,我们就来说明一些关于测试的常见误解。如果你在编写测试时也存在这样的误解,那么本文能帮助你和你的团队来判断何时适合测试,何时不适合测试。

  误解一:测试可以表明我的代码是正确的!

  虽然这种误解在直觉上是正确的,但是你确实无法依赖测试来建立任何形式的具有严格正确性的标准。每当你编写了一个测试,你就已经测试了程序中的一种可能情况。当程序中存在许多单元时,或许存在无限多种(或是多得难以应付的)可能的情况需要测试时,那么测试所有可能情况是不可行的——因此,典型的对策是测试一些出错情况、边界情况以及若干恰好确保一切正常的“常规”情况。

  如果你的目标是正确性,那么上面谈到内容还远不足以满足要求。尽管程序仍存在许多bug,但是开发一套总是可以通过的测试还是相当容易的。然而有些bug根本不可能通过测试检查出来——其中竞争条件和包括并发性在内的其他错误都是经典的例证,即使你已经对调度程序进行控制,然而可能的交错操作的数量增长是如此之快,以至于可靠地测试很快成为了不可能完成的任务。

  因此,测试无法展示所有情况下的正确性,除非是在最普通的情况下,那样我们可以在测试中完全指定程序单元的行为。对于这些普通情况,往往不值得从一开始就编写测试;之所以说这些情况实在是太普通了,是因为我们所要测试的代码本身就是微不足道的!通过为那些微不足道的代码片段编写测试只完成了一件事,那就是增加维护开销,并且为测试机增加工作量。

  既然测试也只是一些代码,那么在你的测试中同样可能存在bug。如果编写测试与编写代码的是同一个人,那么他们往往可能错误地实现一个程序单元,然后编写一个确保那个错误行为能够通过的测试。此问题的根源在于开发者误解了规格说明,而不是实现过程中犯下的小错误。

  如果你确实需要保证正确性,那么请对你的代码进行形式化验证(目前的验证工具要比过去好得多)。如果你不需要保证正确性,那么编写测试就可以了。须牢记,编写测试的作用就如同烟雾报警器对于火灾的作用一样,其实它并不能检测出各种各样的问题。

  误解二:测试是可执行的规格说明!

  基于以下几个原因我认为这个观点是错误的。先来看看在我的字典里规格说明的定义:

  一组需求,用于界定对于某一对象或过程的准确描述。

  因此,如果我的代码符合规格说明的要求,那么它就应该是完全正确的,因为规格说明准确界定了代码的行为。如果说我的测试是规格说明,那么必须进而证明测试的正确性。正如我们已经讨论过的,测试并没有做这样的事情,因此测试不是规格说明。

  让我们看下实际情况,假设一名开发者通过阅读测试用例可以推断出某个函数的预期行为,然后引入一大堆含混不清的测试用例;如果测试用例不够全面,那么我们可能最终推断出错误的结论,有时可能与预期行为仅有细微差别。

  此外,对于测试用例并未进行一致性检查。也就是说,由于开发者失误或误解,因此你的测试可能实际“指定”了一个非预期的行为。这可能会导致在你的测试中出现一些矛盾,因此也可以说你的规格说明中出现了矛盾。

  随机测试软件,例如QuickCheck,会让编写测试的工作变得非常简单,就像本应包含的布尔属性一样,而且该软件会为你生成测试用例。该软件使得测试更接近于可执行的规格说明,不过它仍然不会对属性进行一致性检查。

  误解三:测试会让我们拥有良好的设计!

  当让一个糟糕的设计可以测试时,此设计仍然具有改进的可能,因此测试不是优良设计实践的替代品。当为系统接口编写大量的测试时,实际上是增加了开发者投入在那些接口上的“工作投资”。当这些接口不再是最佳选择时问题就会随之产生,即开发者已经为那些接口编写了大量测试。改变接口也就意味着改变所有与之配套的测试。由于测试与那些接口紧密耦合在一起,因此其中大多数测试将必须被废弃并重写。既然大多数开发者的成长依附于他们所从事的工作,这会导致在项目的生命周期中对于那些次优的设计决策踌躇不前,尽管那些决策不是最适合的。

  在这里给出的解决方案是,只有在你编写了一系列原型之后再开始着手测试。这样你就不必为测试那些可能在稍后会被大量重构的代码而焦虑。对于开发者和测试机而言,所做的一切都是在增加工作量,而且当需求或接口改变时,开发者必须销毁数小时的工作成果,这会使他们更心痛。而如果你不等待而进行了测试,那么你的测试实际上会导致糟糕的设计,因为开发者将不愿进行任何重大的重构。

  此外,让代码可以测试很困难。通常人们仅仅为了让测试更加容易而采用有问题的设计决策;尝试大量模拟接口实现,或者是编写具有大量代码的测试用例,以至于测试用例代码本身几乎也需要测试,这些做法都暴露出对于抽象的泄漏(mock对象和stub往往会经受此问题的折磨)。

  误解四:测试会让更改代码更容易!

  测试并不总是让更改代码更容易,然而,如果你正在对底层接口实现进行修改,那么测试可以帮助你捕获新实现中的功能衰退或非预期的行为。如果你正在对程序的更高层次结构进行修改,然而这种对立的情况则是更普遍的现象。测试通常与更高层次接口紧密耦合。改变这些接口就意味着重写测试。在那种情况下,你让自己活得很辛苦——你将必须重写那些测试,从而给自己增加了更多的工作,而且之前的旧测试对于确保你没有引入功能衰退而言无能为力,这意味着测试根本帮不上忙。

  所以,不写测试?

  我没有说你不应该编写测试。对于提高信心以及阻止软件功能衰退而言,测试是一种有价值的方式。然而,测试无法统一带来优良的设计、正确性、技术规格说明或者轻松地重构,至于原因如上所述。过度使用测试会让开发变得*更难*而不是更容易。

  同样,根本不验证代码会让质量保证无从谈起,不过会让快速构建原型更轻松。测试在质量保证与灵活性之间引入了一个权衡问题,所以我们必须在二者之间做出适当的妥协。

  关于作者

  Liam O'Connor曾任职于Google,并任教于新南威尔士大学。最近,他开始为NICTA的l4.verified项目工作,此项目是对操作系统内核进行形式化验证,NICTA是澳大利亚领先的ICT(Information and Communications Technology,信息与通讯技术)研究机构。

 

时间: 2024-12-02 12:48:59

解析产品测试的常见误解的相关文章

对视觉设计作用的常见误解

原文:Common Visual Design Misconceptions 最近,我有机会研究对视觉设计作用的常见误解,这些误解仍然盛行于行政主管.产品主管,工程经理和市场专家中.设计团队成员如何说明这些认识是错误的?又该如何向同事和老板展示视觉设计真相? 视觉设计师在特定产品领域或职业生涯中会面对各种困难,但有三种误解频繁发生: 视觉设计是美化产品: 突出显示能改善视觉设计: 可以分割评估视觉设计. 视觉设计是美化产品 这种信条可能起源于工业时代的设计理念引入.从那时起,产品以前所未有的方式

关于大数据的常见误解

我时常听创业者说自己的公司每天会生产/记录很多的数据,虽然他们暂时还没想明白怎么用这些数据,但把这些数据都先存起来了.他们经常还说,通过这些数据他们的产品/服务将得到很大的提升,仿佛这些数据就是公司的救世主一样.我不想讨论这种观点正确与否,但想在这里解释两个关于大数据的常见误解: 一.数据不等于信息 经常有人把数据和信息当作同义词来用.其实不然,数据指的是一个原始的数据点(无论是通过数字,文字,图片还是视频等等),信息则直接与内容挂钩,需要有资讯性(informative).数据越多,不一定就能

WiFi的十大常见误解

WiFi日益成为全球互联网连接的首选模式.根据博客网站Gigaom发布的信息, 到2020年,将会有240亿台设备连接到互联网上.而绝大多数设备将会使用无线的方式访问互联网.尽管越来越多的人知道WiFi,但是其实际上是如何工作的却并不为多数人所知.即使在IT专家圈中,关于WiFi网络的某些事实也往往被误解.下面就列举业界关于WiFi的十大常见误解.   1.共享媒介 无线电信号在每一个接入点(AP)被编程以在单一通道上运行.在这单一通道内,多个客户端可连接并通信.所有使用它的客户端分享该单一通道

列举业界关于WiFi的十大常见误解

绝大多数设备将会使用无线的方式访问互联网.尽管越来越多的人知道WiFi,但是其实际上是如何工作的却并不为多数人所知.即使在IT专家圈中,关于WiFi网络的某些事实也往往被误解.下面就列举业界关于WiFi的十大常见误解. 1.共享媒介 无线电信号在每一个接入点(AP)被编程以在单一通道上运行.在这单一通道内,多个客户端可连接并通信.所有使用它的客户端分享该单一通道媒介. 然而无线电系统根本的问题是,一个无线站不能在发送的同时收听,因此,也不能检测到碰撞.鉴于此,802.11规格的开发人员创建出一个

《IPv6精髓(第2版)》——1.4 常见误解

1.4 常见误解 既然IPv6拥有如此多的优势,那么就很自然地会问到"为什么不部署IPv6呢?"在与客户交流时,经常会发现他们对IPv6都有类似的误解,使得他们不愿意考虑IPv6,其中最常见的误解如下所示. "引入IPv6会给当前的IP网络及业务带来风险." 这种顾虑是毫无事实根据的.制定IPv6标准的一个重要考虑因素就是创建一种允许两种协议和平共处的融合机制.IPv6既可以与IPv4同时使用,也可以独立于IPv4使用.完全可以在保证IPv4传统业务不受影响的情况下

Java核心技术卷I基础知识1.5 关于Java的常见误解

1.5 关于Java的常见误解 在结束本章之前,我们列出了一些关于Java的常见误解,同时给出了解释. 1.?Java是HTML的扩展 Java是一种程序设计语言:HTML是一种描述网页结构的方式.除了用于在网页上放置Java applet的HTML扩展之外,两者没有任何共同之处. 2.?使用XML,所以不需要Java Java是一种程序设计语言:XML是一种描述数据的方式.可以使用任何一种程序设计语言处理XML数据,而Java API对XML处理提供了很好的支持.此外,许多重要的第三方XML工

讨论几个优化上的常见误解

摘要: 搜索引擎优化进入中国也不过短短的5年的时间,而优化人员却是一直在激增的,优化人员的质量参差不齐,有的人看过个关于优化的教程说自己已经懂真正的优化,甚至有的大言不惭敢 搜索引擎优化进入中国也不过短短的5年的时间,而优化人员却是一直在激增的,优化人员的质量参差不齐,有的人看过个关于优化的教程说自己已经懂真正的优化,甚至有的大言不惭敢接单子,当他们发现以他们的能力无法做好关键词的排名就死马当活马医使用黑帽方法.而有的人则真正的系统学习过优化,他们才是真材实料的优化人员. 同时我们可以发现目前并

独立游戏好做吗?十个常见误解分享

独立游戏好做吗?相信在很多人看来,独立游戏的开发成本和难度均低于3A大作,但独立开发者Kee-Won Hong在为Gamasutra撰写的一篇评论性文章中指出,游戏行业对独立游戏制作的误解普遍存在,他在文章中分享了关于独立游戏制作的10大常见误解. 10.独立游戏比3A游戏开发压力小. 事实并非如此.如果你以制作独立游戏谋生,那么几乎得为此耗尽精力.你需要每分每秒都思考自己的游戏,自己的公司,以及怎样赚钱.就算你兼职创作游戏,也肯定半点闲余时间都剩不下来了. 9.独立游戏比3A游戏开发容易. 确

10个对于网页设计的常见误解

随着技术的发展和音乐编曲软件的普及,有些音乐产业的从业者说"现在人人都是DJ了".其实这句话套用在网页设计领域也非常合适,现在越来越多的人认为人人都可以做网页设计师了,似乎在很多人看来设计网页是非常容易的事情.下载Adobe的Dreamweaver,简单做个导航栏,甩个Banner 上去,随手画出几个功能区,放上图片文章就是网站了.这是网页设计?当然,很多人就是这么做的. 但是真正的网页设计并没有这么简单,下面就来看看网页设计的10个常见误区,这些误区你有吗? 1.谁都可以做好网页设计