显示标签为“编程”的博文。显示所有博文
显示标签为“编程”的博文。显示所有博文

2010年5月31日星期一

如何做一个能害死人的自动化测试工具

你是一家大公司里不得志的程序员。和你同年进公司的那些人在核心业务上拼命工作,被客户骂,加班,交付,开庆功会,拿奖金。而你,不知道怎 么的被放到一个叫做“测试工具开发”的边角部门里,干着一些不疼不痒不影响公司业绩的工作。你恨。你要报复。你要拿回本该属于自己的一切。
现在我教你怎么做。
首先,你要启动一个自主开发自动化测试工具的项目。让老板们相信自动化测试的重要性并不困难,世界上有无数的文章和书籍在讲这件事,你们公司请的 咨询顾问一定也会说到这件事,这些都是你的帮手。真正难的部分是“自主开发”。你用得上一个百试百灵的招数。告诉老板们,一个自主开发的工具可以由自己来 维护和支持,只有这样才能把核心技术的命脉掌握在自己手里,而不用向别人支付维护支持的费用──小心,千万不要提到那些开源的工具,因为老板们万一真的弄 懂了“开源”这两个字的含义,你的整个大计划就泡汤了。拿IBM的RFT当靶子。除了后面我会说到的各种好处之外,IBM的咨询价格足以帮你吓到老板从而 启动这个项目。
然后,你要精心选择一个自动化测试执行引擎。你需要这么一个引擎,因为你不能自己去做一个──工作量还在其次,要是连这都能做,你也就不在这个边 角部门里郁闷了。同时这个引擎又不能太稳定,更不能太开放,这都是你大计划中不可或缺的要素。所以,你看,我说过了,RFT就是最好的靶子:它的开放程度 确保了你要花好几个月时间才能把它嵌在自己的工具里而且以后再也不会有别人尝试干这件事。而且,想想吧,当你跟老板们报告说你hack了IBM的软件从而 省下了licence费用时,他们该有多开心。
接下来,你要发明一套自己的测试脚本语法。沿用RFT的语法当然轻松,但这样使用它的人就会发现自己使用的其实是RFT,然后在该死的互联网上找 到相关的资料。不能让这样的事发生。始终记住,你的目标是让自己变得重要。你发明的语法应该基于XML。不仅因为实现简单,而且因为它能确保测试脚本无法 被阅读和重构,从而让使用这工具的人跪在你脚边求你支持。关于使用XML的好处,稍后我还会说到。
当然你不希望向领导演示时用记事本编辑XML。所以你得同时实现一个支持拖拽的测试用例编辑界面。把一个测试步骤表示为一个图标,把几个图标往测 试用例里一拖,一个测试用例就好了。别忘了,执行用例的功能也得在这个界面里实现。千万别为了偷懒而实现一个命令行来执行用例,这很重要。好了,现在你可 以去演示了,领导一定会喜欢的。“鼠标拖拽其实比键盘输入慢多了!”旁边一个傻逼顾问叫喊着。领导们不会听懂他的话。不用理会他,更不要尝试跟他争论,那 只会给你自己带来麻烦。
现在这个工具可以小范围试用了。那些麻烦的用户会抱怨:“我每次都要重复这几个同样的操作!我想把它们合并成一个步骤!”镇静。不要骂他们(尽管 你一直就想骂他们)。记得吗?让测试用例不可被重构是你大计划中的一部分。现在你要笑容可掬说。我们早就考虑到了这个问题,我们的工具可以把几个步骤封装 成一个更大的、具有业务含义的东西……嗯,姑且把它叫做“操作词汇”吧。现在我就来帮助你们做这个抽象和封装。当然了,操作也要用XML来承载,并且在提 供给用户时要先做一次编译或者打包或者加密,总之是不能让他们看到源文件。这样他们才能永远依赖你。
小范围试用很重要。你必须努力工作,帮用户写测试用例,帮他们封装操作,找你能找到的一切资源来帮他们,然后把投入二十个人月干出来的成果全都描 述成你的工具带来的神奇变化。放心,你只需要这么干一次(或者两次)。为了把这些愚蠢的家伙踩在脚下,有时你就得先纡尊降贵。这是策略。
试用结束,你回到自己的办公室,这些愚蠢的用户还会不停地找你帮忙更新被封装的操作。这是设计中的一环。现在你应该做一个中央服务器,把他们的测 试用例和操作全都保存在上面,让他们每次执行测试都从服务器上取用例脚本。然后告诉他们,这叫云计算,这叫测试工厂。当然这些傻瓜不会懂得云计算是什么玩 意,但他们会发现你帮他们更新操作的速度变快了,然后他们就会认为这就是云计算带来的效果。把他们感谢你的话搜集起来,很快你就会用得上。
现在万事俱备,可以向老板汇报了。这次汇报的重点是两个关键词。这也是今后宣传这个工具时的常用语。一定要背熟。
关键词1:“第四代自动化测试工具”。你要告诉老板,用Java啦Ruby啦C#啦这些编程语言来编写测试用例,那是第三代(前两代是什么就随便 你编吧)。第四代的特征就是“基于操作词汇”──也就是图形界面上可以拖的那个玩意,尽管你知道它背后就是一坨不能读、不能改、连SVN合并都困难的 XML。
关键词2:“测试工厂”。这时候把界面打开,连上中央服务器,让老板看试点项目的测试用例。“坐在办公室就能知道所有项目的测试进展情况。”这句 话是杀手锏。老板们一定会喜欢,而且会帮你推广这个工具。
只要被推广到更多的项目组,你就会变成红人。现在前面那些设计决策的重要性就逐渐体现了。因为测试用例不可重构,任何一个项目想要正经用你的工具 都得找你帮忙做操作词汇,为此你就可以成立一个部门,拉更多的人来给你打这份苦工,自己当领导。但你又怕别人真的用得太多太频繁,那样的话你就得疲于支撑 了。放心,因为RFT不稳定,因为每次执行都要连到中央服务器来取用例,因为不能通过命令行或者Ant之类的办法把它放进持续集成,还因为用鼠标拖拽就是 比用键盘慢得多,自动化测试的进展会非常缓慢,你大可以安心享受自己的新办公室。
先别急着享受,好事才刚开始呢。那些深思远虑的设计决策确保了很多项目不会认真用你的工具。这时候作为推行先进自动化测试理念的红人,你正好可以 在老板耳边吹吹风,让他们强迫所有项目使用。强迫的方式有很多,但你必须记住的手段是给测试人员做职业技能鉴定考试:必须学会用你的工具才能评级加薪。这 招的关键在于一箭双雕:不仅可以强迫他们使用,而且确保了他们没时间没动力去了解别的测试工具──你当然不想这些傻瓜突然冒出来说“这个开源的工具比我们 自己的好用多了,而且还有那么多社区高手在维护和支持,为什么不用它”,对吧?
强行推广之后,你接到的支撑需求肯定会剧增。这时你得好好培训一下客服的小弟。要让他们分清用户的来头。如果是老板重视的项目,如果办公室离你或 者离老板很近,就得大力支持。如果来自什么边远山区的支撑需求,那就把它撂到一边凉快去吧。这些边远山区经常会提些奇怪的需求,例如“能不能不连中央服务 器执行用例?我们这里无法连通公司内网”。让小弟们直接回复“不行”就可以了。无法连通公司内网的人同样无法有效地跟领导告状,不用担心他们。
好了。现在你已经从一个边缘程序员成功晋升为公司的红人。不仅有一帮小弟鞍前马后,而且一大帮项目头头们都得求着你优先支撑。这快感,又岂是交付 一两个项目、开一两次庆功会所能比拟的?恭喜你。你不仅改变了自己的命运,还很有可能改变整个公司的命运呢。
噢,差点忘了最重要的……千万别用你们的测试工具来给自己的项目做自动化测试。微软那帮傻逼把这种行为叫做“吃自己的狗食”,可你做的是毒药,吃 下去会害死自己的。切记,切记。

