|
一不留神,毕业后在软件公司里已经工作七年多了。期间经历了民企、国企、美国硅谷小外企和大型外企,做过正规软件开发(团队规模10人以上,有产品经理、开发人员、测试人员、文档工程师,客户为Cisco,出过2个以上的版本,代码量在20万行以上),功能测试、性能测试、测试自动化、测试辅助工具开发、国际化测试、本地化测试、兼容性测试、第三方测试、测试团队管理,对软件测试的理解也逐渐深入。特写下以下文字与大家分享。
l、软件测试的前途
软件测试在整个软件生命周期中是必不可少的重要一环,但是其在研发体系中的重要性要弱于软件开发和基础技术研究(如搜索引擎的搜索算法,图像的识别算法,统计分析模型等),要高于大多数外围工作(如安装部署、环境搭建等),很难拿高薪,工作强度适中。
做软件测试的同学们看了这个结论可能会很不爽,难以接受,但确确实实是我在工作多年、经历了多家公司后总结出来的切身体会。重要性不是某个人或者公司领导决定的,而是尤其工作自身的特点决定的。为什么测试工程师则经常抱怨自己的工作不受重视,而很少有架构师抱怨呢?因为他们的工作内容门槛高,可替代性低,一般人把他放到那个位置上也干不了。
拿大多数软件公司来说,软件开发和软件测试是两个最常见的工种,拥有最庞大的工程师群体。一般来说,开发工程师比测试工程师可以拿到更高的薪水。核心开发工程师的工作内容技术门槛比较高,可替代性比较低。一个明星产品的原型,或者内核,往往也就是一两个人写出来的,Linux内核,JBoss,Struts,Spring,Hibernate...太多太多这样的例子。虽然说一个技术原型和成功商业化的产品之间还有很大的距离,还需要不同工种的人互相协作,但是谁在扮演更重要的角色不言而喻。毕竟,软件是开发出来的,不是测试出来的。核心开发工程师做的工作,初中级工程师根本无法染指。
大多数测试工程师拿到的都是行业平均薪水,差距不大。对一个产品进行测试,80%的工作量是功能测试,性能、可靠性、国际化、易用性等等加一起一般也就占20%。道理很简单,如果一个产品的主要功能跑不起来,其他东西都白搭。由于种种原因(如需求变化大导致界面变化大),功能测试又以手工测试为主。这部分是技术含量最低,替代性最强,个人知识积累最少的测试工作了。今天测试产品A,明天测试产品B,就好比今天当力工搬砖头,明天搬木头,只要力气在,搬就是了,管他搬的是什么。甲做也可以,乙做也可以,经验丰富、耐心细致的可以发现更多、隐藏更深的bug,但是不存在做不做的了的问题。3年下来,一名开发工程师可以掌握一门编程语言,懂点设计、架构、框架、UML,或者一个人前台后台持久层全部拿下。而一名手工功能测试工程师,只能成为某个被测试产品的使用专家,不用去懂J2EE或者.Net,Flex或者Html5,MVC或者SSH。被测产品一换,一切重头再来。
测试中比较有技术含量和门槛的是测试自动化开发、白盒测试和性能测试。
先说说测试自动化开发。测试自动化开发主要有两种,一种是用现成的工具如QTP、WinRunner编写测试脚本。还有一种是自己用Java或者C#编写辅助测试工具。现成的工具都基于某种语言,如QTP基于VBScript,WinRunner基于自己独有的类C语言,Selenium基于Java。自己编写的工具大多用于批量数据生成、导入、处理等。而这两者归根到底还是软件开发,而且大多数是比较简单的开发。
测试脚本很多不需要界面,是命令行程序,这样GUI开发中的很多难点就不会遇到了。
大多数是单线程运行,因为是脚本,即使是上千个脚本,只要按照顺序跑就可以了,这样多线程的麻烦就不用去处理了。
不需要访问数据库,因为测试结果一般记到文件中如html文件,并以表格或者简易报表的形式显示就可以了。这样,在软件开发中的一块重头戏-持久层开发和数据库设计就不用考虑了。
如此这般,对于一般的测试脚本或者工具开发,专业的软件开发人员即使没有什么测试经验,也可以轻松上手,做得游刃有余。
白盒测试是相对于黑盒测试而言的,是通过写程序来测试程序,比较常见的如测试Web Service API,测试类库提供的API。和测试脚本开发类似,属于相对简单的开发。这类活儿没有编程基础的人做不了,希望深入钻研技术的资深开发人员又不愿意做,比较适合初级开发人员来做。
再说性能测试。
性能测试的主要目的就是验证一个软件产品可以允许多少用户并发访问,性能指标如响应时间、CPU和内存占用率是多少。一般来说这种测试无法手工做,需要借助于工具,如LoadRunner, QALoad,JMeter等等。首先,在录制的脚本基础上做一些编程是必不可少的。其次,在获取到基本的性能指标值后,如何去分析并解决问题,比如调整操作系统、数据库、中间件的参数,做个集群啦啥的,或者对程序做代码级的优化,又远远超出了测试的范畴,是一般的性能测试工程师根本做不了的,需要架构、IT工程师、开发人员协同攻关。可以看出,一位性能测试工程师所作的脚本开发工作,对于专业开发人员来说,没有什么门槛。而复杂的测试环境搭建的工作,又需要网络工程师、数据库工程师的强有力支持,个人难以独自应付。
国际化测试的门槛一般。核心的东西,挤干了水分,也就两三个月,包括字符集、编码、字体、Bidirectional language、时间日期货币小数点排序布局等。换句话说,一位功能测试工程师,在经过好的导师三个月的专业培训和学习后,就可以基本胜任国际化测试的工作了。这里的门槛在于,市面上介绍国际化测试的书不多,很多东西需要在工作中去一个个知识点地学习,需要老员工来带。不像对java、数据库开发进行系统介绍的书那样满大街都是。
兼容性测试是典型的没什么技术含量的人力密集型工作。本人曾经做过一个月的打印机兼容性测试,上百台打印机,一个接一个放入打印纸打印,看看对被测试的国产Linux的支持程度。或者一个产品,测试对不同数据库的支持。让我想起在上大学的假期里给人发传单时,发一次挣30元钱,谁干都可以,卖卖苦力。后来改行写游戏外挂,一个月轻松挣3000多块,让室友们羡慕得不得了。 |
|