对测试自动化的看法-来自微软讨论组的争论

转载:http://www.ltesting.net/ceshi/ceshijishu/zdcs/2007/0719/139415.html

说明:我没有百分百的转载该文件,部分摘要和重点标注

**************************

首先是一个人的吐槽,以下是详细内容

先说说为什么测试的人喜欢搞自动化。

1、自尊心。计算机科班出身的人都喜欢做开发(DEV)。做测试工作经常身不由己,于是做测试的人想方设法写些程序,以显示自己也会编程。结果往往是欲罢不能,测试自动化程序越写越多,越写越复杂。

2、为了出成绩。比如说测试自动化达到多少,程序覆盖率达到多少。觉得“用户不出问题是检验质量的唯一标准”,如果一个人可以做的测试,自动化却需要两个,或者三个,这是有待考量的

   他对测试自动化的认识也是个渐变的过程。刚开始想方设法自动化,后来到微软的Portal Media Center组后做了一个相当复杂的用户界面的自动测试。现在想想,用自动测试发现的问题基本上可以一个人用手工测试完成,最多再写些简单的测试辅助工具就可以完成。并且,Portal Media Center下一个版本出来后,用户界面完全改变,80%的自动测试程序都要改动。维护的人走掉后,后面的人又宁可自己再写一套,这样就造成浪费。

  后面提到了为什么放弃对测试自动化的幻想,和怎么进行低成本的有效测试(这个我感兴趣)。他的一个基本观点,不是说测试自动化不能测出bug,而是想问:一个比较复杂的测试自动化框架所造成的人力浪费,到底值不值得?如果不做测试自动化,是否能达到同样的结果。后面有提到和另一个完全自动化的小组的对比,提到自己组节省了人力成本。

  最后他提了四个观点:

1、不要指望自动化帮忙找bug。做测试自动化,往往在开发自动化的时候,该发现的bug就发现了。自动化开发完成后,想发现更多的bug就很难。

2、不要指望自动化对回归测试的测试贡献。因为,软件的特点是如果一次作对了,以后永远不会出错。当程序出现变动时,只要针对变动的部分测试就可以(这个我不能苟同);如果程序出现很大变化,自动化可能完全不能用了。

3、自动化不如测试工具加手工测试。不建议全面自动化,建议多做小巧灵活的测试工具。因为自动化往往需要自动判pass或fail,想想你如果测试用于生成www.microsoft.com的页面的产品,你如何判断页面框架生成的正确?很多东西是动态生成的,你很难确认所有的内容的正确性。

4、如果一个项目生命周期很短,自动化还有用么?与其去搞自动化,不如多理解变化,直接测试变化的东西。(有点绝对化了)

  他提了有效测试的4个方法:

1、测试人员的自信心可以建立在读程序的能力上看懂程序可以是测试工作非常高效,设计有效地test case,有30%的bug是读程序读出来的,而且relase后出问题,可以很快确认是否是bug,和问题出在什么地方

2、测试人员写测试程序的时间应该尽量最小化。30%读程序,20%写测试程序,50%写test case和运行case。工作重点在理解要求和客户需要,思考什么条件下会出错

3、测试人员要确认先测什么,后侧什么,哪些不测。

4、测试人员要多花时间参与设计。理解每个要求的影响。

总之,多写小工具,读懂程序是高效的测试方法

**************************

后面是批驳的观点

1、测试自动化,有利于被人拷贝学习;适于压力测试;

2、测试自动化对回归测试,可以提供一个完整的自动化测试集,可以保证修改基类或底层API等,没有破坏功能,也不需要人手工跑完所有的功能

3、自动化可以解决我们的测试问题:一个是自动化可以完成手工不能完成的任务,二是自动化可以替代手工重复的劳动。

4、自动化测试可以节省人力

5、功能测试根据被测对象主要分为三种类型:UI测试,command line测试和API测试。后两部分非常适合自动化来作为主要方法进行测试

6、需要思考什么应该自动化,什么不应该自动化,这都是有一定学问的。

7、做相对简单的自动化,合理的自动化

8、自动化测试的非常重要的一个目的就是保证没有回归问题

9、测试方法有很多,读程序是一个非常好的测试方法,但是我们需要更多地方法来对软件全面测试

10、搞自动化大多数是从黑盒测试的角度出发的。

********************

后来作者又做了一些补充

什么是自动化
我定义的自动化是指较大的框架。举例说,如果你要测一个API,这个API的其中一个参数是C# String,如果有必要测很多不同的Unicode值,当然写个程序测最快,最可靠。另外Stree/Performance测试都要写程序。我觉得这个不叫自动化,这是SDET的基本功。我也反对没有必要的自动化。比如,有些测试要检验Event Log的内容,有些人把.NET中读Event Log的库函数再打包写个自动化库,认为这样把原来需要五行完成的动作一行完成很酷。其实,你想想自动化库带来的维护问题比解决的问题还多。本来,.NET的文档很清楚,你的自动化库文档又不全,出了问题还得找源程序,还得有人改自动化库。麻烦不知道是少了还是多了。另外,我所说的手工测试包括写测试程序,但测试程序侧重的不是自动化,而是探索测试Exploratory Test.