程序员的十大烦恼

10. 注释 — 只解释了“how”却没有解释“why”

入门级的编程课程通常会教育学生们写代码前先写注释、而且要尽量多注释。这种教育的出发点是“多注释肯定比少注释好、少注释肯定比没注释好”。可不 幸的是,很多的程序员把这当成了一种任务,对每一行代码都注释一下。这就是为什么会经常看到像Jeff Atwood在他的博客文章Coding Without Comments提到的代码:
r = n / 2; // 让 r 等于 n 除以 2

// 当 r - (n/r) 大于 t 时进行循环
while ( abs( r - (n/r) ) > t ) {

r = 0.5 * ( r + (n/r) ); // 设置 r 等于 r + (n/r) 的一半
}
经过这样的注释,你否明白了这段代码是干什么的?的确,我也没明白。问题就在于,虽然有大量的注释,可它们只是描述了代码是干什么了,却没有说明代 码为什么要这样写。
现在,请看一下我们采用另外一种方式对同一段代码进行的注释:

// 使用牛顿-Raphson算法求n的平方根近似值

r = n / 2;
while ( abs( r - (n/r) ) > t ) {

r = 0.5 * ( r + (n/r) );

}
这就好多了!也许我们还是不能完全明白这段代码的作用,但至少是有了一点方向了。
注释是用来帮助读者理解代码的,不是用来解释语法的。我可以大胆的认为,读者对for循环的工作原理是了解的;所以没必要写这样的注释:“// 对客户列表进行for循环操作”。读者不明白的是你的代码是做什么用的,你为什么要采用这种方式实现它。

