发布新日志

  • RAID数据恢复技术介绍

    2007-06-03 14:54:04Top 2 Digest 1

     

        在计算机发展的初期,“大容量”硬盘的价格还相当高,解决数据存储安全性问题的主要方法是使用磁带机等设备进行备份,这种方法虽然可以保证数据的安全,但查阅和备份工作都相当繁琐。1987年, Patterson、Gibson和Katz这三位工程师在加州大学伯克利分校发表了题为《A Case of Redundant Array of Inexpensive Disks(廉价磁盘冗余阵列方案)》的论文,其基本思想就是将多只容量较小的、相对廉价的硬盘驱动器进行有机组合,使其性能超过一只昂贵的大硬盘。这一设计思想很快被接受,从此RAID技术得到了广泛应用,数据存储进入了更快速、更安全、更廉价的新时代。

      磁盘阵列对于个人电脑用户,还是比较陌生和神秘的。印象中的磁盘阵列似乎还停留在这样的场景中:在宽阔的大厅里,林立的磁盘柜,数名表情阴郁、早早谢顶的工程师徘徊在其中,不断从中抽出一块块沉重的硬盘,再插入一块块似乎更加沉重的硬盘……终于,随着大容量硬盘的价格不断降低,个人电脑的性能不断提升,IDE-RAID作为磁盘性能改善的最廉价解决方案,开始走入一般用户的计算机系统。

      一、RAID技术规范简介

      RAID技术主要包含RAID 0~RAID 7等数个规范,它们的侧重点各不相同,常见的规范有如下几种:

      RAID 0:RAID 0连续以位或字节为单位分割数据,并行读/写于多个磁盘上,因此具有很高的数据传输率,但它没有数据冗余,因此并不能算是真正的RAID结构。RAID 0只是单纯地提高性能,并没有为数据的可靠性提供保证,而且其中的一个磁盘失效将影响到所有数据。因此,RAID 0不能应用于数据安全性要求高的场合。

      RAID 1:它是通过磁盘数据镜像实现数据冗余,在成对的独立磁盘上产生互 为备份的数据。当原始数据繁忙时,可直接从镜像拷贝中读取数据,因此RAID 1可以提高读取性能。RAID 1是磁盘阵列中单位成本最高的,但提供了很高的数据安全性和可用性。当一个磁盘失效时,系统可以自动切换到镜像磁盘上读写,而不需要重组失效的数据。

      RAID 0+1: 也被称为RAID 10标准,实际是将RAID 0和RAID 1标准结合的产物,在连续地以位或字节为单位分割数据并且并行读/写多个磁盘的同时,为每一块磁盘作磁盘镜像进行冗余。它的优点是同时拥有RAID 0的超凡速度和RAID 1的数据高可靠性,但是CPU占用率同样也更高,而且磁盘的利用率比较低。

      RAID 2:将数据条块化地分布于不同的硬盘上,条块单位为位或字节,并使用称为“加重平均纠错码(海明码)”的编码技术来提供错误检查及恢复。这种编码技术需要多个磁盘存放检查及恢复信息,使得RAID 2技术实施更复杂,因此在商业环境中很少使用。

      RAID 3:它同RAID 2非常类似,都是将数据条块化分布于不同的硬盘上,区别在于RAID 3使用简单的奇偶校验,并用单块磁盘存放奇偶校验信息。如果一块磁盘失效,奇偶盘及其他数据盘可以重新产生数据;如果奇偶盘失效则不影响数据使用。RAID 3对于大量的连续数据可提供很好的传输率,但对于随机数据来说,奇偶盘会成为写操作的瓶颈。

      RAID 4:RAID 4同样也将数据条块化并分布于不同的磁盘上,但条块单位为块或记录。RAID 4使用一块磁盘作为奇偶校验盘,每次写操作都需要访问奇偶盘,这时奇偶校验盘会成为写操作的瓶颈,因此RAID 4在商业环境中也很少使用。

      RAID 5:RAID 5不单独指定的奇偶盘,而是在所有磁盘上交叉地存取数据及奇偶校验信息。在RAID 5上,读/写指针可同时对阵列设备进行操作,提供了更高的数据流量。RAID 5更适合于小数据块和随机读写的数据。RAID 3与RAID 5相比,最主要的区别在于RAID 3每进行一次数据传输就需涉及到所有的阵列盘;而对于RAID 5来说,大部分数据传输只对一块磁盘操作,并可进行并行操作。在RAID 5中有“写损失”,即每一次写操作将产生四个实际的读/写操作,其中两次读旧的数据及奇偶信息,两次写新的数据及奇偶信息。

      RAID 6:与RAID 5相比,RAID 6增加了第二个独立的奇偶校验信息块。两个独立的奇偶系统使用不同的算法,数据的可靠性非常高,即使两块磁盘同时失效也不会影响数据的使用。但RAID 6需要分配给奇偶校验信息更大的磁盘空间,相对于RAID 5有更大的“写损失”,因此“写性能”非常差。较差的性能和复杂的实施方式使得RAID 6很少得到实际应用。

      RAID 7:这是一种新的RAID标准,其自身带有智能化实时操作系统和用于存储管理的软件工具,可完全独立于主机运行,不占用主机CPU资源。RAID 7可以看作是一种存储计算机(Storage Computer),它与其他RAID标准有明显区别。除了以上的各种标准(如表1),我们可以如RAID 0+1那样结合多种RAID规范来构筑所需的RAID阵列,例如RAID 5+3(RAID 53)就是一种应用较为广泛的阵列形式。用户一般可以通过灵活配置磁盘阵列来获得更加符合其要求的磁盘存储系统。

      开始时RAID方案主要针对SCSI硬盘系统,系统成本比较昂贵。1993年,HighPoint公司推出了第一款IDE-RAID控制芯片,能够利用相对廉价的IDE硬盘来组建RAID系统,从而大大降低了RAID的“门槛”。从此,个人用户也开始关注这项技术,因为硬盘是现代个人计算机中发展最为“缓慢”和最缺少安全性的设备,而用户存储在其中的数据却常常远超计算机的本身价格。在花费相对较少的情况下,RAID技术可以使个人用户也享受到成倍的磁盘速度提升和更高的数据安全性,现在个人电脑市场上的IDE-RAID控制芯片主要出自HighPoint和Promise公司,此外还有一部分来自AMI公司(如表2)。

      面向个人用户的IDE-RAID芯片一般只提供了RAID 0、RAID 1和RAID 0+1(RAID 10)等RAID规范的支持,虽然它们在技术上无法与商用系统相提并论,但是对普通用户来说其提供的速度提升和安全保证已经足够了。随着硬盘接口传输率的不断提高,IDE-RAID芯片也不断地更新换代,芯片市场上的主流芯片已经全部支持ATA 100标准,而HighPoint公司新推出的HPT 372芯片和Promise最新的PDC20276芯片,甚至已经可以支持ATA 133标准的IDE硬盘。在主板厂商竞争加剧、个人电脑用户要求逐渐提高的今天,在主板上板载RAID芯片的厂商已经不在少数,用户完全可以不用购置RAID卡,直接组建自己的磁盘阵列,感受磁盘狂飙的速度。

      二.通过硬件控制芯片实现IDE RAID的方法

      在RAID家族里,RAID 0和RAID 1在个人电脑上应用最广泛,毕竟愿意使用4块甚至更多的硬盘来构筑RAID 0+1或其他硬盘阵列的个人用户少之又少,因此我们在这里仅就这两种RAID方式进行讲解。我们选择支持IDE-RAID功能的升技KT7A-R AID主板,一步一步向大家介绍IDE-RAID的安装。升技KT7A-RAID集成的是HighPoint 370芯片,支持RAID 0、1、0+1。

      做RAID自然少不了硬盘,RAID 0和RAID 1对磁盘的要求不一样,RAID 1(Mirror)磁盘镜像一般要求两块(或多块)硬盘容量一致,而RAID 0(Striping)磁盘一般没有这个要求,当然,选用容量相似性能相近甚至完全一样的硬盘比较理想。为了方便测试,我们选用两块60GB的希捷酷鱼Ⅳ硬盘(Barracuda ATA Ⅳ、编号ST360021A)。系统选用Duron 750MHz的CPU,2×128MB樵风金条SDRAM,耕升GeForce2 Pro显卡,应该说是比较普通的配置,我们也希望借此了解构建RAID所需的系统要求。 1.RAID 0的创建

      第一步

      首先要备份好硬盘中的数据。很多用户都没有重视备份这一工作,特别是一些比较粗心的个人用户。创建RAID对数据而言是一项比较危险的操作,稍不留神就有可能毁掉整块硬盘的数据,我们首先介绍的RAID 0更是这种情况,在创建RAID 0时,所有阵列中磁盘上的数据都将被抹去,包括硬盘分区表在内。因此要先准备好一张带Fdisk与Format命令的Windows 98启动盘,这也是这一步要注意的重要事项。

      第二步

      将两块硬盘的跳线设置为Master,分别接上升技KT7A-RAID的IDE3、IDE4口(它们由主板上的HighPoint370芯片控制)。由于RAID 0会重建两块硬盘的分区表,我们就无需考虑硬盘连接的顺序(下文中我们会看到在创建RAID 1时这个顺序很重要)。

      第三步

      对BIOS进行设置,打开ATA RAID CONTROLLER。我们在升技KT7A-RAID主板的BIOS中进入INTEGRATED PERIPHERALS选项并开启ATA100 RAID IDE CONTROLLER。升技建议将开机顺序全部改为ATA 100 RAID,实际我们发现这在系统安装过程中并不可行,难道没有分区的硬盘可以启动吗?因此我们仍然设置软驱作为首选项。

      第四步

      接下来的设置步骤是创建RAID 0的核心内容,我们以图解方式向大家详细介绍:

       1.系统BIOS设置完成以后重启电脑,开机检测时将不会再报告发现硬盘。
        2.磁盘的管理将由HighPoint 370芯片接管。
        3.下面是非常关键的HighPoint 370 BIOS设置,在HighPoint 370磁盘扫描界面同时按下“Ctrl”和“H”。
        4.进入HighPoint 370 BIOS设置界面后第一个要做的工作就是选择“Create RAID”创建RAID。
        5.在“Array Mode(阵列模式)”中进行RAID模式选择,这里能够看到RAID 0、RAID 1、RAID 0+1和Span的选项,在此我们选择了RAID 0项。
        6.RAID模式选择完成会自动退出到上一级菜单进行“Disk Drives(磁盘驱动器)”选择,一般来说直接回车就行了。
        7.下一项设置是条带单位大小,缺省值为64kB,没有特殊要求可以不予理睬。8.接着是“Start Create(开始创建)”的选项,在你按下“Y”之前,请认真想想是否还有重要的数据留在硬盘上,这是你最后的机会!一旦开始创建RAID,硬盘上的所有数据都会被清除。
        9.创建完成以后是指定BOOT启动盘,任选一个吧。

       按“Esc”键退出,当然少不了按下“Y”来确认一下。

       HighPoint 370 BIOS没有提供类似“Exit Without Save”的功能,修改设置后是不可逆转的

      第五步

      再次重启电脑以后,我们就可以在屏幕上看到“Striping(RAID 0)for Array #0”字样了。插入先前制作的启动盘,启动DOS。打开Fdisk程序,咦?怎么就一个硬盘可见?是的,RAID阵列已经整个被看作了一块硬盘,对于操作系统而言,RAID完全透明,我们大可不必费心RAID磁盘的管理,这些都由控制芯片完成。接下来按照普通单硬盘方法进行分区,你会发现“这个”硬盘的容量“变”大了,仔细算算,对,总容量就是两块硬盘相加的容量!我们可以把RAID 0的读写比喻成拉链,它把数据分开在两个硬盘上,读取数据会变得更快,而且不会浪费磁盘空间。在分区和格式化后千万别忘了激活主分区。

      第六步

      选择操作系统让我们颇费周折,HighPoint370芯片提供对Windows98/NT/2000/XP的驱动支持,考虑到使RAID功能面向的是相对高级的用户,所以我们选择了对新硬件支持更好的Windows XP Professional英文版(采用英文版系统主要是为了方便后面的Winbench测试,大家自己使用RAID完全可以用中文版的操作系统),Windows 2000也是一个不错的选择,但是硬件支持方面显然不如Windows XP Professional。

      第七步

      对于采用RAID的电脑,操作系统的安装和普通情况下不一样,让我们看看图示,这是在Windows XP完成第一步“文件复制”重启以后出现的画面,安装程序会以英文提示“按下F6安装SCSI设备或RAID磁盘”,这一过程很短,而且用户往往会忽视屏幕下方的提示。

      按下F6后出现安装选择,选择“S”将安装RAID控制芯片驱动,选择“Enter”则不安装。

      按下“S”键会提示插入RAID芯片驱动盘。

      键入回车,安装程序自动搜索驱动盘上的程序,选择“WinXP”那一个并回车。

      如果所提供的版本和Windows XP Profesional内置的驱动版本不一致,安装程序会给出提示让用户进行选择。

      按下“S”会安装软盘所提供的而按下“Enter”则安装Windows XP Professional

      自带的驱动。按下“S”后又需要确认,这次是按“Enter”(这个……确认太多了,呵呵)。接下来是正常的系统安装,和普通安装没有任何区别。

      RAID 0的安装设置我们就介绍到这里,下面我们会谈谈RAID 1的安装。与RAID 0相比,RAID 1的安装过程要简单许多,在正确操作的情况下不具破坏性。

      2.RAID 1的创建

      虽然在原理上和RAID 0完全不一样,但RAID 1的安装设置过程却与RAID 0相差不多,主要区别在于HighPoint 370 BIOS里的设置。为了避免重复,我们只向大家重点介绍这部分设置:

      进入HighPoint 370 BIOS后选择“Create RAID”进行创建:

       1.在“Array Mode”上点击回车,在RAID模式选择中选择第二项“Mirror(RAID 1)for Data Security(为数据源盘创建镜像)”。
        2.接着是源盘的选择,我们再次提醒用户:务必小心,不要选错。
        3.然后是目标盘的选择,也就是我们所说的镜像盘或备份盘。
        4.然后开始创建。
        5.创建完成以后BIOS会提示进行镜像的制作,这一过程相当漫长。
        6.我们用了大约45分钟才完成60GB的镜像制作,至此RAID 1创建完成。RAID 1会将主盘的数据复制到镜像盘,因此在构建RAID 1时需要特别小心,千万不要把主盘和镜像盘弄混,否则结果将是悲剧性的。RAID 1既可在两块无数据的硬盘上创建,也能够在一块已经安装操作系统的硬盘上添加,比RAID 0方便多了(除了漫长的镜像制作过程)。创建完成以后我们试着将其中一块硬盘拔下,HighPoint370 BIOS给出了警告,按下“Esc”,另一块硬盘承担起了源盘的重任,所有数据完好无损。

      对于在一块已经安装操作系统的硬盘上添加RAID 1,我们建议的步骤是:打开BIOS中的控制芯片→启动操作系统安装HighPoint 370驱动→关机将源盘和镜像盘接在IDE3、4口→进入HighPoint 370 BIOS设置RAID 1(步骤见上文介绍)→重启系统完成创建。

      我们对两种RAID进行了简单的测试,虽然RAID 0的测试成绩让人有些不解,但是实际使用中仍然感觉比单硬盘快了很多,特别是Windows XP Professional的启动异常迅速,进度条一闪而过。至于传输率曲线出现不稳定的情况,我们估计和平台选择有一些关系,毕竟集成芯片在进行这种高数据吞吐量的工作时非常容易被干扰。不过即使是这样,我们也看到RAID 0系统的数据传输率达到了非常高的水平,一度接近60MB/s。与RAID 0相比,RAID 1系统的性能虽然相对单磁盘系统没有什么明显的改善,但测试中我们发现RAID 1的工作曲线显得非常稳定,很少出现波动的情况。再看看Winbench99 2.0中的磁盘测试成绩,一目了然。

      对用户和操作系统而言,RAID 0和1是透明不影响任何操作的,我们就像使用一块硬盘一样。

      三、用软件方法实现RAID

      除了使用RAID卡或者主板所带的芯片实现磁盘阵列外,我们在一些操作系统中可以直接利用软件方式实现RAID功能,例如Windows 2000/XP中就内置了RAID功能。

      在了解Windows 2000/XP的软件RAID功能之前,我们首先来看看Windows 2000中的一项功能——动态磁盘管理。

      动态磁盘与基本磁盘相比,不再采用以前的分区方式,而是叫卷集,它的作用其实和分区相一致,但是具有以下区别:

      1.可以任意更改磁盘容量
       动态磁盘在不重新启动计算机的情况下可更改磁盘容量大小,而且不会丢失数据,而基本磁盘如果要改变分区容量就会丢失全部数据(当然也有一些特殊的磁盘工具软件可以改变分区而不会破坏数据,如PQMagic等)。
       2.磁盘空间的限制
       动态磁盘可被扩展到磁盘中不连续的磁盘空间,还可以创建跨磁盘的卷集,将几个磁盘合为一个大卷集。而基本磁盘的分区必须是同一磁盘上的连续空间,分区的最大容量当然也就是磁盘的容量。
       3.卷集或分区个数
       动态磁盘在一个磁盘上可创建的卷集个数没有限制,相对的基本磁盘在一个磁盘上最多只能分4个区,而且使用DOS或Windows 9X时只能分一个主分区和扩展分区。

      *这里一定要注意,动态磁盘只能在Windows NT/2000/XP系统中使用,其他的操作系统无法识别动态磁盘。

      因为大部分用户的磁盘都是基本磁盘类型,为了使用软件RAID功能,我们必须将其转换为动态磁盘:控制面板→管理工具→计算机管理→磁盘管理,在查看菜单中将其中的一个窗口切换为磁盘列表。这时我们就可以通过右键菜单将选择磁盘转换为动态磁盘。

      在划分动态卷时会可以看到这样几个类型的动态卷。

      1.简单卷:包含单一磁盘上的磁盘空间,和分区功能一样。
       (当系统中有两个或两个以上的动态磁盘并且两个磁盘上都有未分配的空间时,我们能够选择如下的两种分卷方式)2.跨区卷:跨区卷将来自多个磁盘的未分配空间合并到一个逻辑卷中。
       3.带区卷:组合多个(2到32个)磁盘上的未分配空间到一个卷。
       (如果如上所述系统中的两个动态磁盘容量一致时,我们会看到另一个分区方式)
       4.镜像卷:单一卷两份相同的拷贝,每一份在一个硬盘上。即我们常说的RAID 1。
       当我们拥有三个或三个以上的动态磁盘时,我们就可以使用更加复杂的RAID方式——RAID 5,此时在分卷界面中会出现新的分卷形式。
       5.RAID 5卷:相当于带奇偶校验的带区卷,即RAID 5方式。
       对于大部分的个人电脑用户来说,构建RAID 0是最经济实用的阵列形式,因此我们在这里仅就软件RAID 0的构建进行讲解:
       要在Windows 2000/XP中使用软件RAID 0,首先必须将准备纳入阵列的磁盘转换为上文所述的动态磁盘(这里要注意的是,Windows 2000/XP的默认磁盘管理界面中不能转换基本磁盘和动态磁盘,请参考上文中的描述),我们在这里尝试使用分区的条带化,这也正是软件RAID和使用RAID芯片构建磁盘阵列的区别。我们选取了一个29GB的分区进行划分带区卷,在划分带区卷区时,系统会要求一个对应的分区,也就是说这时其他的动态磁盘上必须要有同样29GB或更大的未分配空间,带区卷分配完成后,两个同样大小的分卷将被系统合并,此时我们的格式化等操作也是同时在两个磁盘上进行。

      在构建RAID 0完成后,我们决定测试其硬盘传输率以确定这种软件RAID对性能的提升程度,我们构建软件RAID的平台和前文中的硬件RAID平台并不相同,为了保证CPU的性能以确保我们软件RAID的实现,我们采用了较高端的系统:Athlon XP 1700+,三星 256MB DDR内存,华硕A7V266-E主板,由于软件RAID对硬盘规格的要求比较低,所以硬盘系统我们选用了不同规格的硬盘,希捷酷鱼Ⅳ 60GB和西部数据1200BB 120GB两块硬盘。

      在传输曲线的后半段,我们很清楚地看到软件RAID 0的硬盘传输率达到了60MB/s,完全超越了阵列中任意一个硬盘的传输率,RAID 0的优势开始体现出来。对于追求高性能的用户来说,这应该是他们梦寐以求的。

      这里应该说明的是,在Linux环境下,我们同样可以利用Raidtools工具来实现软件RAID功能。这个工具可以制作软RAID 0、RAID 1、RAID 4、RAID 5等多种磁盘阵列。在使用Raidtools之前,首先要确定目前正在使用的Linux核心是否支持Md。如果你正在使用的核心是2.0.X,并且不是自己编译过,大多数情况下支持软RAID。如果不能确定,则需要自己编译核心。

      虽然RAID功能可以给我们带来更好的速度体验和数据安全性,但是应该指出的是,现在市面上的大部分廉价IDE-RAID解决方案本质上仍然是“半软”的RAID,只是将RAID控制信息集成在RAID芯片当中,因此其CPU占用率比较大,而且性能并不是非常稳定。这也是在高端系统中软件RAID 0的性能有时可以超过“硬件”RAID 0方案的原因。

      对于用户来说,高性能的IDE-RAID存储系统,或者需要比较强劲的CPU运算能力,或者需要比较昂贵的RAID卡,因此,磁盘阵列仍然应该算是比较高端的应用。不过对于初级用户来说,使用简单而廉价的磁盘阵列来提高计算机数据的可用性或提升一下存储速度也是相当不错的选择,当然其性能还远不能和高端系统相比。

      总之,我们看到越来越多的RAID架构出现在市场上,尤其是在中低端市场上,越来越普及的廉价IDE-RAID方案与硬盘价格的不断下降互相照应,似乎也在预示着未来个人数据存储的发展趋势,让我们拭目以待吧 。

  • 轻松自动化---selenium-webdriver(python) (四)

    2017-02-17 16:08:34

    来源:http://www.cnblogs.com/fnng/p/3190966.html

    本节要解决的问题:

    如何定位一组元素?

     

    场景

    从上一节的例子中可以看出,webdriver可以很方便的使用findElement方法来定位某个特定的对象,不过有时候我们却需要定位一组对象,

    这时候就需要使用findElements方法。

     

    定位一组对象一般用于以下场景:

    · 批量操作对象,比如将页面上所有的checkbox都勾上

    · 先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象。比如定位出页面上所有的checkbox,然后选择最后一个

    复制代码
    <html>
        <head>
            <meta. http-equiv="content-type" content="text/html;charset=utf-8" />
            <title>Checkbox</title>
            <script. type="text/javascript" async="" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
            <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet" />
            <script. src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
        </head>
        <body>
            <h3>checkbox</h3>
            <div class="well">
                <form. class="form-horizontal">
                    <div class="control-group">
                        <label class="control-label" for="c1">checkbox1</label>
                        <div class="controls">
                            <input type="checkbox" id="c1" />
                        </div>
                    </div>
                    <div class="control-group">
                        <label class="control-label" for="c2">checkbox2</label>
                        <div class="controls">
                            <input type="checkbox" id="c2" />
                        </div>
                    </div>
                    <div class="control-group">
                        <label class="control-label" for="c3">checkbox3</label>
                        <div class="controls">
                            <input type="checkbox" id="c3" />
                        </div>
                    </div>    
            
                    <div class="control-group">
                        <label class="control-label" for="r">radio</label>
                        <div class="controls">
                            <input type="radio" id="r1" />
                        </div>
                    </div>
                    
                    <div class="control-group">
                        <label class="control-label" for="r">radio</label>
                        <div class="controls">
                            <input type="radio" id="r2" />
                        </div>
                    </div>
                </form>
            </div>
        </body>
    </html>
    复制代码

    将这段代码保存复制到记事本中,将保存成checkbox.html文件。(注意,这个页面需要和我们的自动化脚本放在同一个目录下

     

     

     

    第一种方法:

    通过浏览器打个这个页面我们看到三个复选框和两个单选框。下面我们就来定位这三个复选框。

    复制代码
    # -*- coding: utf-8 -*-
    from selenium import webdriver
    import time
    import os
    
    dr = webdriver.Firefox()
    file_path =  'file:///' + os.path.abspath('checkbox.html')
    dr.get(file_path)
    
    # 选择页面上所有的input,然后从中过滤出所有的checkbox并勾选之
    inputs = dr.find_elements_by_tag_name('input')
    for input in inputs:
        if input.get_attribute('type') == 'checkbox':
            input.click()
    time.sleep(2)
    
    dr.quit()
    复制代码

    你可以试着把input.get_attribute('type') == 'checkbox' 中的checkbox 变成radio ,那这个脚本定位的会是两个单选框。

     

    第二种定位方法:

    复制代码
    # -*- coding: utf-8 -*-
    from selenium import webdriver
    import time
    import os
    
    dr = webdriver.Firefox()
    file_path =  'file:///' + os.path.abspath('checkbox.html')
    dr.get(file_path)
    
    # 选择所有的checkbox并全部勾上
    checkboxes = dr.find_elements_by_css_selector('input[type=checkbox]')
    for checkbox in checkboxes:
        checkbox.click()
    time.sleep(2)
    
    # 打印当前页面上有多少个checkbox
    print len(dr.find_elements_by_css_selector('input[type=checkbox]'))
    time.sleep(2)
    
    dr.quit()
    复制代码

    第二种写法与第一种写法差别不大,都是通过一个循环来勾选控件;如果你学过上一章的话,细心的你一定发现用的定位函数不一样,

    第一种用的name ,第二种用的CSS 。

     

     如何去掉勾选:

    还有一个问题,有时候我们并不想勾选页面的所有的复选框(checkbox),可以通过下面办法把最后一个被勾选的框去掉。如下:

    复制代码
    # -*- coding: utf-8 -*-
    from selenium import webdriver
    import time
    import os
    
    dr = webdriver.Firefox()
    file_path =  'file:///' + os.path.abspath('checkbox.html')
    dr.get(file_path)
    
    # 选择所有的checkbox并全部勾上
    checkboxes = dr.find_elements_by_css_selector('input[type=checkbox]')
    for checkbox in checkboxes:
        checkbox.click()
    time.sleep(2)
    
    # 把页面上最后1个checkbox的勾给去掉
    dr.find_elements_by_css_selector('input[type=checkbox]').pop().click()
    time.sleep(2)
    
    dr.quit()
    复制代码

    其实,去掉勾选表也逻辑也非常简单,就是再次点击勾选的按钮。可能我们比较迷惑的是如何找到“最后一个”按钮。pop() 可以实现这个功能。

    好吧!在web自动化的学习过程中,我们必须要知道一些前端的东西,这里扩展一下:

    http://www.w3school.com.cn/js/jsref_pop.asp

     

     

    尝试

    把find_elements_by_css_selector('input[type=checkbox]').pop().click() 中的checkbox 变成radio 会是什么效果,自己尝试一下吧!

     

     

     

    --------------------------

    学习更多selenium 内容:

     「功能测试自动化」汇总

  • 轻松自动化---selenium-webdriver(python) (三)

    2017-02-17 16:06:37

    引用:http://www.cnblogs.com/fnng/p/3183777.html

     本节重点:

    • 简单对象的定位

          -----自动化测试的核心

      对象的定位应该是自动化测试的核心,要想操作一个对象,首先应该识别这个对象。一个对象就是一个人一样,他会有各种的特征(属性),如比我们可以通过一个人的身份证号,姓名,或者他住在哪个街道、楼层、门牌找到这个人。

    那么一个对象也有类似的属性,我们可以通过这个属性找到这对象。

     

    定位对象的目的一般有下面几种

    · 操作对象

    · 获得对象的属性,如获得测试对象的class属性,name属性等等

    · 获得对象的text

    · 获得对象的数量

     

    webdriver提供了一系列的对象定位方法,常用的有以下几种

    • · id
    • · name
    • · class name
    • · link text
    • · partial link text
    • · tag name
    • · xpath
    • · css selector

     

    我们可以看到,一个百度的输入框,可以用这么用种方式去定位。

    复制代码
    #coding=utf-8
    
    from selenium import webdriver
    import time
    
    browser = webdriver.Firefox()
    
    browser.get("http://www.baidu.com")
    time.sleep(2)
    
    #########百度输入框的定位方式##########
    
    #通过id方式定位
    browser.find_element_by_id("kw").send_keys("selenium")
    
    #通过name方式定位
    browser.find_element_by_name("wd").send_keys("selenium")
    
    #通过tag name方式定位
    browser.find_element_by_tag_name("input").send_keys("selenium")
    
    #通过class name 方式定位
    browser.find_element_by_class_name("s_ipt").send_keys("selenium")
    
    #通过CSS方式定位
    browser.find_element_by_css_selector("#kw").send_keys("selenium")
    
    #通过xphan方式定位
    browser.find_element_by_xpath("//input[@id='kw']").send_keys("selenium")
    
    ############################################
    
    browser.find_element_by_id("su").click()
    time.sleep(3)
    browser.quit()
    复制代码

     

    OK~!通过上面一个例子,就帮我们展示了几种定位方式,下面来介绍每种定位方式:

     

     

    id 和 name


     

    id 和 name 是我们最最常用的定位方式,因为大多数控件都有这两个属性,而且在对控件的id name命名时一般使其有意义也会取不同的名字。通过这两个属性使我们找一个页面上的属性变得相当容易

     

    我们通过前端工具,找到了百度输入框的属性信息,如下:

    <input id="kw" class="s_ipt" type="text" maxlength="100" name="wd" autocomplete="off">

     

    id=”kw”

    通过find_element_by_id("kw") 函数就是捕获到百度输入框

    name=”wd”

    通过find_element_by_name("wd")函数同样也可以捕获百度输入框

     

     

    tag name 和class name


     

     

    从上面的百度输入框的属性信息中,我们看到,不单单只有id 和 name两个属性,比如class 和 tag name(标签名)

    <input>

    input 就是一个标签的名字,可以通过find_element_by_tag_name("input") 函数来定位。

    class="s_ipt"

    通过find_element_by_class_name("s_ipt")函数捕获百度输入框。

    但是,碰下面的一组控件属性,我们就哭了。

    复制代码
    <th width="95"></th>
    <th width="">文件名</th>
    <th class="c1">创建时间</th>
    <th class="c1">状态</th>
    <th class="c1">文件大小</th>
    <th class="c1">时长</th>
    复制代码

     

     

    下面的css 和 XPath就没有上面的那么直观,如果不懂前端的话可能不太好理解

     

     

    CSS定位


     

     

    CSS(Cascading Style Sheets)是一种语言,它被用来描述HTMLXML文档的表现。CSS使用选择器来为页面元素绑定属性。这些选择器可以被selenium用作另外的定位策略。

    CSS的比较灵活可以选择控件的任意属性,上面的例子中:

    find_element_by_css_selector("#kw")

    通过find_element_by_css_selector( )函数,选择取百度输入框的id属性来定义

    也可以取name属性

    <a href="http://news.baidu.com" name="tj_news">新 闻</a>

    driver.find_element_by_css_selector("a[name=\"tj_news\"]").click()

     

    可以取title属性

    <a onclick="queryTab(this);" mon="col=502&pn=0" title="web" href="http://www.baidu.com/">网页</a>

    driver.find_element_by_css_selector("a[title=\"web\"]").click()

     

    也可以是取..:

    <a class="RecycleBin xz" href="javascript.:void(0);">

     

    driver.find_element_by_css_selector("a.RecycleBin").click()

     

    虽然我也没全部理解CSS的定位,但是看上去应该是一种非常灵活和牛的定位方式

     

    扩展阅读:

    http://www.w3.org/TR/css3-selectors/

    http://www.w3school.com.cn/css/css_positioning.asp

     

     

     

    XPath


     

     

    什么是XPathhttp://www.w3.org/TR/xpath/
    XPath基础教程:http://www.w3schools.com/xpath/default.asp

    selenium中被误解的XPath : http://magustest.com/blog/category/webdriver/

     

    XPath是一种在XML文档中定位元素的语言。因为HTML可以看做XML的一种实现,所以selenium用户可是使用这种强大语言在web应用中定位元素。

    XPath扩展了上面id和name定位方式,提供了很多种可能性,比如定位页面上的第三个多选框。

    复制代码
    xpath:attributer (属性)
    
    driver.find_element_by_xpath("//input[@id='kw']").send_keys("selenium")
    
    #input标签下id =kw的元素
    
     
    
    xpath:idRelative (id相关性)
    
    driver.find_element_by_xpath("//div[@id='fm']/form/span/input").send_keys("selenium")
    
    #在/form/span/input 层级标签下有个div标签的id=fm的元素
    
    driver.find_element_by_xpath("//tr[@id='check']/td[2]").click() 
    
    # id为'check' 的tr ,定闪他里面的第2个td
    
     
    
    xpath:position (位置)
    
    driver.find_element_by_xpath("//input").send_keys("selenium") 
    
    driver.find_element_by_xpath("//tr[7]/td[2]").click()
    
    #第7个tr 里面的第2个td
    
     
    
    xpath: href (水平参考)
    
    driver.find_element_by_xpath("//a[contains(text(),'网页')]").click()
    
    #在a标签下有个文本(text)包含(contains)'网页' 的元素
    
     
    
    xpath:link
    
    driver.find_element_by_xpath("//a[@href='http://www.baidu.com/']").click()
    
    #有个叫a的标签,他有个链接href='http://www.baidu.com/ 的元素
    复制代码

     

     

     

    link 定位


     

    有时候不是一个输入框也不是一个按钮,而是一个文字链接,我们可以通过link

    复制代码
    #coding=utf-8
    
    from selenium import webdriver
    import time
    
    browser = webdriver.Firefox()
    
    browser.get("http://www.baidu.com")
    time.sleep(2)
        
    browser.find_element_by_link_text("贴 吧").click()
    time.sleep(2)
    browser.quit()
    复制代码

    一般一个那页面上不会出现相同的文件链接,通过文字链接来定位也是一种简单有效的定位方式。

     

     

    Partial Link Text 定位


     

    通过部分链接定位,这个有时候也会用到,我还没有想到很好的用处。拿上面的例子,我可以只用链接的一部分文字进行匹配:

    browser.find_element_by_partial_link_text("").click()
    
    #通过find_element_by_partial_link_text() 函数,我只用了“贴”字,脚本一样找到了"贴 吧" 的链接

     

     

     

    --------------------------

    学习更多selenium 内容:

     「功能测试自动化」汇总

  • 轻松自动化---selenium-webdriver(python) (二)

    2017-02-17 13:55:21

    来源:http://www.cnblogs.com/fnng/p/3171383.html本节知识点:
    • 打印URL
    • 将浏览器最大化
    • 设置浏览器固定宽、高
    • 操控浏览器前进、后退

     

     

    打印URL

     

    上一节讲到,可以将浏览器的title打印出来,这里再讲个简单的,把当前URL打印出来。其实也没啥大用,可以做个凑数的用例。

     

    复制代码
    #coding=utf-8
    
    from selenium import webdriver
    import time
    
    browser = webdriver.Firefox()
    
    url= 'http://www.baidu.com'
    
    #通过get方法获取当前URL打印
    print "now access %s" %(url)
    browser.get(url)
    
    time.sleep(2)
    browser.find_element_by_id("kw").send_keys("selenium")
    browser.find_element_by_id("su").click()
    time.sleep(3)
    browser.quit()   
    复制代码

     

    其实,我们可以把这用户登录成功后的URL打印,用于验证用户登录成功。

    又或者,我们打印其它信息,比如,一般的登录成功页会出现“欢迎+用户名”,可以将这个信息打印表明用户登录成功。(如何实现,你自己琢磨一下吧~!)

     

     

    将浏览器最大化

     

    我们知道调用启动的浏览器不是全屏的,这样不会影响脚本的执行,但是有时候会影响我们“观看”脚本的执行。

    复制代码
    #coding=utf-8
    
    from selenium import webdriver
    import time
    
    browser = webdriver.Firefox()
    
    browser.get("http://www.baidu.com")
    time.sleep(2)
    
    print "浏览器最大化"
    browser.maximize_window()  #将浏览器最大化显示
    time.sleep(2)
    
    browser.find_element_by_id("kw").send_keys("selenium")
    browser.find_element_by_id("su").click()
    time.sleep(3)
    browser.quit()
    复制代码

     

     

    设置浏览器固定宽、高

     

    最大化还是不够灵活,能不能随意的设置浏览的宽、高显示?当然是可以的。

    复制代码
    #coding=utf-8
    from selenium import webdriver
    import time
    
    browser = webdriver.Firefox()
    
    browser.get("http://m.mail.10086.cn")
    time.sleep(2)
    
    print "设置浏览器宽480、高800显示"
    browser.set_window_size(480, 800)  #参数数字为像素点
    time.sleep(3)
    browser.quit()
    复制代码

    这个需求也还是有的,比如我们通过PC浏览器在访问一下手机网站时,调整浏览器为手机屏幕的宽、高,容易发现一些显示问题。(上面的手机邮箱网站就是笔者测试过的一个产品)

     

     

    操控浏览器前进、后退

     

    浏览器上有一个后退、前进按钮,对于浏览网页的人是比较方便的;对于做web自动化测试的同学来说应该算是一个比较难模拟的问题;其实很简单,下面看看python的实现方式

    复制代码
    #coding=utf-8
    
    from selenium import webdriver
    import time
    
    browser = webdriver.Firefox()
    
    #访问百度首页
    first_url= 'http://www.baidu.com'
    print "now access %s" %(first_url)
    browser.get(first_url)
    time.sleep(2)
    
    #访问新闻页面
    second_url='http://news.baidu.com'
    print "now access %s" %(second_url)
    browser.get(second_url)
    time.sleep(2)
    
    #返回(后退)到百度首页
    print "back to  %s "%(first_url)
    browser.back()
    time.sleep(1)
    
    #前进到新闻页
    print "forward to  %s"%(second_url)
    browser.forward()
    time.sleep(2)
    
    browser.quit()
    复制代码

    为了使过程让你看得更清晰,在每一步操作上都加了print sleep 

    说实话,这两个功能平时不太常用,所能想到的场景就是几个页面来回跳转,但又不想用get url的情况下。

     

     

     

    --------------------------

    学习更多selenium 内容:

  • 轻松自动化---selenium-webdriver(python) (一)

    2017-02-17 10:58:23

    来源:http://www.cnblogs.com/fnng/p/3160606.html

    为什么选python

    之前的菜鸟系列是基于java的,一年没学其实也忘的差不多了,目前所测的产品部分也是python写的,而且团队也在推广python ,其实就测试人员来说,python也相当受欢迎。易学,易用。翻翻各测试招聘,python出现的概率也颇高。

     

    平台搭建:

    前一篇中已经介绍,如果你也想体验一下自动化魅力,那就赶快搭建自己的环境吧~

    selenium + python自动化测试环境搭建

     

    第一个脚本:

    下面看看python 穿上selenium webdriver 是多么的性感:

    复制代码
    # coding = utf-8
    
    from selenium import webdriver
    
    
    browser = webdriver.Firefox()
    
    browser.get("http://www.baidu.com")
    browser.find_element_by_id("kw").send_keys("selenium")
    browser.find_element_by_id("su").click()
    browser.quit()
    复制代码

    怎么样?相信不懂代码的人都能看懂,但还是请容我在这里啰嗦一下每一句的含义:

     

    # coding = utf-8

    可加可不加,开发人员喜欢加一下,防止乱码嘛。

     

    from selenium import webdriver

    要想使用seleniumwebdriver 里的函数,首先把包导进来嘛

     

    browser = webdriver.Firefox() 

    我们需要操控哪个浏览器呢?Firefox ,当然也可以换成Ie 或 Chrome browser可以随便取,但后面要用它操纵各种函数执行。

     

    browser.find_element_by_id("kw").send_keys("selenium")

    一个控件有若干属性id name、(也可以用其它方式定位),百度输入框的id kw ,我要在输入框里输入 selenium 。多自然语言呀!

     

    browser.find_element_by_id("su").click()

    搜索的按钮的id su ,我需要点一下按钮( click() )。

     

    browser.quit()

    退出并关闭窗口的每一个相关的驱动程序,它还有个类似的表弟。

    browser.close()

    关闭当前窗口 ,用哪个看你的需求了。

     

    添加休眠

    什么?你说刚才太快没看清浏览器的操作过程。请time出马,让他跑慢点。

     

    复制代码
    # coding = utf-8
    
    from selenium import webdriver
    import  time  #调入time函数
    
    browser = webdriver.Firefox()
    
    browser.get("http://www.baidu.com")
    time.sleep(0.3)  #休眠0.3秒
    browser.find_element_by_id("kw").send_keys("selenium")
    browser.find_element_by_id("su").click()
    time.sleep(3)  # 休眠3秒
    browser.quit()
    复制代码

     

    time.sleep() 函数随意插,哪里太快插哪里,再也不用担心看不清脚本的运行过程了。

     

    其实,这个函数的真正用途不是给我们看脚本的运行过程的,有时候网络原因,或页面加载慢。假设搜索框输入框输入了selenium ,搜索按钮还没加载出来,那么脚本就报错。在适当的位置加入time.sleep()有助于减少网络原因造成的脚本执行失败;

     

    输出

    什么?在运行脚本的时候,上了个厕所,你都不知道刚才的脚本是否运行成功了。把刚才访问页面的title 打印出来。

     

    复制代码
    # coding = utf-8
    
    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.get('http://www.baidu.com')
    print driver.title  # 把页面title 打印出来
    driver.quit()
    复制代码

     

    虽然我没看到脚本的执行过程,但我在执行结果里看到了

    >>> 
    百度一下,你就知道

    说明页面正确被我打开了。

  • 使用分层的 Selenium 框架进行复杂 Web 应用的自动测试

    2017-02-15 15:25:56

    http://www.51testing.com/batch.viewlink.php?itemid=851962
  • 性能测试的相关术语【转】

    2010-08-26 15:28:13

     

    1.响应时间
          
    我把响应时间的概念确定为对请求作出响应所需要的时间,把响应时间作`为用户视角的软件性能的主要体现。响应时间划分为呈现时间系统响应时间两个部分。


          其中呈现时间取决于数据在被客户端收到响应数据后呈现页面所消耗的时间、而响应时间J2EE应用服务器从请求发出开始到客户端接受到数据所消耗的时间。性能测试一般不关注呈现时间,因为呈现时间很大程度上取决于客户端的表现。


          
    这里我们没有使用很多性能测试定义中的概念——“系统响应时间定义为应用系统从请求发出开始到客户端接收到最后一个字节数据所消耗的时间,没有使用这种标准的原因是,可以使用一些编程技巧在数据尚未完全接收完成时进行呈现来减少用户感受到的响应时间。

     

     2.并发用户数
          
    我把并发用户数同时在线数进行区别对待,我的并发用户数的标准是:并发用户数取决于测试对象的目标业务场景,因此,在确定这个并发用户数前,必须(必要)先对用户的业务进行分解、分析出典型的业务场景(也就是用户最常使用、最关注的业务操作),然后基于场景采用某些方法(有多种计算并发用户数的数学模型与公式)获得并发用户数


          
    这样做的原因是:假设一个应用系统、最高峰有500人同时在线、但这500人却不是并发用户数、因为假设在一个时间点上、有50%的人在填写复杂的表格(填写表格动作对服务器没有任何负担、只有在提交动作的时候才会对服务器系统构成压力)、有40%的人在不停的从一个页面跳转到另外一个页面(不停发出请求与回应、产生服务器压力)、还有10%的人挂在线上,没有任何操作在发呆:)(没有对服务器构成压力的动作)。因此只有那40%的人真正对服务器产生了压力,从这里例子可以看出、并发用户数关心的是不但是业务并发用户数、还取决于业务逻辑、业务场景。


     3.吞吐量
          
    我把吞吐量定义为单位时间内系统处理的客户请求的数量,直接体现软件系统的性能承载能力,对于交互式应用系统来说、吞吐量反映的是服务器承受的压力、在容量规划的测试中、吞吐量是一个重要指标、它不但反映在中间件、数据库上、更加体现在硬件上。我们在以下方面利用这个指标:
          
    1用来协助设计性能测试场景,衡量性能测试是否达到了预计的设计目标、比如J2EE应用系统的连接池、数据库事务发生频率、事务发生次数。
          
    2用来协助分析性能瓶颈、参照本文第二部分总的RBI方法。


     4.
    性能计数器
          
    性能计数器式描述服务器或操作系统性能的一些数据指标、例如对WINDOWS来说使用内存数、CPU使用率、进程时间等都是常见的计数器。
          
    对于性能计数器这个指标来说、需要考虑到的不但有硬件计数器、web服务器计数器、Weblogic服务器计数器、Servlet性能计数器、EJB2的性能计数器、JSF性能计数器、JMS性能计数器。找到这些指标是使用性能计数器的第一步、关键是找到性能瓶颈、确定系统阀值、提供优化建议才是性能计数器使用的关键。性能计数器复杂而繁多、与代码上下文环境、系统配置情况、系统架构、开发方式、使用到的规范实现、工具、类库版本都有紧密的联系、在此不作赘述。
          

    5.思考时间
          
    我把思考时间确定为休眠时间。从业务系统的角度来说,这个时间指的是用户在惊醒操作时、每个请求之间的时间间隔、从自动化测试的角度来说、要真实的测试模拟用户操作、就必须在测试脚本中让各个操作之间等待一段时间、体现在脚本上就是在操作之间放置一个Think的函数,体现为脚本中两个请求语句之间的间隔时间、不同的测试工具提供了不同的函数或方法来实现思考时间、比如HP LoadRunerIBM Rational Performance Tester的方式就完全不同。

  • 性能测试方法【转】

    2010-08-26 15:26:14

    1.性能测试

       性能测试方法通过模拟生产运行的业务压力量和使用场景组合测试性能是否能够满足需要。具备三个特点:

        1这种方法的目的是验证系统是否具有系统宣称具有的能力。
          
    2这种方法需要事先了解被测试系统典型场景、并确定性能目标。
          
    3这种方法要求在已确定的环境下运行
          
    使用IBM Rational Performance TesterHP Mercury LoadRunerOpenSTAApache ab
    Jmeter
    QALoadTagUnitJava Test Runner

     

     

    2.负载测试
          负载测试用来测定系统饱和状态、确定阀值。其特点有:
          
    1这种方法的目的是找到系统处理能力的极限;通过检测、加压、阀值手段找到如响应时间不超过10服务器平均CPU利用率低于65%”等指标。
          
    2这种性能测试方法需要在给定的测试环境下进行,通常也需要考虑被测系统的业务压力量和典型场景、另外HP Mercury LoadRuner在使用该方法进行加压的时候必须选择典型场景。
          
    3这种性能测试方法一般用来了解系统的性能容量,或者是配合性能调优的时候来使用。特别是该项目的Weblogic ServerOracle数据库的性能调优。

     

     

    3.压力测试
          压力测试方法测试目标系统在一定饱和状态下,例如CPU、内存等在饱和状态下、系统能够处理的session的能力,以及系统是否会出现错误。该方法需要在系统cache调优与pool优化方面着手。该方法具备以下特点:
          
    1该方法的目的是检查系统处于压力情况下的,应用的表现。如增加VU数量、节点数量、并发用户数量等使应用系统的资源使用保持一定的水平,这种方法的主要目的是检验此时的应用表现,重点在于有无错误信息产生,系统对应用的响应时间等。
          
    2该方法通过模拟负载在实现压力。这种模拟需要考虑的层面很多、首先、模拟必须是有效的,我的经验是需要结合业务系统和软件架构来定制模拟指标、我测试过一些国内生产的压力测试工具、他们使用通用的指标来考量、造成很多信息反馈有很大的水分。需要考虑的层面如:Oracle I/OJVM GCConn Pool等。
          
    3该方法还可以测试系统的稳定性。这里的技巧在于什么样的平台定义一个多长的压力测试时间让其稳定运行才是科学的?

     

     

    4.配置测试
          配置测试方式是指在测试前、测试中、测试后三个时间段通过对被测系统的软件/硬件环境的调整,了解各个不同环境对系统性能影响的程度,从而找到系统各个资源的最优分配原则。它具备以下特点:
          
    1该方法的目的是了解各个不同的因素对系统性能影响的程度、从而判断出最值得进行的调优操作。该方法不同于与功能测试中涉及到的配置测试
          
    2该方法存在很大的灵活性、可以在测试环节的各个时间进行、但是什么时候开始、什么时候暂停、什么时候结束才是运用这个方法的关键。

     

     

    5.并发测试
          该方法通过模拟用户的并发访问,测试多用户环境并发访问同一个应用、同一个模块或者数据记录时系统是否存在死锁或者其他性能问题。该方法特点是:
          
    1可以发现应用系统的全局性性能问题。
          
    2该方法可以在开发工作的各个环节使用可以使用多个工具的配合。如:Compuware公司的DevPartner工具、EJ-Technologie公司的J Profile工具,QUEST公司的J Probe工具等。
          
    3并发测试一般关注的问题是:
                
           、问      
                
    内存问题:是否有内存泄露(COM+JAVA       
           
    是否有太多的临时对象(JAVA
           
             
    是否有太多不合理声明的超过设计生命周期的对象
           
           
    数据库问题 :是否有数据库死锁
           
             
    是否经常出现长事务
           
            
    线程/进程问题 :是否出现线程/进程同步失败
           
            
    其他问题 :是否出现资源争用导致的死锁
           
              
    是否没有正确处理异常(如超时)导致的系统死锁

     

     

    6.可靠性测试
          
    这里说的可靠性测试并不等同于获得软件的可靠性,软件的可靠性是一个很大的命题,这里指的可靠性测试是通过给系统加载一定的业务压力(例如:资源在80%~90%的使用率),让应用系统运行一段时间、测试系统是否稳定运行。这里有三点需要注意:
          
    1在使用该测试前需要目的系统的资源使用率已经达到70%~90%。即在这样的苛刻环境下运行该应用系统。
          
    2应用系统运行起来后,加载业务压力使应用系统资源达到90%。比如:该J2EE系统中设置的JDBC数据库连接池定义为30,那么加载业务压力使连接达到27
          
    3应用系统运行起来后结合业务情况来设定一个运行时间。比如:电力资产系统要求MTBF(平均无故障时间)达到10000小时、那么我们可以认定该系统的运行时间至少需要达到三年重新启动一次。超过这个数字我们就可以认为不可靠。一般情况下对于这个要求、我们让J2EE系统在资源使用率90%~100%状态连续稳定的运行3天左右没有错误就可以认定该MTBF指标已经达到。

     

     

    7.失效恢复测试
          该方法是针对有HACMP等冗余备份和Edge Server for LB等负载均衡的J2EE系统设计的。该方法考量系统失效恢复的时间、用户受到多大程度、多大范围的影响,并将其量化。该方法有以下特点:
          
    1一般的关键业务都会采用双机热备或负载均衡方式来实现。
          
    2该方法回答两个问题:当问题发生的时候能支持多少用户访问有多少功能不能使用
          
    3需要说明的是,对于HNDLZCGLXT的这个项目来说,负载均衡需要仔细考虑其实现方式,这影响到性能的调优。可以考虑使用F5等硬件技术方式、也可以考虑使用IBM WebSphere Edge Server等商业版本的软件技术方式。

  • 性能面试题(转载)

    2010-08-12 16:28:43

     

    1.什么是负载测试?什么是性能测试



    2.性能测试包含了哪些测试(至少举出3种)



    3.简述性能测试的步骤



    4.简述使用Loadrunner的步骤



    5.什么时候可以开始执行性能测试?



    6.LoadRunner由哪些部件组成?



    7.你使用LoadRunner的哪个部件来录制脚本?



    8.LoadRunner的哪个部件可以模拟多用户并发下回放脚本?



    9.什么是集合点?设置集合点有什么意义?Loadrunner中设置集合点的函数是哪个?



    10.什么是场景?场景的重要性有哪些?如何设置场景?



    11.请解释一下如何录制web脚本?



    12.为什么要创建参数?如何创建参数?



    13.什么是关联?请解释一下自动关联和手动关联的不同。



    14.你如何找出哪里需要关联?请给一些你所在项目的实例。



    15.你在哪里设置自动关联选项?



    16.哪个函数是用来截取虚拟用户脚本中的动态值?(手工管联)



    17.你在VUGen中何时选择关闭日志?何时选择标准和扩展日志?



    18.你如何调试LoadRunner脚本?



    19你在LR中如何编写自定义函数?请给出一些你在以前进行的项目中编写的函数。



    20.在运行设置下你能更改那些设置?



    21.你在不同的环境下如何设置迭代?



    22.你如何在负载测试模式下执行功能测试



    23.什么是逐步递增?你如何来设置?



    24.以线程方式运行的虚拟用户有哪些优点?



    25.当你需要在出错时停止执行脚本,你怎么做?



    26.响应时间和吞吐量之间的关系是什么?



    27.说明一下如何在LR中配置系统计数器?



    28.你如何识别性能瓶颈?



    29.如果web服务器、数据库以及网络都正常,问题会出在哪里?



    30.如何发现web服务器的相关问题?



    31.如何发现数据库的相关问题?



    32.解释所有web录制配置?



    33.解释一下覆盖图和关联图的区别?



    34.你如何设计负载?标准是什么?



    35.Vuser_init中包括什么内容?



    36. Vuser_end中包括什么内容?



    37.什么是think time?think_time有什么用?



    38.标准日志和扩展日志的区别是什么?



    39.解释以下函数及他们的不同之处。

    Lr_debug_message

    Lr_output_message

    Lr_error_message

    Lrd_stmt

    Lrd_fetch



    40.什么是吞吐量?
  • 用10个漂亮问题完美结束面试

    2009-04-13 08:59:43


    上一篇 / 下一篇  2009-03-11 11:40:33

     在面试结束前,大多数的主考官都会丢问题给求职者,最常见的就是:你有没有什么问题或疑问,想要提出来的?无论求职者是否有提出问题,其实,这个问题背后的真正含意,通常是主考官用来测试你对这份工作有多大的企图心、决心和热情。 

      因此,如果你害怕发问不妥当,或是不知道该从何问起,甚至回答没有问题时,都很可能会让主考官认为,你想要这份工作的企图心、决心还不够强。

      相反的,求职者应该更积极、主动的利用面试最后一关的机会,适时的提出问题,这不但有助于主考官对你的印象能够加深,而且你也能趁此机会进一步了解这家公司的背景、企业文化是否适合你。

      最重要的是,如果能够在面试时,提出漂亮的问题,录取的机率将会大大提高。所以,无论如何,前往面试前,先谨记10个可以反问主考官的问题,以便到时候可以提出。

      1.贵公司对这项职务的工作内容和期望目标为何?有没有什么部分是我可以努力的地方?

      2.贵公司是否有正式或非正式教育训练?

      3.贵公司的升迁管道如何?

      4.贵公司的多角化经营,而且在海内外都设有分公司,将来是否有外派、轮调的机会?

      5.贵公司能超越同业的最大利基点为何?

      6.在项目的执行分工上,是否有资深的人员能够带领新进者,并让新进者有发挥的机会?

      7.贵公司强调的团队合作中,其它的成员素质和特性如何?

      8.贵公司是否鼓励在职进修?对于在职进修的补助办法如何?

      9.贵公司在人事上的规定和作法如何?

      10.能否为我介绍一下工作环境,或者是否有机会能参观一下贵公司?

      至于薪水待遇、年假天数、年终奖金、福利措施等问题,有些公司的主考官在面试时,会直接向求职者提出。如果对方没有提及,对社会新鲜人来说,在找第一份工作时,比较不适合提出,除非你有对方不得不录取你的条件。

      另外,也有人在结束前,谦虚的请教主考官:您认为我今天的表现如何?录取的机率有多大?通常,这个问题也会让对方认为,你对这份工作抱有很大的决心和企图心,而你也可以试着从对方的回答中,约略猜测出自己成功的机率有多大,并且作为下一次面试时表现的参考
  • 测试用例设计白皮书之等价类划分方法

    2009-04-03 12:58:40

    http://www.sina.com.cn  2008年12月12日 14:07  IT168.com
    .moduleSingleImg01 img{border:1px solid #D1E3F4}
    作者:ITPUB论坛   

    【IT168 技术文章】

      一.方法简介

      1.定义

      是把所有可能的输入数据,即程序的输入域划分成若干部分(子集),然后从每一个子集中选取少数具有代表性的数据作为测试用例。该方法是一种重要的,常用的黑盒测试用例设计方法。

      2.划分等价类:

       等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于揭露程序中的错误都是等效的,并合理地假定:测试某等价类的代表值就等于对这一类其它值 的测试,因此,可以把全部输入数据合理划分为若干等价类,在每一个等价类中取一个数据作为测试的输入条件就可以用少量代表性的测试数据取得较好的测试结 果。等价类划分可有两种不同的情况:有效等价类和无效等价类。

      1)有效等价类

      是指对于程序的规格说明来说是合理的、有意义的输入数据构成的集合。利用有效等价类可检验程序是否实现了规格说明中所规定的功能和性能。

      2)无效等价类

      与有效等价类的定义恰巧相反。无效等价类指对程序的规格说明是不合理的或无意义的输入数据所构成的集合。对于具体的问题,无效等价类至少应有一个,也可能有多个。

      设计测试用例时,要同时考虑这两种等价类。因为软件不仅要能接收合理的数据,也要能经受意外的考验,这样的测试才能确保软件具有更高的可靠性。

      3.划分等价类的标准:

      1)完备测试、避免冗余;

      2)划分等价类重要的是:集合的划分,划分为互不相交的一组子集,而子集的并是整个集合;

      3)并是整个集合:完备性;

      4)子集互不相交:保证一种形式的无冗余性;

      5)同一类中标识(选择)一个测试用例,同一等价类中,往往处理相同,相同处理映射到"相同的执行路径"。

      4.划分等价类的方法

      1)在输入条件规定了取值范围或值的个数的情况下,则可以确立一个有效等价类和两个无效等价类。如:输入值是学生成绩,范围是0~100;

      

    测试用例设计白皮书之等价类划分方法

      2)在输入条件规定了输入值的集合或者规定了"必须如何"的条件的情况下,可确立一个有效等价类和一个无效等价类;

      3)在输入条件是一个布尔量的情况下,可确定一个有效等价类和一个无效等价类。

      4)在规定了输入数据的一组值(假定n个),并且程序要对每一个输入值分别处理的情况下,可确立n个有效等价类和一个无效等价类。

      例:输入条件说明学历可为:专科、本科、硕士、博士四种之一,则分别取这四种这四个值作为四个有效等价类,另外把四种学历之外的任何学历作为无效等价类。

      5)在规定了输入数据必须遵守的规则的情况下,可确立一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则);

      6)在确知已划分的等价类中各元素在程序处理中的方式不同的情况下,则应再将该等价类进一步的划分为更小的等价类。

      5.设计测试用例

      在确立了等价类后,可建立等价类表,列出所有划分出的等价类输入条件:有效等价类、无效等价类,然后从划分出的等价类中按以下三个原则设计测试用例:

      1)为每一个等价类规定一个唯一的编号;

      2)设计一个新的测试用例,使其尽可能多地覆盖尚未被覆盖地有效等价类,重复这一步,直到所有的有效等价类都被覆盖为止;

      3)设计一个新的测试用例,使其仅覆盖一个尚未被覆盖的无效等价类,重复这一步,直到所有的无效等价类都被覆盖为止。

      二.实战演习

       1.某程序规定:"输入三个整数 a 、 b 、 c 分别作为三边的边长构成三角形。通过程序判定所构成的三角形的类型,当此三角形为一般三角形、等腰三角形及等边三角形时,分别作计算 … "。用等价类划分方法为该程序进行测试用例设计。(三角形问题的复杂之处在于输入与输出之间的关系比较复杂。)

      分析题目中给出和隐含的对输入条件的要求:

      (1)整数 (2)三个数 (3)非零数 (4)正数

      (5)两边之和大于第三边 (6)等腰 (7)等边

      如果 a 、 b 、 c 满足条件( 1 ) ~ ( 4 ),则输出下列四种情况之一:

      1)如果不满足条件(5),则程序输出为 " 非三角形 " 。

      2)如果三条边相等即满足条件(7),则程序输出为 " 等边三角形 " 。

      3)如果只有两条边相等、即满足条件(6),则程序输出为 " 等腰三角形 " 。

      4)如果三条边都不相等,则程序输出为 " 一般三角形 " 。

      列出等价类表并编号

      

    测试用例设计白皮书之等价类划分方法

      覆盖有效等价类的测试用例:

      a b c 覆盖等价类号码

      3 4 5 (1)--(7)

      4 4 5 (1)--(7),(8)

      4 5 5 (1)--(7),(9)

      5 4 5 (1)--(7),(10)

      4 4 4 (1)--(7),(11)

      覆盖无效等价类的测试用例:

      

    测试用例设计白皮书之等价类划分方法

      2.设有一个档案管理系统,要求用户输入以年月表示的日期。假设日期限定在1990年1月~2049年12月,并规定日期由6位数字字符组成,前4位表示年,后2位表示月。现用等价类划分法设计测试用例,来测试程序的"日期检查功能"。

      1)划分等价类并编号,下表等价类划分的结果

      

    测试用例设计白皮书之等价类划分方法


      2)设计测试用例,以便覆盖所有的有效等价类在表中列出了3个有效等价类,编号分别为①、⑤、⑧,设计的测试用例如下:

      测试数据 期望结果 覆盖的有效等价类

        200211 输入有效 ①、⑤、⑧

      3)为每一个无效等价类设计一个测试用例,设计结果如下:

      测试数据 期望结果 覆盖的无效等价类

        95June 无效输入 ②

        20036 无效输入③

        2001006无效输入 ④

        198912 无效输入 ⑥

        200401 无效输入 ⑦

        200100 无效输入 ⑨

        200113 无效输入 ⑩
     
       3.NextDate 函数包含三个变量:month 、 day 和 year ,函数的输出为输入日期后一天的日期。 例如,输入为 2006年3月 7日,则函数的输出为 2006年3月8日 。要求输入变量 month 、 day 和 year 均为整数值,并且满足下列条件:

        ①1≤month≤12

        ②1≤day≤31

        ③1920≤year≤2050
     
      1)有效等价类为:

       M1={月份:1≤月份≤12}

        D1={日期:1≤日期≤31}

        Y1={年:1812≤年≤2012}
     
       2)若条件 ① ~ ③中任何一个条件失效,则 NextDate 函数都会产生一个输出,指明相应的变量超出取值范围,比如 "month 的值不在 1-12 范围当中 " 。显然还存在着大量的 year 、 month 、 day 的无效组合, NextDate 函数将这些组合作统一的输出: " 无效输入日期 " 。其无效等价类为:

        M2={月份:月份<1}

        M3={月份:月份>12}

        D2={日期:日期<1}

        D3={日期:日期>31}

        Y2={年:年<1812}

        Y3={年:年>2012}

        弱一般等价类测试用例

        月份 日期 年 预期输出

        6 15 1912 1912年6月16日
     
      强一般等价类测试用例同弱一般等价类测试用例

      注:弱--有单缺陷假设;健壮--考虑了无效值

      (一)弱健壮等价类测

       用例ID 月份 日期 年 预期输出

        WR1 6 15 1912 1912年6月16日

        WR2 -1 15 1912 月份不在1~12中

        WR3 13 15 1912 月份不在1~12中

        WR4 6 -1 1912 日期不在1~31中

        WR5 6 32 1912 日期不在1~31中

        WR6 6 15 1811 年份不在1812~2012中

        WR7 6 15 2013 年份不在1812~2012中
     
      (二)强健壮等价类测试

        用例ID 月份 日期 年 预期输出

        SR1 -1 15 1912 月份不在1~12中

        SR2 6 -1 1912 日期不在1~31中

        SR3 6 15 1811 年份不在1812~2012中

        SR4 -1 -11912 两个无效一个有效
       
        SR5 6 -1 1811 两个无效一个有效

        SR6 -1 15 1811 两个无效一个有效

        SR7 -1 -11811 三个无效

      4.佣金问题等价类测试用例,它是根据佣金函数的输出值域定义等价类,来改进测试用例集合。

        输出销售额≤1000元 佣金10%

      1000<销售额≤1800 佣金=100+(销售额-1000)*15%

      销售额>1800 佣金=220+(销售额-1800)*20%

      测试用例 枪机(45) 枪托(30) 枪管(25) 销售额 佣金
     
        1 5 5 5 500 50

        2 15 15 15 1500 175

        3 25 25 25 2500 360
     
      根据输出域选择输入值,使落在输出域等价类内,可以结合弱健壮测试用例结合。

  • 测试用例设计白皮书之等价类划分方法

    2009-04-01 17:08:26

      一.方法简介

      1.定义

      是把所有可能的输入数据,即程序的输入域划分成若干部分(子集),然后从每一个子集中选取少数具有代表性的数据作为测试用例。该方法是一种重要的,常用的黑盒测试用例设计方法。

      2.划分等价类:

       等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于揭露程序中的错误都是等效的,并合理地假定:测试某等价类的代表值就等于对这一类其它值 的测试,因此,可以把全部输入数据合理划分为若干等价类,在每一个等价类中取一个数据作为测试的输入条件就可以用少量代表性的测试数据取得较好的测试结 果。等价类划分可有两种不同的情况:有效等价类和无效等价类。

      1)有效等价类

      是指对于程序的规格说明来说是合理的、有意义的输入数据构成的集合。利用有效等价类可检验程序是否实现了规格说明中所规定的功能和性能。

      2)无效等价类

      与有效等价类的定义恰巧相反。无效等价类指对程序的规格说明是不合理的或无意义的输入数据所构成的集合。对于具体的问题,无效等价类至少应有一个,也可能有多个。

      设计测试用例时,要同时考虑这两种等价类。因为软件不仅要能接收合理的数据,也要能经受意外的考验,这样的测试才能确保软件具有更高的可靠性。

      3.划分等价类的标准:

      1)完备测试、避免冗余;

      2)划分等价类重要的是:集合的划分,划分为互不相交的一组子集,而子集的并是整个集合;

      3)并是整个集合:完备性;

      4)子集互不相交:保证一种形式的无冗余性;

      5)同一类中标识(选择)一个测试用例,同一等价类中,往往处理相同,相同处理映射到"相同的执行路径"

      4.划分等价类的方法

      1)在输入条件规定了取值范围或值的个数的情况下,则可以确立一个有效等价类和两个无效等价类。如:输入值是学生成绩,范围是0100

      

    测试用例设计白皮书之等价类划分方法

     

      2)在输入条件规定了输入值的集合或者规定了"必须如何"的条件的情况下,可确立一个有效等价类和一个无效等价类;

      3)在输入条件是一个布尔量的情况下,可确定一个有效等价类和一个无效等价类。

      4)在规定了输入数据的一组值(假定n个),并且程序要对每一个输入值分别处理的情况下,可确立n个有效等价类和一个无效等价类。

      例:输入条件说明学历可为:专科、本科、硕士、博士四种之一,则分别取这四种这四个值作为四个有效等价类,另外把四种学历之外的任何学历作为无效等价类。

      5)在规定了输入数据必须遵守的规则的情况下,可确立一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则);

      6)在确知已划分的等价类中各元素在程序处理中的方式不同的情况下,则应再将该等价类进一步的划分为更小的等价类。

      5.设计测试用例

      在确立了等价类后,可建立等价类表,列出所有划分出的等价类输入条件:有效等价类、无效等价类,然后从划分出的等价类中按以下三个原则设计测试用例:

      1)为每一个等价类规定一个唯一的编号;

      2)设计一个新的测试用例,使其尽可能多地覆盖尚未被覆盖地有效等价类,重复这一步,直到所有的有效等价类都被覆盖为止;

      3)设计一个新的测试用例,使其仅覆盖一个尚未被覆盖的无效等价类,重复这一步,直到所有的无效等价类都被覆盖为止。

      二.实战演习

       1.某程序规定:"输入三个整数 a b c 分别作为三边的边长构成三角形。通过程序判定所构成的三角形的类型,当此三角形为一般三角形、等腰三角形及等边三角形时,分别作计算 … "。用等价类划分方法为该程序进行测试用例设计。(三角形问题的复杂之处在于输入与输出之间的关系比较复杂。)

      分析题目中给出和隐含的对输入条件的要求:

      (1)整数 2)三个数 3)非零数 4)正数

      (5)两边之和大于第三边 6)等腰 7)等边

      如果 a b c 满足条件( 1 ~ 4 ),则输出下列四种情况之一:

      1)如果不满足条件(5),则程序输出为 " 非三角形 "

      2)如果三条边相等即满足条件(7),则程序输出为 " 等边三角形 "

      3)如果只有两条边相等、即满足条件(6),则程序输出为 " 等腰三角形 "

      4)如果三条边都不相等,则程序输出为 " 一般三角形 "

      列出等价类表并编号

      

    测试用例设计白皮书之等价类划分方法

     

      覆盖有效等价类的测试用例:

      a b c 覆盖等价类号码

      3 4 5 1--7

      4 4 5 1--7),(8

      4 5 5 1--7),(9

      5 4 5 1--7),(10

      4 4 4 1--7),(11

      覆盖无效等价类的测试用例:

      

    测试用例设计白皮书之等价类划分方法

     

      

      1)划分等价类并编号,下表等价类划分的结果

      

    测试用例设计白皮书之等价类划分方法

     

     

    2.设有一个档案管理系统,要求用户输入以年月表示的日期。假设日期限定在19901~204912月,并规定日期由6位数字字符组成,前4位表示年,后2位表示月。现用等价类划分法设计测试用例,来测试程序的"日期检查功能"
      2)设计测试用例,以便覆盖所有的有效等价类在表中列出了3个有效等价类,编号分别为,设计的测试用例如下:

      测试数据 期望结果 覆盖的有效等价类

        200211 输入有效

      3)为每一个无效等价类设计一个测试用例,设计结果如下:

      测试数据 期望结果 覆盖的无效等价类

        95June 无效输入

        20036 无效输入

        2001006无效输入

        198912 无效输入

        200401 无效输入

        200100 无效输入

        200113 无效输入
     
       3.NextDate 函数包含三个变量:month day year ,函数的输出为输入日期后一天的日期。 例如,输入为 20063 7日,则函数的输出为 200638 。要求输入变量 month day year 均为整数值,并且满足下列条件:

        1≤month≤12

        1≤day≤31

        1920≤year≤2050
     
      1)有效等价类为:

       M1{月份:1≤月份≤12}

        D1{日期:1≤日期≤31}

        Y1{年:1812≤≤2012}
     
       2)若条件 ~ 中任何一个条件失效,则 NextDate 函数都会产生一个输出,指明相应的变量超出取值范围,比如 "month 的值不在 1-12 范围当中 " 。显然还存在着大量的 year month day 的无效组合, NextDate 函数将这些组合作统一的输出: " 无效输入日期 " 。其无效等价类为:

        M2{月份:月份<1}

        M3{月份:月份>12}

        D2{日期:日期<1}

        D3{日期:日期>31}

        Y2{年:年<1812}

        Y3{年:年>2012}

        弱一般等价类测试用例

        月份 日期 预期输出

        6 15 1912 1912616
     
      强一般等价类测试用例同弱一般等价类测试用例

      注:弱--有单缺陷假设;健壮--考虑了无效值

      ()弱健壮等价类测

       用例ID 月份 日期 预期输出

        WR1 6 15 1912 1912616

        WR2 -1 15 1912 月份不在112

        WR3 13 15 1912 月份不在112

        WR4 6 -1 1912 日期不在131

        WR5 6 32 1912 日期不在131

        WR6 6 15 1811 年份不在18122012

        WR7 6 15 2013 年份不在18122012
     
      ()强健壮等价类测试

        用例ID 月份 日期 预期输出

        SR1 -1 15 1912 月份不在112

        SR2 6 -1 1912 日期不在131

        SR3 6 15 1811 年份不在18122012

        SR4 -1 -11912 两个无效一个有效
       
        SR5 6 -1 1811
    两个无效一个有效

        SR6 -1 15 1811 两个无效一个有效

        SR7 -1 -11811 三个无效

      4.佣金问题等价类测试用例,它是根据佣金函数的输出值域定义等价类,来改进测试用例集合。

        输出销售额≤1000 佣金10

      1000<销售额≤1800 佣金=100+(销售额-1000)*15%

      销售额>1800 佣金=220+(销售额-1800)*20%

      测试用例 枪机(45) 枪托(30) 枪管(25) 销售额 佣金
     
        1 5 5 5 500 50

        2 15 15 15 1500 175

    3 25 25 25 2500 360
     
      根据输出域选择输入值,使落在输出域等价类内,可以结合弱健壮测试用例结合。

  • 软件测试职业发展方向(转载)

    2009-02-16 13:27:46

     

    天地玄黄,宇宙洪荒;所谓光阴似箭,因为一转眼滚滚的历史车轮就将人类文明推进了二十一世纪的信息时代!葛大爷有对白曰:二十一世纪最宝贵的是什么?对曰:人才!何为人才?sincky曰:适应时代潮流,把握社会需求,并为我中华老大帝国创造社会价值的人!哎哟,不诹了,其实今天笔者在这里要和大家探讨的,是软件测试的职业发展问题,重点要阐述的是软件测试从业者的职业发展方向,欢迎大家按enter键换行,继续浏览!

        一个人从大学毕业,即开始发生从学生时代向职业人士的过渡,这种过渡走的好,可以实现毕生宿愿,体现个人价值,不管你是否喜欢,功名、利禄尽收眼底;如果 走的不好,则会误入歧途,纵有凌云壮志、万丈豪情,难免一生郁郁不得志,终归化作片片飞尘,无语对穹苍!那么如何才能顺利的完成这种过渡、踏上我们豪迈的 职业旅程呢?答曰:认清自己,选择适途!战国的魏人荆轲具有十步杀一人,千里不留行的本领,曾向魏王献策曰:国君,我是职业杀手,我杀人的技术很强!魏王问:那么你想杀谁呢?对曰:杀他个国君如何?魏王大惊,慌然离去!后来荆轲离开魏国,与燕太子丹密谋,留下了图穷匕首见荆轲刺秦王的千古佳话。荆轲,良禽也,择木而栖和太子丹合作,是他的高明之处;不过笔者认为他是一个典型的低管理、高技能的人才,当他紧握嬴政的脖领、持剑相逼时,他太得意忘性了,可见他没有领导的统御力决断力,所以落了个刺杀失败、拔剑自刎的下场,虽然他的侠义与胆识流畅千古,但是终究是个杀手而已;当今社会下,如果低管理、高技能的人干工作干到丢了性命,那也真是一个笑谈了!

        目前我们国家高等学历大幅度扩招,造成社会的低端人才严重过剩,大学生毕业找不到工作、或者找不到合适的工作例子鳞次栉比;但是社会各行各业对高端人才的 需求又求贤若渴;那么如何解决这种矛盾呢?从大环境来说,国家应该改革教育体制、提高教学质量、重视高端人才的培养,但是,一个问题一旦上升到国家的层 次,就要等它个十年八年!我们没有办法改变世界,但是我们有能力改变自己;所以我们从个人的角度来讲,讲讲我们这些软件测试的从业者们,如何认清自己、选择适途!

       纵观当今社会各行各业,对于个人的职业发展方向,从宏观上都可以划分为四个群体,即:

      低管理、低技能
      高管理、低技能
      低管理、高技能
      高管理、高技能

       而在IT 行业这种划分方法更为合理,sincky为其命名为一起点-三方向示意图

       告别了象牙塔,带着对校园生活里那段风花雪月的追忆,年轻的毕业生们走上了社会;这时候的年轻人,大多数是属于低管理、低技能的 群体,我们没有工作经验,不知道企业的工作流程,不清楚各个职业的工作技能,更不具备任何行业的管理能力;然而值得庆幸的是,人类问明发展到现在所出现的 众多行业,都已经有了众多可以参考的群体,这些群体就理所当然的成了我们可以借鉴的发展方向!虽然我们的起点都是一个,但是可以选择的发展方向却是丰富多 样!

       高管理-低技能,即是我们通常所说的管理路线!在IT业, 这个方向的成功者不乏项目经理、项目总监直至企业的最高管理层;但是走这个方向也要有技术方面的积累,因为管理者的影响力中,除了职位赋予的权力以外,还 包括个人人格方面的能力和专业领域的专业能力,而后者就是技术水平!而计算机行业本身,也决定了技术底蕴对职业发展的重要影响,所以年轻的IT朋友们,如果想为自己的职业人生设计成这个路线,除了适当的技术积累外,更要有意识的锻炼自己的管理素质,下图可做参考:

       低管理-高技能,即通常所说的技术路线!IT业 以技术为主导,对于喜欢钻研技术、探讨技术的人,可以选择该条路线,走的深入、走的彻底!只因中国对于技术与管理的认识不同,造成很多人认为做技术不赚 钱、不被重视,自身误以为不过是个工程师而已,所做事情只是辅助企业的运作。实际上,在欧美发达国家,资深技术人员的薪资非常高,从业时间的周期也相当 长,在MicrosoftIBM等巨头企业,不乏年龄在50岁以上的资深程序员或系统架构师,而其薪资也和高级管理者一样高!而另外一个不争的事实是,企业对于管理的职位是有限的,并且一些优秀的技术人员不愿做管理,或者不适合做管理,因此社会上出现的资深技术专家(或者类似职位),为喜好技术的从业人员提供向上的通道。

       高管理-高技能,即咨询方向是较为均衡、全面的路线,也是众多企业希望员工努力的方向。然而有调查结果显示,由于现实种种因素的制约,大约90% 的个人是分别沿着管理方向或者专家方向发展的,真正实现在咨询方向达到一定的高度的人少之又少,而且在这为数不多的咨询方向达到又一定高度的人才,往往又 会由于企业资源的限制无法将个人价值完全发挥而最终离开所在企业,成为专业培训师、咨询师;一些国际知名的咨询公司如麦肯锡、安达信乃至毕博或其他,可谓 大家在个人职业生涯到达一定阶段,作为自己继续突破职业瓶颈的发展路线。

        那么,对于软件测试的从业者,我们的出路在哪里?我们的职业发展该如何设计?我们的发展方向又有哪些呢?这里笔者和大多数测试同行意识相同,笔者也曾在多 篇文章里标明,中国的软件测试行业尚属起步阶段,其发展的步履上布满了荆棘与泥泞;然而其发展速度可谓惊人的,从笔者刚毕业时候对软件测试的“0”概念、从业同行者寥寥无几,到最近2年的各大媒体纷纷报道的中国软件测试人才缺口20万、软件测试工程师将成为未来10年最紧缺的人才之一、包括笔者所接触的众多国内外优秀企业对高端测试人才年薪10万、15万、20万的招聘需求……可见,选择软件测试这个朝阳行业的朋友,做了一个比较正确的选择!然而,如何任何事物总有它的两面性和矛盾性:2006年初在北京、上海、深圳举办的几次春季大型招聘会上,多家企业纷纷打出各类高薪招聘软件测试人员的海报,出人意料的是,收到的简历尚不足招聘岗位数的50%,而合格的竟不足30……引起我们思考的是,我们的软件测试从业人员还有很大一部分不满足当今社会的需求;而另一层含义是,我们还有很大的提升空间!因此解决该矛盾的突破点是:每个人在这个行业里找到自己的发展方向,规划自己的职业蓝图,从而有针对性的锻炼自己的职业技能,增加个人的职业砝码!

       软件测试职业发展方向,大体上与上述的通用职业发展路线图相吻合,也可以分为管理路线、技术路线、管理+技术路线;只是针对该行业本身,有其特殊性和细致性。其图示如同两个重叠的”V”字样,我们为其命名为V模型;该模型适用于大多数行业性软件测试从业人员,一些特殊领域如游戏测试、嵌入式测试、硬件测试,也可作为参考。本文是三部曲之一,只介绍职业发展方向定义,在下一曲会介绍各个职业方向应该具备的知识与技能体系!

       双V的底点是测试工程师,属于软件测试职业生涯的初级域,其适用范围是入行软件测试3年 内的常规测试从业者,其主要工作内容是按照测试主管(即直接上司)分配的任务计划,编写测试用例、执行测试用例、提交软件缺陷,包括提交阶段性测试报告、 参与阶段性评审等。初入测试行业,进入企业从事测试工作的人员,都要从该层次做起,虽然有时感觉乏味无趣,甚至迷茫困惑,但是我们可以根据个人的兴趣与特 长,向上选择适合自己的路线,因为谁都不会甘心一辈子只做一个普通的测试工程师,那么大家看到这里,就可以摩拳擦掌,看看向上发展的通道中,哪一个适合自 己,然后立刻从现在开始,确定自己未来5年、10年甚至一生的发展目标迈进,用笔者经常跟学员说的一句话来形容:把握现在,即刻做起,相信自己是最强的!

       首先是常规路线,即双V模型的重叠线,这条发展路线要求管理与技术并重,因为软件测试的行业特点决定了这个因素:测试工程师向上晋升到测试主管、测试经理、测试总监,直至咨询域的更高方向!

       测试主管是企业项目级主管,对于中小型软件公司也可以是企业级主管,属于中级发展域,适用范围是25年 职业经验的测试从业者。其工作内容是根据项目经理或测试经理的计划安排,调配测试工程师执行模块级或项目级测试工作,并控制与监督软件缺陷的追踪,保证每 个测试环节与阶段的顺利进行。严格来说,这个级别更多属于测试的设计者,因为企业的测试流程搭建是由更高级别的测试经理或相关管理者来做的,测试主管负责 该流程的具体实施;而更多的工作,是思考如何对软件进行更加深入、全面的测试。因此笔者认为测试主管比较有创造性的工作内容就是测试设计,而恰恰很多公司 忽略了或没有精力来执行此工作内容!应该说,在一个企业里做了3年左右测试工作的人员,很容易晋升到该职位,而之所以晋升,是与个人测试技术的过硬、测试方法的丰富,加上对测试流程的监控力与执行力的职业素质息息相关!

       测试经理是更高级别的测试管理者,属于高级测试方向域。对于大中型软件公司,该职位尤为重要,并且对其职业要求也比较高,一般适合48年 的测试从业者,在管理与技术能力双双比较成熟的情况下,可以结合具体环境晋升到该级别。测试经理负责企业级或大型项目级总体测试工作的策划与实施。随着软 件行业的发展,企业对软件工程里各个角色的定位逐渐明显,测试经理完全与开发经理(一些公司也成为项目经理)平齐,除了需要统筹整个企业级或项目级测试流 程外,还要对于不同软件架构、不同开发技术下的测试方法进行研究与探索,为企业的测试团队成员提供指导与解决思路,同时还要合理调配不同专项测试的人力资 源(如业务测试工程师、自动化测试工程师、白盒测试工程师、性能测试工程师),对软件进行全面的测试;另外,一些企业里,测试经理还需要与客户交流与沟通,负责部分的销售性或技术支持性工作。嘿嘿,看看那些高薪招聘测试经理的企业对该职位的要求里外语口语的描述,就可见一斑!

        测试总监,属于常规发展路线的最高域,如果再往上发展,那只能是咨询域了;不过笔者并没有将其在图中标记出来,因为该职位对于国内目前的大多数软件公司根 本没有设立,也就没必要再在图中体现了。该职位一般在大型或跨国型软件企业,或者专向于测试服务型企业有所设立,由于其企业自身的职位定位不同,以及软件 测试整体行情所处的阶段,这里不好归纳陈述;但是一般设立测试总监的企业,该职位都相当于CTO或副总的级别,是企业级或集团级测试工作的最高领导者,驾驭着企业全部的测试与测试相关资源,管理着企业的全部测试及质量类工作。而其职业要求,也是技术与管理双结合;基于目前软件测试行情看,这种高管理-高技能的发展目标,不会适合大多数人的选择,社会也不会提供如此众多的测试总监职位让我们去应征!

        应该说,大多数测试从业者都不是技术与管理双优的人,而如今一些到达测试经理或测试总监级别的优秀测试人才,已经领先一步开辟了这条发展路线的先河,希望 这些朋友和大家多多分享经验,让更多的朋友弥补自己管理或技术上的不足,在这条路线上有所建树,共同提高,在实现个人人生价值的同时,也自然而然的推动了 软件测试行业的发展;行业发展了,测试人员不再被忽视了,待遇自然也提高了,也就不会有很多朋友迷茫的跟我说我的日常工作只是点击按钮和按键盘了,因为我们相信行业的不断成熟,会逐渐将软件测试职业细化,我们的从业者就可以真正的在如下的管理路线和技术路线找到自己的位置,并潜心走向深入的!

       软件测试,是技术主导的职业;不管选择哪条发展路线,都是需要一定的技术沉淀,只是相对来说,管理路线对技术方面要求不高而已。那么我们就先挑重头的技术路线展开讨论。一般来说,一个普通的测试工程师刚入行,3个月左右熟悉企业的工作流程和模式,那么今后的工作内容趋于平稳。然而社会是残酷的!如果单单停留在测试工程师的阶段,若干年后,相信你再也竞争不过那个时候的应届毕业生,当你的工作技能和职业素质趋于与那些朝气蓬勃的年轻人相当时,企业会毫不留情的选择他们,而release你, 因为你的成本消耗要比他们高,这是大实话!然而现实又是公平的!因为软件开发技术的不断日新月异,软件功能需求的不断丰富多样,决定软件开发这一系统工程 的错综复杂,因此为了保证软件的质量,就要提高测试的水平,这也就为软件测试职业的细化起到先决因素,也是目前社会上出现招聘专项测试工程师的必然趋势! 因此,这个趋势给了我们这些常规测试工程师一个空前的好机会!所谓以毒攻毒,软件开发靠的是技术,为了测试软件,也必须用技术;那么我们就来看一下从技术路线,软件测试职业发展有哪些方向。

       技术路线,笔者结合国内外软件测试行业现状,划分为三个半方向,分别是自动化测试工程师、白盒测试工程师、性能测试工程师和认证测试工程师,在V模型中右侧体现;前三者适用于通用软件测试领域,认证测试工程师乃嵌入式测试领域职位,至少目前仅出现在嵌入式领域,因此以虚线标记,即三个半。前三条路线对技术的要求程度逐渐增加,三条曲线的斜率也依次递增(认证工程师不参与比较)。

        自动化测试工程师,笔者为其定义在功能测试范畴,指通常所说的依靠自动化测试工具进行软件黑盒测试的工程师。笔者接触的很多测试界朋友,尤其年轻的刚入行 者,对测试工具充满了无限的兴趣,他们喜欢那种编写脚本、调试成功后的快感,喜欢看到自定义的日志里记录了本来手工测试烦琐的无聊头顶的工作、而采用自动 化方式实现后如此清晰丰富的内容后的兴奋!可以理解,因为笔者也是从那段时光走过来的,现在也负责于我们学员的自动化测试教学工作。从大环境讲,自动化测 试是软件测试执行阶段的必然趋势,社会对于软件测试的认可度以及对自动化测试人才的需求必将日益增加,从目前国内做自动化测试的从业者薪资情况看,也普遍 高于常规测试工程师,最浅显的道理是自动化测试比手工测试有了技术含量,^--^”虽然自动化测试在整个行业的普及不是一朝一夕,但是从个人角度讲,自动化测试可以作为个人的发展方向之一,因为如果你率先掌握了这种技术,等到社会需要时,你已成为这个职位的成熟操作者!而国内的51testing把握了时代前沿,与自动化测试工具巨头厂商Mercury(美科利)合作,在中国唯一推出Mercury自动化测试全套技能认证(CPE/SP/CPC),相比其它初等认证,它的实效性和价值性更具意义,也为测试从业者提供了一个进入自动化测试领域的快捷方式!

        白盒测试工程师,笔者定位于在软件测试周期的单元测试阶段对软件进行的代码级测试的人,包括代码走读、代码功能与逻辑测试、代码内存泄漏检查、代码运行效 率检查、代码测试覆盖率分析等。如果说,自动化测试只是依靠脚本语言完成测试脚本编写与调试的过程(因为自动化测试工程师的工作重点不在编写脚本),对于 自动化测试工程师的技术要求要相对偏低的话,那么白盒测试工程师就要对大型程序开发语言的完全掌握,因此其技术要求相对偏高!而另一方面,白盒测试在目前 国内软件行情下,一些公司根本不做,其成本高、代价大的特点决定了这个现状,而一些对软件质量要求非常高(如军事类、电信类、财务金融类等)的企业,也会 调动开发工程师来实施此事。但是,还是那句话,测试行业在发展,测试人员能力在提升,软件的开发技术在复杂化,要对软件进行尽可能全面的测试,白盒测试不 可忽视!当下专门高薪招聘白盒测试工程师的企业也比比皆是,从中我们可以感知,白盒测试工程师会是很多有开发背景、意欲进入测试行业的良好突破口,白盒测 试人员的需求也会逐渐增加。

        性能测试工程师,即在系统测试阶段、功能测试后对软件系统性能指标进行采集分析和运行效率检测的人。笔者认为,在一个尽量压缩的测试流程里,功能测试可以 手工进行,白盒测试可以不做,但是性能测试必须要做,除非该软件非网络类软件即单机版软件!这里笔者再提一个观点供大家参考:软件测试,从宏观上可以划分 为三个大方面:功能测试、性能测试、安全性测试,功能测试说明软件做对了,功能测试+性能测试说明 软件做好了,三者结合起来说明软件做的非常好!安全测试暂且抛之不提,这是下一个发展域的内容,但是为了把软件做好,为了真正保证软件的质量,性能测试绝 不容忽视;只因目前很多企业由于时间、成本、人力条件的限制,暂且不做性能测试。性能测试工程师相对来说,是三个技术路线里技术要求最高的,因为软件的性 能瓶颈归根结底落实到代码的运行效率这个问题上,因此性能测试要做好,性能测试工程师起码要懂开发;而为了发现性能问题,要懂软件开发架构;为了定位性能 问题,要懂操作系统、网络协议、应用服务器乃至数据库的原理与使用;为了最终解决性能问题,要根据定位的问题有针对性的对代码、操作系统、网络架构、服务 器、数据库进行优化!当然性能测试是一个系统工程师,绝对不是一两个人的事情,对于常规性能测试工程师,具备定位性能问题的能力即可。正因为性能测试工程 师技术要求的高超,该职位的待遇也是目前测试技术路线最高薪的一个,实为综合技术能力较强的测试人员的明智选择!

       上述四职业路线由于其技术程度的突出,一般在企业里由测试经理直接所属,与测试主管级别具有相同的待遇,并处于相同发展域。

       进入技术路线的高级域,根据中级域的四个路线,可以细分成五个路线,分别是资深自动化测试工程师、资深白盒测试工程师、资深性能测试工程师、安全性测试工程师、标准化工程师,这些高级技术类人才完全与常规测试经理平齐,属于软件测试职业发展高级域。

       资深自动化测试工程师由自动化测试工程师晋升而来。如果说常规自动化测试工程师只是负责自动化测试脚本本身的设计与开发,那么资深自动化测试工程师的工作内容就是自动化测试这项工作的实施!笔者早年在IBM公开讲座时候,讲过一篇《以RUP原则实施自动化测试》的主题,RUP里提倡自动化测试是一个庞大的系统工程,绝对不是有了技术、有了工具、有了掌握技术和使用工具的人就可以实施的,而是应该把自动化测试当成一个针对企业自身的项目来看待,需要经过引入、计划、设计、测试、执行、配置管理等环节(参加sinckyblog“天行健-君子以自强不息),而这些自动化测试的流程搭建,就是资深自动化测试工程师的份内之事。另外,笔者要强调,按照国内外自动化测试领域的发展趋势,我们把自动化测试划分为四个发展阶段(我的blog里也有阐述);也就是说,录制脚本-添加验证点-回放脚本只是最初始的自动化阶段,要在企业实施自动化测试,要有资深自动化测试工程师来设计数据驱动,开发测试框架,甚至一些企业内部自主开发小型测试工具(而非商业工具)的先例,这些也都是建立在资深自动化测试工程师具有深厚的技术底蕴后,主导其他人员协调完成的事情。

        资深白盒测试工程师,其工作内容包含常规白盒测试工程师的内容,除此之外,要协助测试经理或测试总监攻关测试方法与技术性难题,因此其技术水平更加雄厚。 如果常规白盒测试工程师是停留在某种程序设计语言类型的代码级测试,那么资深白盒测试工程师就要脱离程序设计语言本身,结合不同架构、多种开发技术交互的 情况下,寻找代码测试方法,并具有对代码优化的能力。由于该路线在国内很少有实例参考,这里不再赘述。

        资深性能测试工程师,来源于常规性能测试工程师,按照常规性能测试工程师的技术要求,资深性能测试工程师应该具备性能测试整体方案的设计能力,以及软件系 统性能问题定位和性能优化的能力!初此之外,也要对主流的软件开发模式下的应用系统具有敏锐的洞察意识和感知意识。软件开发的架构会日益复杂化,软件应用 的各种软硬件平台、数据库类型、服务器类型、网络协议层出不穷,不得不说,都为性能测试的从业者们提出了严峻的考验!值得庆幸的是,各种同类产品的厂商在 开发产品时都遵从业内统一标准,性能测试人员结合自身的丰富经验,加上对软件性能测试技术的研究,这样的考验我们欣然面对,这样的人才则会日益增多,在软 件测试行业里充当佼佼者地位。

        安全性测试工程师,笔者将其从性能测试工程师衍生出来,因为只有具备性能测试经验的人,才对软件的开发模式、实现架构和技术本身充分了解,才会感知和预见 软件系统存在的安全漏洞,加上其本人是测试出身,才知道如何通过系统漏洞尝试攻击软件系统,达到测试的目的。目前国内软件行业对于安全性测试的认识尚未清 晰,该职业也更没有普及,一般只限于军事类、机密类、防病毒类或其他高安全性软件的测试工作中。

       再次强调,人类进入文明社会后,任何社会活动都不是独立的个体能够实现的;在高度讲究团队合作、协同办公的今天,软件测试工作更不是测试工程师几个人就能做完所有的事情的;上述各发展路线的技能要求,只是为了增强个人职业突破的砝码,你的砝码越多,被利用价值越大,为企业创造利润的程度越高,企业自然给予你更丰厚的回馈!达尔文伯伯的优胜劣汰自然规律不会变,多劳多得、少劳少得的市场规律也不会变!

       曾经有如此众多的测试职业发展路线放在我面前,结果我没有珍惜;等到软件测试行业发展到成熟阶段,我想入行却入不了行的时候,我才后悔莫及;尘世间干测试最大的不幸莫过于此;如果非要问sincky:再往上的发展通道是什么,那么sincky一定要告诉你,技术专家域!

       在技术路线,向上继续提升的方向,我们称之为技术专家; 如果说前面描述的技术职位的所涉范围都定位在企业内部,即企业级资深性能测试工程师,那么技术专家,我们可以看作是领域级专项人才!随着软件测试行业的职 位不断细化,每个人在自己擅长的领域走向深入,都可以成为该领域的技术专家,技术专家在自已经营的领域里,具有个人独到的见解和深厚的技术实力,而这类人 才可以不再从事具体的测试工作,而是提供行业性测试技术咨询、培训等,为软件测试整体行业的发展,起到了鲜明的带头作用。在一些专业的咨询、培训公司,或 者IBMMicrosoft等巨型公司,不乏这样的人才;然而目前在我国,这样的人才较少,但是却可以为我们大家提供努力方向,只要我们每个在技术路线供职的测试从业者,规划好自己的职业人生,并以坚韧的毅力和顽强的斗志,若干年后,你我皆可笑谈测试人生,把酒临风,其喜洋洋者矣!而目前在国内几个IT行业发达的省市,专项于软件测试服务或一些大型软件企业,也有这样的职位暂露头角,我们深信,社会对高端人才的需求趋势是越来越大的,更多的优秀企业也会为员工提供更多、更广的发展空间,值此大好形势,就看我们个人如何充分利用这些上升通道了。

        在我们的软件测试从业人员里,有这样一部分群体:他们非计算机相关专业毕业,不懂软件开发,由于国内种种对软件测试人才的偏激认识,认为测试人员不需要懂 开发,只要会编写文档、执行用例即可;因此很多测试工程师并不具备开发背景,并且对软件技术掌握肤浅,而对于没有技术底蕴的人强迫其走技术路线,不能不说 是一种折磨!因此,这个群体里的朋友,是不是认为自己只能做一辈子常规测试工程师呢?答案是否定的,因为在V模型的左侧,是软件测试职业发展的管理路线。软件测试的管理路线,与通用职业发展示意图的高管理-低技能并不完全相同,只因软件测试独具的行业特点,我们认为软件测试行业的非技术路线发展方向,更多的是从软件测试行业衍生出来的职位,如质量保证、配置管理。如果说软件测试职业发展的技术路线更侧重于职业技能的提升,那么这条管理路线则更侧重于职业素质的积累(笔者强调是侧重,并不表示不需要);换句话说,技术路线更侧重人的智力因素,而管理路线更侧重人的非智力因素。

       从事了13年左右的常规测试工程师,在经过对个人性格特点剖析后,如果认为自己是一个倾向于高管理-低技能的类型,那么想要实现自己的职业提升,可以向中级发展域的配置管理工程师、质量保证工程师、业务测试工程师转型。

       配置管理(SCM)与质量保证(SQA)同是CMM中的关键过程域(KPA), 也同是现代软件工程里的必要角色,与软件测试同属软件开发团队的重要组成部分。只因这两个角色在软件工程里的人员配比数量相对较少,还不如软件测试这样规 模化乃至于形成行业,而最多是一个职业;另外一个社会现象是,企业很少直接从社会直接招聘配置管理工程师和质量保证工程师,而通常的做法是从企业内部的现 有测试员工队伍里选拔,而转型后的测试工程师,就成为SCMSQA。分析其原因,我们可以感知,SCMSQA与软件测试工程师都是关注于软件质量的相似职位,社会对于配置管理、质量保证的定义和工作内容并未普及,与其直接从社会招聘“0”基础的人来培养,倒不如从软件测试人员里升华!一般来说,这两种职位的上报对象是项目经理或相同级别管理者。

        转型后的配置管理与质量保证工程师,一定要转变一个意识,那就是常规测试工程师的工作范围很大一部分(不是全部)只限于测试流程,而配置管理和质量保证的 工作范围是面向整个软件开发流程,二者的职业要求都非常重视软件工程知识体系的建立和软件开发总体流程的实施能力。由于配置管理工程师除了企业配置管理流 程的搭建与实施外,一般会涉及配置管理工具的管理与维护,而质量保证工程师更多的工作是软件开发流程的控制与维护,故而配置管理对技术的要求稍高于质量保 证。随着我国软件行业水平的不断发展,众多软件公司纷纷通过CMM/CMMI,企业对于软件开发团队的角色配比制度也将逐渐健全,当前社会对配置管理与质量保证工程师的职位需求日益增加,种种现象表明,对于软件测试工程师出身的从业者,转型至SCM/SQA不失为突破个人职业生涯瓶颈的又一通道!

       业务测试工程师,笔者定义为面向行业类软件业务逻辑与工作流测试的人员。当前软件开发类型,很大一部分是行业类软件的应用,如ERPSCMCRMOA、电信、金融、财务、嵌入式、通信、手机、游戏……这 就要求从事行业类软件测试的人员具备行业背景、业务知识,熟练该行业工作流程。从社会上出现的很多对此类经验要求的测试工程师招聘信息中,我们更加肯定这 种趋势;所谓存在即是道理,既然社会上有了需求,那么就可以作为个人发展的方向。而另外一个特点是,业务测试工程师的工作内容主要是黑盒测试,属于功能范 畴,因此对技术要求不大,设置一些大型行业类软件公司的业务测试工程师薪资丰厚,但是完全可以不懂技术,因为它的工作性质决定了不需要懂很多的技术!他们 甚至连软件的界面测试都不做——交给常规测试工程师实施,而完全关注软件的业务性和易用性,由于其深厚的行业背景,可以为软件的在正式发布前提出很多建设性的意见,而这些建议正是软件开发商提高产品易用性、增加用户满意度、开拓市场、创造利润的关键因素之一!

       当管理路线的中级域方向继续上升至高级域,就分别到达配置管理经理、质量保证经理、产品经理、业务专家,这类人才地位高、待遇厚,一般资深的软件工程领域专家都聚集于此。

        如果说配置管理工程师、质量保证工程师更加侧重于配置管理流程、质量保证流程的实施与日常管理维护,那么配置管理经理、质量保证经理就是更侧重于配置管理 流程、质量保证流程的建立与改进。一般在中小软件企业,可能没有这两个角色,而全部的配置管理或质量保证工作都由工程师担当;但是大中型软件企业对资深配 置管理经理、资深质保经理求贤若渴。软件系统越庞大,软件开发团队规模就越庞大,软件开发流程中出现问题的几率就越高,高效管理软件开发流程,不断改进软 件质量,是每个软件公司在技术上没有顾虑后的下一个急需攻破的难关!

       业务专家,属于行业内咨询、顾问的角色,已经几乎脱离了测试工作本身,而更多为企业的产品需求分析、设计、开发、测试等各个环节提供指导工作,其目的也是提高软件的易用性和稳定性,减少后期不必要的需求变更。该职位也同样在目前热点行业的大中型软件企业有所设立。

       产品经理,这个职位在很多企业有所设立,笔者认为它是质保经理的派生,只是它更侧重于软件在产品化之前的质量监控工作,包括软件开发流程、软件测试等技术与管理的各个方面。由于该职位在业内没有明显定义,而根据不同企业的职位定位不同,这里无法统一陈述。

       管理路线的最高发展域是咨询域,与技术路线的专家域类似,在配置管理、质量保证、软件产品化、行业领域达到高深造诣的人才,他们有丰富的从业经验、深厚的管理底蕴,具有对软件工程高瞻远瞩的慧眼和胆识,往往供职在专业的咨询与培训公司,提供IT业管理类咨询与培训的服务,推动着软件行业的前进。国内外很多为软件企业进行CMM咨询和实施的公司里,就是这些人才的大本营之一!

       笔者认为,在V模型的管理路线里,中低级发展域的人才对技术与管理的区分较为明显,而到了高级与更高级发展域,更多的是复合型人才,软件业以技术为主导,没有一定技术积累,还是很难达到高级境界;要在管理路线练出上乘武功,还是希望大家在主攻管理与流程类课题的同时,多丰富下自身的技术层面,嘿嘿!

    另外,笔者提倡管理与技术两条路线的平齐,而并非目前社会上认为的技术要比管理低一等,技术是靠吃青春饭,在这些人才到达最高发展域的咨询专家层面,二者应该完全具有相同的地位和待遇,只是称谓不同罢了!

      V模型sincky结合当前国内外软件测试行业现状提出的职业发展流程图,仅供测试从业者参考,并非一个的框架,大家不要拘泥于流程图本身;其实目前国内很多上升到高级域或最高域的资深人才,很多都是跳跃式、甚至跨越式的职业发展,因为命运掌握在自己手里,任何人都剥夺不了设计自身人生蓝图的权利;而另外一个角度是,任何人都不该不珍惜为自己规划职业生涯的机会!

       软件测试,一个日出东方的国际型行业,虽然偶尔会弥漫晨雾,甚或有暴雨来袭,但是我们都该坚持!有人说:什么叫失败?答曰:放弃就是失败!每 一次当我们身处逆境时,决不能用软弱的眼泪作为走向明天的见证,更不能用脆弱的感情去拴住生命的航线;是雄鹰就该搏击长空,是蛟龙就该挽起狂澜;沧海横 流,方显英雄本色,疆场搏斗,可露壮士肝胆!人生没有豁免权,每位从业者只有怀着不息的斗志,乘千里长风,破万里巨浪,才能支配命运走向辉煌的明天!
  • 测试用例制定的原则

    2009-02-13 11:30:23

      测试用例要包括欲测试的功能、应输入的数据和预期的输出结果。测试数据应该选用少量、高效的测试数据进行尽可能完备的测试;基本目标是:设计一组发现某个错误或某类错误的测试数据,测试用例应覆盖方面:

      1、 正确性测试:输入用户实际数据以验证系统是满足需求规格说明书的要求;测试用 例中的测试点应首先保证要至少覆盖需求规格说明书中的各项功能,并且正常。

      2、 容错性(健壮性)测试:程序能够接收正确数据输入并且产生正确(预期)的输出, 输入非法数据(非法类型、不符合要求的数据、溢出数据等),程序应能给出提示 并进行相应处理。把自己想象成一名对产品操作一点也不懂的客户,在进行任意操作。

      3、 完整(安全)性测试:对未经授权的人使用软件系统或数据的企图,系统能够控制的程度,程序的数据处理能够保持外部信息(数据库或文件)的完整。

      4、 接口间测试:测试各个模块相互间的协调和通信情况,数据输入输出的一致性和正确性。

      5、 数据库测试:依据数据库设计规范对软件系统的数据库结构、数据表及其之间的数据调用关系进行测试。

      6、 边界值分析法:确定边界情况(刚好等于、稍小于和稍大于和刚刚大于等价类边界值),针对我们的系统在测试过程中主要输入一些合法数据/非法数据,主要在边界值附近选取。

      7、 压力测试:输入10条记录运行各个功能,输入30条记录运行,输入50条记录运行。。。进行测试。

      8、等价划分:将所有可能的输入数据(有效的和无效的)划分成若干个等价类。

      9、错误推测:主要是根据测试经验和直觉,参照以往的软件系统出现错误之处。

      10、效率:完成预定的功能,系统的运行时间(主要是针对数据库而言)。

      11、可理解(操作)性:理解和使用该系统的难易程度(界面友好性)。

      12、可移植性:在不同操作系统及硬件配置情况下的运行性。

      13、回归测试:按照测试用例将所有的测试点测试完毕,测试中发现的问题开发人员 已经解决,进行下一轮的测试。

      14、比较测试:将已经发版的类似产品或原有的老产品与测试的产品同时运行比较,或与已往的测试结果比较 。

      说明:针对不同的测试类型和测试阶段,测试用例编写的侧重点有所不同。

      1、 其中第1、2、6、8、9、13项为模块(组件、控件)测试、组合(集成)测试、系统测试都涉及并重点测试的方面。

      2、 单元(模块)测试(组件、控件)测试:重点测试第5项。

      3、 组合(集成)测试:重点进行接口间数据输入及逻辑的测试,即第4项。

      4、 系统测试:重点测试第3、7、10、11、12、14项。

      5、 其中压力测试和可移植性测试如果是公司的系列产品,可以选用其中有代表性的产品进行一次代表性测试即可。

      6、 GMPS基础测试用例设计完成后,其他的测试项目只编写设计与之不同部分的测试用例。

      7、 对于每个测试项目测试的测试用例不是一成不变的,随着测试经验的积累或在测试其他项目发现有测试不充分的测试点时,可以不断的补充完善测试项目的测试用例。

  • 需求评审与需求测试

    2009-02-13 11:18:27

    在软件开发过程中,需求分析是最开始的工作,需求分析如果做得不够详细或者是偏离用户需求的话,往往会给项目带来灭绝性的灾难。因此如何保证需求分析的正确性,不偏离用户的需求就成了决定软件项目成败的关键。

    需求工程师取得用户的显性需求后,要仔细的分析用户到底要求软件实现什么功能,用户的表达和需求工程师的理解有时间并不会一致,这样会导致用户所想的和需 求说明书上所描述的有偏差。并且需求工程师取得用户的需求后必须做仔细透彻的分析,有时候用户的需求并不一定正确,可能是用户忽然的想法,并不可行。如果 需求工程师不能对用户提出的需求进行判断的话,可能辛辛苦苦的实现了用户需求,结果被用户自己否决掉。用户绝对不会将责任揽到自己身上,他们只会说“你们 是专家,怎么能怪我呢?”。 http://www.mscto.com

    网上有一幅漫画形象地描述了信息在传递过程中产生的误差。 http://www.mscto.com

    http://www.mscto.com

    需求分析师是项目中直接与客户接触的人,需求做的好不好决定项目成败,因此对于需求规格说明书的正确性必须进行彻底的验证,将错误在开工前就消灭。

    通常有两种手段来检查需求的正确性,分别是需求评审和需求测试。

    1、 需求评审

    软件开发网

    需 求评审可以分为正式评审与非正式评审,在需求规格说明书完成后,需求组必须自己对需求做评审。如果需求组递交的需求规格说明书在指导后面的工作的时候出现 很明显的错误,我想拿高工资的需求分析人员是无法向老板交差的。为了需求分析人员的名誉,他们自己会对自己提交的内容进行审核,直到他们认为自己的工作成 果足够好,才会将需求规格说明书提交给正式评审组。

    正式评审组的成员一般由公司内经验最丰富,技术最牛的人(技术总监)来担任,当然参加评审的人中间还应该有项目经理、QA人员、测试人员、架构师,他们仔细阅读需求规格说明书,并针对自己将要开展的工作内容进行检查,并提出问题。

    正式评审是最后一关,如果正式评审通过了,将进入系统设计阶段,如果在系统设计阶段再跨里程碑来修改需求的话,所花费的代价将大大增加。因此正式评审将是一个“鸡蛋里挑骨头”的过程,只有所有的人都认为需求已经没有什么可挑剔评审才能通过。

    2、 需求测试 http://www.mscto.com

    可 以认为需求评审也属于需求测试范围,但是这里提的需求测试和评审不同,它是测部门来测试需求是否符合用户的要求。显然这是有难度的,传统的测试工作都是从 单元测试开始,编码之前全部做得都是计划性工作。测试人员对需求分析进行测试?那么前提条件是测试人员必须熟悉需求分析,这对测试人员的要求提高了。将需 求测试人员作为测试人员中的特殊种类来培养,能够对需求是否正确进行检查,这样就能够在需求阶段就引入测试。当然需求测试人员可以是经过培训的需求分析人 员,但是他必须脱离需求组,加入测试部门,这样才能保证测试不是自己人测自己,以保证测试的效果。

    需 求测试不等同于后面阶段集成测试或者系统测试,后面的测试都是软件已经编写完成的条件下,判断软件是否会出错。而需求测试,只是验证需求是否真的是用户 的。对于需求的功能测试,可以用RAD工具建立界面原型,用户通过原型的操作来确定是否需求跟他的期望相同。对于那些用户不合理的需求,测试人员要能够分 辨出来,并跟用户进行核对,确定用户的真实需求。可以说需求测试是需求测试人员和用户共同来执行的。

    之所以将需求测试和需求评审并行进行,是因为需求评审是项目的各方干系人共同进行的检查工作,评审工作关注的焦点是分散的,很难将偏离用户的需求检查出 来,并且涉及的人很多,因此不可能耗费太长时间。而需求测试执行的时间可以比评审时间长,有专门的关注方面,能够检查出不合理的需求分析,在项目前期进行 错误纠正,往往比实现后纠正要节约几百甚至几千倍的成本。
  • 软件测试招聘之难

    2009-02-13 11:16:06

    【IT168 技术文章】

        从一月份到现在,面试了二十个左右的研究生,满意的很少,我开始去思考,到底是自己的要求过高,还是自己的面试方法有问题,抑或真的是现在的研究生的素质越来越低了?
           
        我理想的人选,首先,我希望他对测试感兴趣,有测试的感觉,测试并不是一件很有创造性的工作,但其中的乐趣,是很多coding高手所无法体会的,但需要 发现其乐趣,必须要喜欢上测试,才会更有效地发现软件存在的隐藏问题。其次,我希望他有一定的技术基础,对于在校的研究生的技术水平,我的要求不高,只需 要掌握最基本的SQL语句,会简单得Linux命令,懂得用Java或C写一个简单的程序,这些知识,是需要在项目中使用到的技术,同时也是学校的基础课 程上的东西。最后,是他的态度和性格,我希望他是一个责任心很强、具有良好沟通能力和团队精神的人,测试根软件开发最大的不同是,开发工程师可以只关心自 己所负责的模块或功能,而测试则要把握全局,需要跟不同的人去沟通,发现问题需要协助不同的人去定位和解决,测试是一个团队的工作,我希望招聘进来的人, 能够很快地融进我们的团队中,谦虚地学习,踏实地工作。

        我的这三个要求,似乎真的很高,因为当我以这三个标准去衡量我的candidate的时候,我总是满怀希望地开始跟他们交谈,而又失望地与他们告别。首先 是笔试的题目,至少有一半人,最基本的SQL和Linux命令都是没有把握地写进卷子的。“这份题目你觉得怎样啊?”我笑着问他们。“都是在学校学过的, 不过忘记了,只要给我时间,我很快就会学会的。”果然都是名牌大学的研究生,那样的自信。“我们的工作要求有一定的JAVA/Oracle/Linux技 术基础,如果给你时间,你要多长时间可以掌握呢?”“一两周就可以了。”“我们的招聘要求里面有些清楚这些要求吗?”“有。”“你从发简历到面试,大约多 长时间了呢?”“两周左右。”“那你为什么不利用这两周把招聘要求中的技术都好好温习一下呢?”我仍然笑着问,只是接下来大多都是沉默。我发觉这个问题, 真的能问倒所有人。其实,我不是想为难他们,只是,他们都是名牌大学研一或研二的学生啊,这些基础我当年大学三年级就已经可以灵活运用了,这些命令我也经 常会忘记,但是,每次自己去面试之前,都会花些时间认真地复习一下招聘要求中的技术,有备而战。其实,我想看的是这个来面试的人,是否在来之前有认真地准 备,我只是想看他对这个机会的态度。插一条记录到数据库中,居然有人用add,真叫我心疼!同事批评我说,别总拿态度来作要求,只要你给他培训两个月,什 么技术不会?用add还是用insert into有什么关系?只要他足够聪明就可以了。态度真的不重要吗?我真的不需要他们有技术基础吗?他们真的可以没有任何基础就进来,这些技术,我两周的培 训就可以让他们掌握,只是,他们的态度,我没信心让他们在两周之内扭转。当他们可以很高效地干活的时候,恐怕他们又要马上回学校去了。如果我培训的成本, 已经远远高于我自己做的成本,那么,我宁愿自己辛苦一些。不要怪我以态度作为评判的准则。

        简历,是用人单位初步刷选的一份资料,有些简历看上去就像一份草稿,或者是所展示的资料并不符合我们的要求,通常我们都会放弃进一步去了解。有些人的简历 做得很漂亮,好像什么都会,而且还有很多的项目经验,看上去似乎很有吸引力,但简历给人的印象未必就是真实的。每个公司都希望招聘进来的人可以有一定的项 目经验,因为这意味着他们一进来就可以给公司干活了,可以节省很多的培训成本。我也喜欢有项目经验的人,我还很喜欢跟他们聊他们曾做过的一两个项目,因为 在在这个互动的过程中,你可以看出他的思维、表达和技术。简历中的项目经验可以是假的,但在面试的时候就不能假了,在面试过程中的交流足以让我们判断出这 个人的技术水平和思维能力。很多人,在简历中写着正在做的项目或一两个月之前做的项目,当我们问他有关系统的框架或某个功能的流程时,表达起来却是不够清 晰,再深入一些去追问,回答就差强人意了。我在想,是因为他们不善于表达,还是他们本身没有深入理解过自己所做的项目,甚至是自己根本上就没有这些项目经 验?企业或者也应该思考一下,是否应该给没有项目经验的人一些平等的机会,以免他们投其所好,将简历粉饰得很漂亮,但事实上又没有那样的真实。我可以理解 他们,因为简历写上如果连项目经验都没有,可能他们就连面试的机会也没有了,只是,有了面试机会,但如果没有把握这个机会的实力或者没有做好把握机会的准 备,有了也是白有。

        我最看重的,是这个人是否具有测试的感觉以及兴趣,我希望他对自己的发展和选择是清晰的,我希望他能清楚自己为什么来应聘,如果他来只是纯粹的找一个工作 机会,或是冲着公司的名气而来,而对于测试是什么,自己所选择的这个测试机会是否有利于自己的长远发展都不清楚,只是为了工作而工作,是否能够将他的潜力 挖掘出来呢?我没把握。而这样的candidate,偏偏又不少。

  • 我的数据库学习“曲线”

    2009-02-13 11:14:53

      选定发展方向

      1999年,我在开始读研时就给自己确定了以后的发展方向。

      当时有两个方向:网络,数据库技术。因为在2000年之时,网络大热,市场上拥有CCNP、CCIE证书的人特别牛。所以我当时也考下了CCNP证书,但后来发现网络方向涉及很多硬件层面的东西,这些都对厂商的依赖性太强,个人发挥空间不大。而我喜欢钻研,所以慢慢开始转向专攻数据库技术。

      在认准数据库这个方向后,我开始深入学习数据库理论方面的知识。当时,人大王珊教授的《数据库系统原理教程》一书,我读了几十遍。在学习数据库理论的同时,我开始接触并深入学习DB2和Oracle,并从1999年开始使用DB2 V5.2。那时,市场上关于DB2方面的技术书籍几乎没有,互联网也不像现在这么发达。因为我的导师做一个课题需要用到DB2数据库,但是我只能依靠查看 DB2随机文档来学习。那时,我还自己兼职,通过帮别人做些小软件赚钱,外加课题稿费,以支付考OCP认证和DB2认证的费用。

      到现在为止,我一直认为考认证是一个很好的学习动力。因为考试费用不菲,如果不想浪费钱只能拼命看书。我在读研的2000年就通过了OCP 8i认证,后来又陆续通过DB2 V5.2认证。这些认证极大地增强了我的自信。同时,在帮助导师用PB、Delphi等编程工具做应用开发时,我有意识地增强对SQL的学习,这对我后来的性能调优工作非常有帮助。

      这里我想说的是,做好一个时期的人生规划非常重要。我们首先要有一个明确的努力方向和规划,然后有意识的往这个方向努力。这种积极主动的学习要比被动学习效率高很多。

      第一次做培训

      “机遇偏爱于有准备的头脑”,这句话虽是老生常谈,却是人生真谛。记得2000年底,我在网上看到一个帖子说需要一个人去安装DB2数据库,差旅报销,每天500元,我喜出望外。因为这项工作需要有DB2认证才能去,而我那时DB2高级系统管理和应用开发的认证都有,所以很快就通过了对方的审核。但是当我到客户现场时才发现,不是安装DB2而是要给客户讲课,当时我就傻眼了,因为讲课需要的知识远比安装配置数据库要难得多,更何况我之前根本没有讲过课。没办法,压力也是动力,只能前一天夜里看教材备课到凌晨5点。短短睡了两个小时后,8点半去讲课。四天讲课下来,我总共休息了12个小时。还好自己毕竟有 DB2应用开发经验和DB2认证做基础,总算勉强应付了过去。只是没想到的是,这次并不算顺利的培训,竟是我未来几年培训生涯的开始。

      将培训当学习的动力

      经过第一次讲课后,我看到了自己的差距,知道仅有认证是不够的。客户的很多问题,书本上没有答案,需要自己在实践经验上做努力。另外,讲课前讲师需要把一些原理、概念性的东西弄清楚,也需要对数据库进行深入学习。

      后来,IBM培训部通过一些渠道知道我能讲DB2且拥有相关证书,就找我讲授DB2系列课程。所以,从2001年开始,我就经常作为IBM官方讲师讲授 DB2系列的所有课程。我自认为讲课是一个很好的学习过程,因为课前要深入了解概念,对于自己的理论深入学习有很大帮助。同时,课堂上学员的实际操作问题也会强迫自己做更深入的研究。

      我对培训有这样的认识:学员听你讲三个小时,要远远胜过自己看3小时的书。如果把一堂课的内容比喻成一杯水,那老师至少应该提前储备一桶水。所以,在讲课之前,我精心准备实验,深入和学员交流。我讲课从不照本宣科,而是自己准备了很多教材外比较实用的知识来扩展教材内容。同时争取上课过程中把一些概念用浅显易懂的例子来讲解。要想做到这些,首先自己必须对这个概念有深刻的理解才行,这一切都在客观上促进了自己的学习。

      随着培训的增多,有部分客户开始找我做实际的调优工作。记得我第一次去为客户现场调优是2001年,去大连大通证券解决锁等待问题。客户环境用的是AIX和CICS。当时虽然问题解决了,但自己心里还是比较虚,因为对AIX和CICS不了解,万一是这两个方面有问题,自己就没办法搞定了;这让我认识到一个复杂系统的调整往往需要具备多方面的知识。这件事之后,我在网上买了一个140的IBM工作站小机,自己安装AIX并开始学习。

      数据库学习Tips

      根据我对数据库的理解,目前市场上虽然有 Oracle,DB2,Informix,Sybase和SQL Server数据库,但Informix数据库已经被IBM收购,而Sybase数据库在技术和市场上正走向没落,占据市场主要份额的就是 Oracle,DB2和SQL Server数据库。SQL Server数据库非常好,但是很遗憾的是只能在Windows平台使用。所以如果你深入研究SQL Server数据库,我只能说获取高薪的概率稍低,而且坦白的说,使用SQL Sever数据库的企业一般是中小企业居多。而国内做Oracle数据库的人太多,如果你想在Oracle领域出人头地,难度极大。但是,做DB2数据库的人反而不太多,物以稀为贵。况且,DB2数据库广泛应用在银行、电信、制造行业、零售行业、保险行业等“高薪”领域中,所以我强烈建议学习DB2数据库,做IBM技术一般获取高薪的概率相对会大一些。我们的时间精力是有限的,所以必须选择好方向然后努力为之。除了SQL Server,这几个数据库我都在使用,我个人感觉除了功能外,对于运行稳定而言,相对于Oracle不太稳定的优化器,DB2无疑是最稳定的,它的优化器无比强大。如果能在锁方面再有更先进的技术,那么DB2将是完美的。

      这期间,我一边学习,一边通过了AIX的全部认证。记得非常清楚的是,为了做HA的实验,我花费了很大工夫。因为那时小型机不像今天这么普及,无法搞到7133阵列。后来我又学习了CICS、WebSphere、MQ和存储。就这样,在我培训的过程中,发现自己哪方面薄弱并且感觉这个方向有前途,我就会开始学习。不过,那时我的技术主要还是围绕IBM产品为主。由于自己对培训比较用心且颇受客户好评,找我做培训的国内培训机构开始变多。这个期间我自己的技术水平也增长很快。

      2002年11月,我参加了首届 “IBM DeveloperWorksLive! China 2002”大会,并获得IBM首次在国内评选的“杰出软件技术专家”奖,当时在6名获奖者中名列第2。这个奖项客观上对我在客户群的拓展方面起到很大帮助。找我解决问题的人更多了,所以2002—2003年也成了我技术提升最快的两年。

      这两年内,我陆续学习了HP-UX、WebSphere和MQ并通过认证。我自己的感觉是,如果你把一门技术研究得非常深、非常透,由于触类旁通的缘故,再去学习另一门技术时就很轻松。所以,我在学完AIX再去学习HP-UX时,感觉非常轻松。同样,在学习ORACLE和DB2后再去学习 Informix也同样很容易。通过这种纵向的深入和横向的比较,各种产品的所长所短也会非常清楚,自己的技术视野无意间更加全面化。而且通过对一个产品的深入,你往往能够发现这个产品的缺点和需要改进的地方。就拿DB2来说,每次版本更新的新特性,在新版本未上市前我就可以猜得差不多了。这主要有三个原因:一是我贴近真实用户,了解他们的真正需求;二是自己一直在用且不断总结思考;三是这些特性别的数据库有,而DB2没有,那在下个版本就会增加。所以相对来说,我自身对新版本的新特性学习就非常轻松了。就DB2而言,我拥有DB2 V5.2 、V7.1、V8.1和DB2 V9的全部认证,而且我应该是国内第一个把DB2 V8认证全部通过的人,当然,这其中也有巧合的成分。

      重要的一点是:学习过程中,要不断地把实践和理论融合,知其然更知其所以然,这样提升就会快很多。

      现场救援“赶场”记

      2004—2005年是我最忙碌的两年,那时候找我讲课的培训机构和需要性能调优的客户非常多,基本上整天在天上飞。培训机构找我讲课常常需要提前一个月预约。那两年内,除了过年几天,其他时间都是在做培训和诊断、调优,足迹遍及国内主要城市。我自己基本上是国内六大银行开发中心和数据中心培训的指定讲师,并为北京银信科技、山东农信、广东农信,交行大集中IBP等项目做数据库技术顾问。

      那时的我年轻、精力充沛。记得最刺激的一次是 2004年9月的一天,上午9点为上海移动IT部门做AIX动态逻辑分区(DLPAR)培训,结束时是17点。之后,立刻坐出租车前往扬州,于20点到达扬州供电局并协助他们进行电力负荷控制系统项目上线,一直奋战到凌晨3点半。接着,又连夜乘出租车赶往上海,在凌晨6点到达酒店。休息两小时后,8点出发,准时出现在上海移动培训现场。那时我对报酬不太在意,想的主要是用心积累技术经验和客户资源。在我看来,能够不断通过实践让自己成长是第一要义。而且,去的客户现场越多,处理的问题就越多,也就越多地发现自己的不足,然后再拼命学习,不断积累、总结和思考,进入了一个良性循环。

      至今我仍然怀念那段充实、紧张而充满激情的光辉岁月。2004年和2005年,一方面因为以独立咨询顾问的个人身份无法出具发票;另一方面,项目越做越大,尤其是很多银行的数据库架构和维护项目涉及合同金额也越来越大,需要签订正式公司合同。于是,我就分别在上海、北京注册了公司。当然这些年我并非都是一帆风顺,也犯过一些重大错误,例如:我曾经在2002年5月1日把海南美兰机场的数据库调死,导致机场航班信息管理系统瘫痪。早期也曾经因为调整某证券系统宕机而影响股民交易,这些都对客户造成了影响,但这些都是成长必须要走的路。经过这两次事件后,我自己也思考、总结了很多,在之后的调优工作中我基本上再没有犯过错误。

      我的秘诀:学习、积累、规划

      2006年8月我获得“2006年中国首届杰出数据库工程师”称号,算是对我多年学习数据库的一个总结。自2007年开始,我专注于做一些大客户的运维工作,并相应减少了培训次数。2008年,我被建设银行以年薪217万聘请为资深技术专家来维护Oracle和Informix数据库。就做技术而言,以一己之力能挣到年薪几百万常常令我感到自豪,也让我感受到技术的魅力,觉得自己多年来对技术的钻研得到了认可。

      之所以讲述我的技术之路,主要目的是给大家一些参考,尽可能多地去了解社会的需求,有意识给自己制定人生规划。我自己认为,多年来能取得这样的成绩,勤奋、努力和坚持一直是我最看重的。因为有了这些,才不至于当机遇光顾时,你却不知所措。

      现在很多年轻人,恰恰缺少的就是这样的忘我与痴迷,在我熟悉的数据库技术领域,很多年轻人越来越早地将注意力集中在薪水和职位上,这是很不明智的行为。其实,往往那些将诸如高薪与职位忘怀的人反而能更快地取得成功。“不经一番寒彻骨,安得梅花扑鼻香?”这样的道理人人都懂,可能够真正去实践的人却并不多。结合我的学习经验与感悟,我总结有16字要诀:去除浮躁,认真学习,不断积累,寻找机遇。

      最后,我用这句话与大家共勉:古之成大事者,不唯有超世之才,亦唯有坚韧不拔之志也!

  • 如何测试一个U盘

    2009-02-11 14:27:38

    功能测试

      1 在windows xp比较流行的操作系统上是否可以识别(装了驱动后是否可以)

      2 在电脑上显示的盘符是否正确

      3 总空间,可用空间,已用空间是否显示正确

      4 u盘中是否可以拷入各种格式的各类文件(图片,视频,文档,网页...)

      5 是否可以拷入拷出大文件

      6 正常操作拷入的文档等是否显示乱码

      7 拷文件的过程中是否可以取消

      8 拷文件的过程中拔掉u盘后,u盘是否损坏

      9 拷文件的过程中电脑关机后,u盘是否损坏

      10 u盘的开关是否起作用

      12 正常操作,拷入的文件是否会丢失

      13 空间已满是否有提示信息

      14 是否支持格式化

      15 u盘在各个状态时是否有相应的led灯提醒

      兼容性测试:

      1 在windows 98,windows 2000,windows me,windows 2000 server,windows 2003 server,windows xp,windows vista...是否可以识别

      2 在usb1.0,usb2.0上是否能够识别

      3 在笔记本上,台式电脑,服务器上是否可以识别

      性能测试

      1 一次性拷贝删除多个文件,u盘是否正常

      2 u盘连续使用比较长的时间,u盘是否正常

      3 u盘摔地上多次后,是否正常

       4 传输速度测试

      界面测试:

      1 设计是否美观大方

      2 图案,log是否正确显示

  • 如何对测试人员进行绩效考核

    2009-02-02 16:39:02

        每一个测试经理都面临这样的问题,如何对测试人员进行绩效考核。因为测试人员参与的工作不单一,需要的技能也各种各样,考核测试人员的绩效似乎不是很容易的事,除了一般需要考核的对工作的态度,工作的责任心,积极性这些方面以外,还有一些其它方面的内容。

        要想对测试人员进行考核,就需要开始工作的时侯明确测试人员的职责,对测试人员的期望等,一个团队中不同的测试人员可能职责不同,比如测试负责人,测试设计人员,自动化测试人员,普通测试人员等,那么对这些人的期望也是不同的,进行绩效考核的时候需要根据对测试人员的期望进行考核,而这些职责和期望测试人员也是很明确的。

       测试人员可能参与不同的软件开发过程,比如需要参与需求和设计的评审,那么也需要对这些工作进行考核,比如需求评审时可以从测试人员对需求的理解上,测试人员对需求提出的问题的质量上等作出评价。

        如果需要测试人员准备测试文档,如测试用例等,那么可以通过评审测试文档来考核一个测试人员的能力。如评审测试用例的质量,对需求的覆盖程度,可理解和执行等方面来判段一个测试人员的能力。

       对于执行测试的测试人员来说,可以从测试人员所发现的问题对测试人员进行评价。测试人员所发现的问题是复杂的还是简单的,是隐藏比较深的,还是一些表面的问题。还可以从问题的书写上进行评价,问题的书写是否详细清晰,开发人员可以再现,还是含糊其词,不明所以。或者测试人员书写的问题是否是自己的操作问题,一个问题是否写多遍等。

        而对于已经发布的产品,也可以从用户反馈的问题来考核测试人员的绩效,但是这个可能需要的时间比较长。

        测试人员的沟通能力也是考核的一个方面,无论是书面的还是口头的,测试人员都应该有较好的沟通能力。

        另外测试人员的接受指示,把握细节的能力也应该进行考核,测试经理希望把任务分配给可以按照指示完成的人来完成,如果测试人员自行其事,即使技术能力比较强也对工作无益。

        当然我想不同的公司的绩效考核制度不同,不能一概而论,自己总结而已。

  • 如何做好升级测试

    2009-02-02 11:28:42

    作者:g_win 来源:http://www.csai.cn 博客 2009年1月20日
    什么是升级测试?比如说你们公司开发的产品现已经发布的是V1.0,由于被发现存在缺陷,这时就需开发Patch或Hot Fix,并进行升级测试,然后发布V1.1。

      升级测试听起来似乎挺平常的,但它其实也是软件测试中比较重要的一部分,它通常包括以下内容:

      ● 安装测试

      ● 数据库测试

      ● 应用测试

      ● 文档测试

      安装测试

      当发布一个系统的新版本时,程序代码肯定是被修改过了,安装测试的目的是确保安装完成后修改过的文件被复制到了正确的位置,比如说某个文件夹包含了所有更新的HTML文件,这时就要检查相关的CSS文件夹下的文件是不是更新了,如果只更新了HTML而没更新CSS,那么相应的颜色/字体就不能正确地显示。

      如果公司研发过程比较规范,安装测试通常是在配置管理员 的配合下完成的。首先,是文件夹级的测试,检查安装过程中复制到系统中的文件夹的时间戳是否变化;其次,检查被修改过的文件的大小,并和之前的版本进行比 较,当然,这分两种测试,如果是白盒测试,测试人员要打开相应的文件确认新代码和改过的代码,如果是黑盒测试,那就要检查文件大小应与旧版本的不同。

      数据库测试

      很多情况下,系统的升级都是伴随着数据库脚本的更新,数据库测试通常也是由DBA人员或在DBA的配合下进行。升级前要停止数据库并做备份,然 后执行升级脚本,之后测试人员需要查看数据库日志,并检查库中被修改的记录是否正确。如果升级脚本是在库中创建一个新的Table或是新的 Relation,那么数据库测试应该关注对空库的测试,比如先建一个空库V1.0,只包含一些空的Table和Relation,而不包含任何数据,然 后测试人员执行升级脚本,并查看日志文件里是否有报错,如果没有报错一切ok,则通过应用程序连到数据库上执行一些功能测试用例来确保数据的Inset或 Update都是正确的。

      应用测试

      当安装测试和数据库测试都通过之后,进行应用测试,有两种方法:

      方法一:先配一个空的数据库(即除了一些必需的初始化数据再没有其他数据),然后把应用程序升级一下,执行业务流程测试看系统是否能够正常运行。

      方法二:也是先配好数据库,但库里存有一些实际数据,然后把程序升级一下(比如从V1.0升至V1.1),运行应用程序,检查那些已有的数据在V1.1上是否也能被正确的展现和使用,最后执行业务流程测试看系统是否能够正常运行。

      有的时候升级完后还要手工修改库中已有的记录,比如一个网上银行的系统,它里面有很多支付或转帐的数据,在做升级测试时,就可能要修改那些在上一版本中生成的数据,因为它们可能涉及到多个表之间的数据转换或一二级约束。

      文档测试

     文档测试主要是验证相关的版本说明或者安装手册等文档是否和系统升级相匹配,这点很重要,因为客户通常都是根据版本说明和安装手册进行系统的安装或升级。

      进行文档测试必须理解详细的升级步骤,比如文档中应建议用户升级前要备份数据库、数据文件、配置文件等,再比如升级需要复制某些文件到特定目 录,应当在版本说明中有所体现,总之,升级时任何必要的说明都应当在版本说明或安装手册内阐述清楚,安装时可以做什么以及不可以做什么都应在版本发布前得 到确认。

921/512345>
Open Toolbar