自动化在测试中的地位下降


另外我观察自动化在测试中的地位下降。测试人员的大忌就是在测试开始把自动化作为首要目标。一般来讲,过去我们把测试自动化作为目标之一,总是想完成手工测试后,在有时间要做自动化。可是实际情况是,项目进度太快,根本没有时间做自动化。一般手工测试完成后,产品就发布了。

 

测什么不测什么

和PM讨价还价不是偷工减料。一般讲,在项目开始阶段,测试人员的发言权最低。很多东西测试人员是没法控制的。PM总想多加功能,即使现在没用,想着将来会有用。有的项目,Dev有很大的支配权,Dev可以加入很多他喜欢的东西。(很吃惊吗,现实就是这样)。测试人员只有在测试阶段讨价还价的份儿。

 

有人认为我说“软件的特点是如果一次做对了,以后永远不会出错。”很荒谬。我承认有点极端。我的意思是,你在测试时肯定要假设有些东西是对的,不用测的。比如.NET的库。测试完成了投入使用了一段时间后,就可以假定当前的软件基本符合要求,不需要进一步测试了。必须学会画一条测与不测的线,否则测试会无休无止。我们大多数人接受的项目肯定是前人基础之上的项目,新的版本出来了,我们肯定要假定没有变动的,没有涉及程序不会出错,重点测试变动的部分,分析可能会涉及的部分。具体讲可以用Beyond Compare比较程序的变化。

当然,这个假定在一定程度上是错的。前人做得程序可能会出错,.NET库函数也有错,如果不在当前测试人员的工作范围,这种错误是可以接受的。如果你能找出前人的错误,发现.NET库函数的错,说明你确实出色。但从往往时间上讲,你能做到这步的机会有限。当然,我发现的最得意的bug就是在产品中隐藏了五年之久,我讲出来都替微软丢人的安全漏洞。我发现这个bug就是读程序偶然读出来的。读的时候,脑子里多打了几个问号,然后动手一测,果然如我所料。

 

WhiteBox Test + Exploratory Test


我的测试哲学是WhiteBox + Exploratory Test。测试开始阶段要读懂要求,理解设计。然后是读懂程序,在程序中找问题。这就是WhiteBox Test。然后动手写一些测试程序,测试程序的原则一定要简单灵活但自动化程度不高。测试程序的主要目的是探索,手工探索,目测探索软件那里会出错。之所以要做探索测试,就是因为自动化要求对输入输出都要很准确的定义。输入好控制,可是没有探索测试,很难准确知道输出是否正确。自动化必须建立在探索测试的基础之上。就像用一只单发的步枪,一发一发精确打击敌人防御的弱点,不是用机关枪盲目扫射。单发的好处是,每打一枪你都要目测效果,然后调整子弹大小,射击的远近。如果像机关枪打出一百多发子弹,你会视觉疲劳,无所适从。自动化就像一只机关枪。

我的观点只是一家经验之谈,不是理论,大家可以借鉴,不要照搬。

关于,美国软件业大公司的人工成本是公开的,新闻里可以查到,平均大概是十一到十五万,当然包括各种福利,和管理成本。

本回复于:
2007-07-18 14:35:26 被【dlele】修改
发表时间:2007-07-18 14:12:09 9 楼:dlele
自动化是理想,手工测试是现实,我讲的是理想与现实的差距。这个差距不是我个人能力的差距,而是敏捷开发,产品周期加速,复杂度增加,相对人力资源有限所带来的现实造成的差距。

发表时间:2007-07-18 15:34:38 10 楼:dlele
说个具体的实例,最近在工作中遇到一个很头疼的bug。我们有个API,GetXXXURL(xxx, string locale, yyy),locale 是语言的字符串代码,Dev搞成了GetXXXURL(xxx, int lcid, yyy).。Lcid 是语言的整数代码。比如,中文的字符串代码是 "zh-CN",整数代码是2025。Web Service端只认字符串代码,结果2025被解释成为不支持的语言,URL返回默认英文1033. 由于系统设计是三层,每层都要改,很头疼。

这个测试是我们一个新来的员工测得,他是用VSTS写了一个自动测试,每次运行都通过了。原因就是他可能花太多时间搞自动化,没有认真理解要求,对要验证的返回值也不了解。自动化自然发现不了问题。如果他当初写了一个很简单灵活web based的测试工具,多做探索测试,我也可以很容易的帮他作些探索测试,问题可能早就发现了

 

posted @ 2012-06-19 22:27  宇月--测试开发梦想家  阅读(294)  评论(1编辑  收藏  举报