9. 干扰

很少有程序员能在眨眼之间从一种活动中转换到编程的状态中。通常情况下,我们更类似于需要慢慢启动的火车,而不是能突然加速的 法拉利; 我们需要一定的时间才能进入工作状态,一旦我们进入稳定有效的工作状态,我们的工作效果和产出会很丰硕。 不幸的是,当思路不断的被客户、经理、以及你的同事打断时,你的大脑很难进入编程的状态。
当我们干一件事情时,有太多的琐事需要我们放在心里,我们需要先放下这个事情,处理那个人事情,回头又干这个事情,还不能有差错。这些干扰会中 断我们的思路,而重新整理清楚思路又要你花费大量的时间,这是让人懊恼的、没有比这更让人泄气、让人有挫折感的过程了。

8. 范围蠕变(Scope creep)

来自 Wikipedia 的解释:
范围蠕变(Scope creep) (也称作焦点蠕变(focus creep),需求蠕变(requirement creep),功能蠕变(featurecreep),以及其它一些乱七八糟的演变词语),指在项目管理里项目的需求变更失控。当一个项目的范围没有明确 的定义清楚、没有文档化、不受控时就会出现这种现象。 这通常被认为是一种有负面影响的事情,应该尽力避免。
范围蠕变通常会把一个简单的需求变成一个复杂惊人的需要大量时间的巨无霸。那些负责需求调研的家伙们只需要敲几下无辜的键盘就能把事情变成这样:
  • 版本 1: 显示这个地区的地图
  • 版本 2: 显示这个地区的地图,要三维立体
  • 版本 3: 显示这个地区的地图,要三维立体的,而且能够使用它作为飞行导航图
晕倒!一个本来30分钟能完成的任务变成了一项要几百人/天才能完成的超级复杂的系统。更糟糕的是,大多数情况下,需求变更是发生在开发阶段 的,这样一来你需要重写代码,重新回归,有时要把前几天才开发的代码删除。

7. 管理者 — 完全不懂编程

管理工作不是一种简单的工作。人是一种让人很讨厌的动物;我们善变、喜怒无常,我们都自以为天下第一。想让这样 的一群人都感到满意和团结,你需要付出像山一样大的努力。然而,这并不意味着管理者就可以在对下属的工作毫不理解的情况下进行管理。当管理者对我们的工作 没有一点知识概念时,后果只会是需求频繁变动,不现实的工期,普遍的挫折感(管理者和开发人员)。程序员们对此的抱怨相当普遍,这也是产生争执不合的根源 (就像一个欢闹的卡通片).

6. 写文档

