Tip(Testing in Production),即线上测试(或称为生产环境上的测试,为了简化,后面所有地方都使用“线上测试”)是我在博客中多次希望提及的一个主题。关于它的一个非常好的介绍可以看下Ken Johnston’的文章:《线上服务测试博客之章节1:摘要》,这是我和Ken、Ravi Vedula一起合作的关于“线上服务测试”文章摘要的最新版,曾发表在ThinkWeek上。如果你不想花时间阅读那篇文章,那么我用一句话来总结下:
尽可能地利用线上环境,即数据中心和真实的用户,来测试我们的产品与服务,因为我们的系统总是如此复杂,以致于很难在测试环境中测试(试想一下那各种的分层,各种依赖和各种集成),同时我们几乎不可能在测试环境中为系统的运行环境建立测试模型(试想一下软件的规模、用户的多样性和场景的多样性)
当然,远远不止这些内容,所以去好好看看Ken那篇出色的博文吧,不过,假如你很着急,我也希望我的简单总结能帮到你,不让你因为不了解背景而感到困惑。
当不可抗力遭遇不动体
我曾经为钢铁厂写过一个自动化热轧机的软件。一种热轧机有多个(通常说是4个)连续的台子,每个台子由一组几吨重的像洗衣店的绞拧机一样的钢轧辊组成。一个烧得通红的,温度高达2400华氏的,10吨重的钢板,朝着辊间距离小于钢板厚度的第一组钢轧辊快速前进,接着进入距离更小的钢轧辊,就这样一直到从另一头出来的钢要比原来薄的多,宽得多(记得质量守恒),可以用来做罐头、汽车门或者各种管子。
我写代码来确定辊间距离,以达到产品原本要求的厚度和属性(亦称为二级体系),但机器的实际运动是由更多基础的我们称之为一级体系的逻辑编程完成的。所有人——无论采用一级,二级,用户界面还是其他体系,都曾用相同的方式开发软件。我们拿到说明书,编写代码,用内部的模拟器检验,然后聚到一起用模拟器检验集成的产品,最后实地试验。
你可能已经注意到我们不是一个软件公司,和这样一群工程师一起测试我们的代码,他们中的大部分人从来没有听说过专业软件测试,几乎完全不懂瀑布模型,敏捷开发,统一软件过程(RUP)或其他软件过程。我说到我们曾直接在现场试验,那些程序毫无知觉地开始演练,简单地驱动那些设备并作出调整,但是大部分软件的变动是在整个系统已经开始运作并已经在生产实际产品的过程中。我曾看见(恩,我的确看见)软件的变动发生在一个烧得通红的钢板从火炉脱落,然后撞击第一个热轧机的瞬间,这是这个故事中最让我心惊肉跳的部分。Gus(化名),一个初级工程师不小心制造了一个离一误差(注:就是大小差一),导致第一个台子设置了第二个台子的辊间距离,第二个台子设置了第三个台子的辊间距离,以此类推。这就意味着第一下“咬”得非常的狠,但最糟糕的是第4个台子,一直在寻找第5个台子的辊间距但却没有找到,然后直接被设置为0。被第3个台子几吨重的钢轧辊稳稳抓牢并推进的10吨重的钢板,朝着牢牢关闭的第4个台子猛冲,发出巨大的撞击声,然后在我高架操纵台的座位上就看到一幕钢铁碎片横飞,火花四溅的壮烈场景。美国钢铁公司很不高兴。
教训:这不是TiP,这是一团糟。TiP不是放弃测试需求或是软件过程需求(一种你可能听到的比较普遍的错误是,一个开发经理或其他人问:如果我们直接在生产中测试,那我们还需要QA做什么?)。TiP需要运用我们一贯拥有的谨慎细微的质量敏感性,但采用一些新的(甚至有些冒险的)策略。我们仍需要成为专业人士,我们仍然是QA。
仅限VIP进入:曝光控制
由于被测系统的复杂性,即使你有一个标准的测试预发流程,你仍然需要在交付给最终用户使用前,保证系统的正确运行。或者有时候系统如此复杂,导致生产环境是它将运行的唯一场所(我知道我会因为这个挨骂,但即使这种情况能被技术性地克服,也不一定总是可行的),并且你们(测试和开发团队)需要看到系统部署到生产环境,而又不希望其它人看见。
如果你可以控制你的前端,你就能控制这些。比如,其中一个最有力的实现是在亚马逊,线上测试被植入网站描述框架。开发们只要使用一个简单的if语句就能显示或者说使用它,假如用户是在亚马逊公司的内部网站的话……非常简便!有助于新特征的开发,比如亚马逊视频点播网站(前身是Unbox)的预订系统,外部的用户就没有办法看见或者进入。当然,这个系统的缺点是当它准备公开上线的时候,它需要修改一些代码。关于这个我看到两个问题:1、代码本身发生改动的成本。2、代码改动的风险和是否真正在更改线上代码之前完成了所有测试的风险(它确实可能只是一个简单的if语句,但是QA是怀疑一切的,不是吗?)
亚马逊也能开启或关闭那些没有代码改变的“秘密”站点的公共入口,但这种方法的一个问题是它明显缺乏有力的保护,比如亚马逊新Unbox服务发布前耻辱的泄密事件就是一个很好的证据。注意那个泄密者曾经在亚马逊工作过,不要假定你的朋友们会一直友善。
教训:在内部和外部之间有分界线的曝光控制是一个非常有用的工具,只是不要指望它能保护高级商业机密材料,除非你原本就想这么做。
堪萨斯州话机消失的日子
如果你没有听到前面的部分,你可以看这里(当然,在你完成这篇博客的阅读之后)
我的公司曾为昂贵的“询问式”电信设备写过软件,做过大量的数据填充材料。使用的一种协议是TL1,这种协议规定为个人输入/可读的,但非常有规律,能有程序与它交互。电信设备是非常昂贵的装置,所以我们希望有权使用实验装置甚至偶尔是现场装置,收集我们查询的各种反馈,建立模拟器便于我们开发对应的代码。这就意味着最后的测试必须是线上测试,因为那通常是真正的电信交换机所在的地方。