在说这个条目之前我先承认,我们确实有很多的文档生成工具,但据我的经验,这些工具都是只适合生成API文档,以供其他程序员参考。如果你开发的软 件是平时人们每天都要用的,你必须要写一些外行人(例如你的实施,客服等)都能理解的文档手册。
我们可以很容易的看出,有些事情程序员们极不愿意去做。你可以简单的回顾一下所有的开源项目。人们百折不挠的对这些项目的一个索求是什么:文档。
我敢打保票的说,不管在哪里,至少会有一半的程序员当要求写文档时会说:“不能让其他人去写吗?“。

5. 程序 — 缺少文档

我可从来没说过我们程序员是说一套做一套的人。程序员们经常会在他们的项目里用到第三方的类库和应用。于是,我们需要文档。 很不幸呀,就像我在第6条里说的那样,程序员们痛恨写文档。这戏剧性的事情发生在我们自己身上。
当你需要使用一个第三方类库时发现,至少有一半的API无从知道是干什么好用的,没有任何事情比这个更打击人的了。函 数poorlyNamedFunctionA() 和函数 poorlyButSimilarlyNamedFunctionB()有什么区别?在我使用 PropertyX 属性前是否需要测试一下它是不是 null 值?我估计只有通过自己的测试和报错才能弄清楚!可恶。

4. 硬件

任何一个曾经被叫去调试一个数据库服务器上奇怪的宕机现象,或是被叫去解决RAID驱动器不能正确的工作的问题的程序员,当发现是硬件问题时,都会 痛苦不已。人们有一种普遍的误解,认为程序员就是搞电脑的,他们肯定知道如何修理电脑。不可否认,有些程序员确实是个全才,但我估计,绝大部分程序员都不 知道,或者根本不关心当程序被编译成机器码后如何工作的。我们只关心做出来的东西是否符合需求文档,这样我们才能集中精力去解决这上层的任务。

3. 含糊不清

“网站宕机了”. “XX功能工作不正常”。 处理含糊不清的任务是种痛苦。 每次当非程序员被要求重现他们所遇到的问题时表现出的愤怒都让我吃惊不已。他们似乎不太明白,仅仅一句”它宕机了,修复它!”是无法让我们开始工作的,我 们需要更多的信息。
软件的运行是(大部分情况下)有迹可寻的。我们也乐见与此。请迁就我们,帮我们指出是在哪个阶段,什么情况下出的问题,而不是简单的说一句”修复它 “。

2. 其他程序员

程序员经常和其他程序员合不来。诧异吗,但这是真的。这方面的事情我可以轻松的列出十大条,讲细点甚至可以单独写篇博客,所以这里我只列出几个常见 的、让其他同事感到懊恼的程序员的特征:
  • 脾气暴躁以至态度极不友好。
  • 不能明白什么时候该去讨论系统的架构,什么时候是应该去动手去做。
  • 无法进行有效的沟通,使用易于误解的专业术语。
  • 自己的事情处理不好。
  • 对要做的程序和项目缺乏兴趣。
那么,这最后的,但不是最糟糕的,序号为1的让程序员们烦恼的…

1. 自己写的代码 — 6个月以后的


Don’t sneeze, I think I see a bug.
回顾一下自己以前写的代码,是否也会愁眉苦脸?当时怎么会这么愚蠢!怎么能编写成这样的东西!烧掉!丢到火里!
哈,好消息。你并不孤单。
现实是,软件技术界是一个不断变化的世界。今天被看成是最好的方式,明天也许就会过时。我们不可能写出完美的代码,因为判断我们的程序好坏的标准日 新月异。这令人很不爽,你的作品,今天看来是那么的完美,但也许不久之后就会变成被人嘲笑的对象了。真是让人沮丧,因为不论我们如何努力的学习最新最棒的 开发工具,设计,框架,以及开发方法,我们总是比最新的技术发展趋势慢了一拍。对于我来说,这是做一个程序员最苦恼的事情了。我们不断的升级技术,是为了 让软件更好,但却禁不住感到,我就像一个做沙 毯(sand-painting)的和尚。
好了,全都给写出来了。这十大让程序员烦恼的事情。依旧,如果你觉得我的文章里有什么疏漏的地方,请让我知道,欢迎留下评论!
7
0