qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

深入浅出Rhino:Java与JS互操作

     摘要: 2011年10月6日,一年一度的JavaOne大会隆重举行。JavaOne2011大会的主题之一介绍针对不同Java平台的产品路线图,这其中包括移动版(ME,Micro Edition)、标准版(SE,Standard Edition)以及企业版(EE,Enterprise Edition)。  Java SE的亮点之一就是Oracle详细阐述Java SE 8路线图。我们先来看看Java SE ...  阅读全文

posted @ 2011-11-17 16:06 顺其自然EVO 阅读(749) | 评论 (0)编辑 收藏

Winform框架之字典数据管理

 好久没写博客了,除了是工作较忙的原因外,其实是也一直在想如何整合我所有的开发经验及技术积累,开发过很多Winform共享软件、ASP.NET的WebForm项目,发现很多东西是相互关联很紧密的,但往往我们太忙太懒,要好好整理,并整理出棒棒的一般比较难,但我们没有停步,梦想总会慢慢接近并实现。在做了很多项目之后,发现人的惰性或者惯性很大,因此有机会得好好整理下开发的成功,优化再优化,用的时候就越来越顺手了。

  在所有开发过的项目过程,很多如权限管理、字典数据管理模块,都是非常常用的模块,本文主要想介绍下提炼出来,各个项目均可通用的字典数据管理系统(或者叫做模块更为适合),在介绍之前,我想介绍下我的整合路线及一些想法,如下所示:

  其中框架中所有介绍的内容均为现有开发框架中有的东西及特性,如果要了解Winform框架的多维特点,可以现在最新的共享软件《仓库管理系统》,具体可以参考文章《从开发的软件《备件仓库管理系统》总结的一些经验》进行了解,该共享软件除了整合众多优秀的功能外,一个特点就是数据管理模块也得到了升华。

  在Winform框架中,其中权限管理系统、字典管理系统,都是可以做成独立的程序来使用,而且应该可以在程序中引用来查询或者获取相关的字典数据,如找某个键值的字典列表作为下拉列表,而且由于实际项目总,有点是SqlServer、有的是Access数据库的,所以支持多数据库是最好的选择。

  在字典数据数据管理工程项目中,我们看到有两个不同的数据访问层,工厂模式通过不同的配置,调用不同的数据访问层,从而实现SqlServer、Access等数据库的支持,当然可以扩展更多的数据库支持,我们先来看看工程项目的视图如下所示:

配置文件如下所示


字体:        | 上一篇 下一篇 | 打印  | 我要投稿 

  • <?xml version="1.0" encoding="utf-8" ?> 
  • <configuration> 
  • <configSections> 
  • <section name="dataConfiguration" 
  • type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data"/>type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data"/>type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data"/> 
  • </configSections> 
  • <connectionStrings> 
  • <add name="DataAccess" providerName="System.Data.OleDb" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:我的应用程序数据字典SqlDictionaryWHC.Dictionary.UIinDebugOrderWater.mdb;User ID=Admin;Jet OLEDB:Database Password=;" /> 
  • <add name="DataAccess2" providerName="System.Data.SqlClient" 
  • connectionString="Persist Security Info=False;Data Source=(local);Initial Catalog=Warehouse;User ID=sa;Password=123456"/>connectionString="Persist Security Info=False;Data Source=(local);Initial Catalog=Warehouse;User ID=sa;Password=123456"/>connectionString="Persist Security Info=False;Data Source=(local);Initial Catalog=Warehouse;User ID=sa;Password=123456"/> 
  • </connectionStrings> 
  • <dataConfiguration defaultDatabase="DataAccess"/> 
  • <appSettings> 
  • <!--软件名称--> 
  • <add key="ApplicationName" value="深田之星仓库管理系统"/> 
  • <!--开发商名称--> 
  • <add key="Manufacturer" value="广州爱启迪技术有限公司"/> 
  • <!--数据字典的数据库类型:access、sqlserver等--> 
  • <add key="ComponentDbType" value="access"/> 
  •  </appSettings> 
  • </configuration>
  •   我们通过DictionaryDbType来切换不同的数据库,不用修改代码实现多数据库支持,当然,不同的数据库,需要创建不同的数据库文件,不过数据库结构基本上是一致的。

      我们看看该字典管理模块的最终效果,如下所示:

      字典数据模块做成独立的程序后,一个可以独立运行,也可以在宿主程序中通过DLL方式调用类库来获取字典数据,如下所示:

  • private void InitDictItem()  
  • {  
  • this.txtManufacture.Items.Clear();  
  • this.txtManufacture.Items.AddRange(DictItemUtil.GetDictByDictType("供货商"));  
  • this.txtBigType.Items.Clear();  
  • this.txtBigType.Items.AddRange(DictItemUtil.GetDictByDictType("备件属类"));  
  • this.txtItemType.Items.Clear();  
  • this.txtItemType.Items.AddRange(DictItemUtil.GetDictByDictType("备件类别"));  
  • this.txtSource.Items.Clear();  
  • this.txtSource.Items.AddRange(DictItemUtil.GetDictByDictType("来源"));  
  • this.txtWareHouse.Items.Clear();  
  • this.txtWareHouse.Items.AddRange(DictItemUtil.GetAllWareHouse().ToArray());  
  • this.txtDept.Items.Clear();  
  • this.txtDept.Items.AddRange(DictItemUtil.GetDictByDictType("部门"));  
  • }
  •   字典组件模块调用例子Demo程序下载地址也一并提供下载,下载地址如下:

      http://files.cnblogs.com/wuhuacong/DictionaryDemo.rar



    posted @ 2011-11-17 16:03 顺其自然EVO 阅读(227) | 评论 (0)编辑 收藏

    Oracle 丢失更新问题的解决方案

     丢失更新是数据中一个比较常见的经典问题,在做项目时我们有时可能会没有注意到这个问题,但这个问题相当重要,有时会带来比较严重的结果。下面我们就来讨论下这个丢失更新。

      一、什么是丢失更新:

      用一个操作过程来说明:

      (1)会话Session1 中的一个事务获取(查询)一行数据,并显示给一个用户User1。

      (2)会话Session2 中的另一个事务也获取这一行,但是将数据显示给另一个用户User2。

      (3)User1 使用应用修改了这一行,让应用更新数据库并提交。会话Session1 的事务执行完毕。

      (4)User2 也修改这一行,让应用更新数据库并提交。会话Session2 的事务执行完毕。

      这个过程就叫做“丢失更新”,因为第(3)步做的操作会全部丢失(被第4步操作覆盖),最终数据库只会保存第(4)步的更新结果。这个情况在有些系统中可能不会有影响,但在有些系统中可能就影响很大了,举个简单的例子:

      财务系统加工资,若公司本次调薪决定给员工张三加1k人民币,财务部两名操作人员A和B,过程情况若是这样的:

      1)A操作员在应用系统的页面上查询出张三的薪水信息,然后选择薪水记录进行修改,打开修改页面但A突然有事离开了,页面放在那没有做任何的提交。

      2)这时候B操作员同样在应用中查询出张三的薪水信息,然后选择薪水记录进行修改,录入增加薪水额1000,然后提交了。

      3)这时候A操作员回来了,在自己之前打开的薪水修改页面上也录入了增加薪水额1000,然后提交了。

      其实上面例子操作员A和B只要一前一后做提交,悲剧就出来了。后台修改薪水的sql:update 工资表 set salary = salary + 增加薪水额 where staff_id = ‘员工ID’。这个过程走下来后结果是:张三开心了这次涨了2k,操作员A和B都郁闷了。

      二、解决思路:

      基本两种思路,一种是悲观锁,另外一种是乐观锁; 简单的说就是一种假定这样的问题是高概率的,最好一开始就锁住,免得更新老是失败;另外一种假定这样的问题是小概率的,最后一步做更新的时候再锁住,免得锁住时间太长影响其他人做有关操作。

      三、解决方案1(悲观锁)

      a)传统的悲观锁法(不推荐):

      以上面的例子来说明,在弹出修改工资的页面初始化时(这种情况下一般会去从数据库查询出来),在这个初始化查询中使用select ...for update nowait, 通过添加for update nowait语句,将这条记录锁住,避免其他用户更新,从而保证后续的更新是在正确的状态下更新的。然后在保持这个链接的状态下,在做更新提交。当然这个有个前提就是要保持链接,就是要对链接要占用较长时间,这个在现在web系统高并发高频率下显然是不现实的。

      b)现在的悲观锁法(推荐优先使用):

      在修改工资这个页面做提交时先查询下,当然这个查询必须也要加锁(select ...for update nowait),有人会说,在这里做个查询确认记录是否有改变不就行了吗,是的,是要做个确认,只是你不加for update就不能保证你在查询到更新提交这段时间里这条记录没有被其他会话更新过,所以这种方式也需要在查询时锁定记录,保证在这条记录没有变化的基础上再做更新,若有变化则提示告知用户。

      四、解决方案2(乐观锁)

      a)旧值条件(前镜像)法:

      就是在sql更新时使用旧的状态值做条件,SQL大致如下 Update table set col1 = newcol1value, col2 = newcol2value…. where col1 = oldcol1value and col2 = oldcol2value….,在上面的例子中我们就可以把当前工资作为条件进行更新,如果这条记录已经被其他会话更新过,则本次更新了0行,这里我们应用系统一般会做个提示告知用户重新查询更新。这个取哪些旧值作为条件更新视具体系统实际情况而定。(这种方式有可能发生阻塞,如果应用其他地方使用悲观锁法长时间锁定了这条记录,则本次会话就需要等待,所以使用这种方式时最好统一使用乐观锁法。)

      b)使用版本列法(推荐优先使用):

      其实这种方式是一个特殊化的前镜像法,就是不需要使用多个旧值做条件,只需要在表上加一个版本列,这一列可以是NUMBER或 DATE/TIMESTAMP列,加这列的作用就是用来记录这条数据的版本(在表设计时一般我们都会给每个表增加一些NUMBER型和DATE型的冗余字段,以便扩展使用,这些冗余字段完全可以作为版本列用),在应用程序中我们每次操作对版本列做维护即可。在更新时我们把上次版本作为条件进行更新。

      c)使用校验和法(不推荐)

      d)使用ORA_ROWSCN法(不推荐)

      五、结论:

      综上所述,我们对丢失更新问题建议采取上面的悲观锁b方法或乐观锁b方法(蓝色字体已标注),其实这两种方式的本质都一样,都是在更新提交时做一次查询确认在更新提交,我个人觉得都是乐观的做法,区别在于悲观锁b方法是通过select..for update方式,这个可能会导致其他会话的阻塞,而乐观锁b方法需要多一个版本列的维护。

      个人建议:在用户并发数比较少且冲突比较严重的应用系统中选择悲观锁b方法,其他情况首先乐观锁版本列法。


    posted @ 2011-11-17 16:02 顺其自然EVO 阅读(211) | 评论 (0)编辑 收藏

    Linux下的日志维护技巧

    1、系统日志

      /var/log/messages不仅是服务器的系统日志,很多时候它也包括许多服务的日志,所以它被称为“杂货铺”,建议重点关注。大家一般都喜欢用以下命令来看最后10条日志:tail -n10/var/log/messages。

      其实还可以将一段日志保存成文件(Xmanager3.0企业版的shell也有日志录像截取功能),或者直接用vim来处理。我以前配置主从复制的bind服务器时,有时会因为权限的原因报错,这时就可以在一台报错的服务器上用命令tail -f/var/log/messages实时查看服务器的日志变化情况,从而查找错误的蛛丝马迹。事实证明,效果很好,而且将此命令用于lvs+keepalived的排错效果也不错。其他服务器配置排错以此类推,这个做法也推荐读者掌握。

      2、系统安全日志

      /var/log/secure记录登录系统存取数据的文件,例如POP3、SSH、Telnet、FTP等都会被记录,我们可以利用此文件找出不安全的登录IP。目前比较流行的SSH防暴力破解工具DenyHosts主要也是读此文件。另外,我写了一个原理类似的shell安全脚本,用于线上服务器,在后面的章节跟大家分享。

      3、记录登录者的数据

      /var/log/wtmp记录登录者的信息数据,由于此文件已经被编码过(为二进制文件),想用cat等命令直接查看是不行的,必须使用last指令来取出文件的内容,如下所示:

    1. [root@localhost ~]# last  
    2. root pts/2220.249.72.138Wed Mar 30 08:33still logged in  
    3. root pts/2220.249.72.138Tue Mar 29 09:02 - 15:42(06:39)  
    4. root pts/2220.249.72.138Tue Mar 29 07:31 - 09:01(01:30)  
    5. root pts/2219.139.223.49Tue Mar 29 00:14 - 00:29(00:15)  
    6. root pts/2183.94.4.206Mon Mar 28 20:46 - 21:21(00:34)  
    7. root pts/2113.57.224.3Mon Mar 28 11:30 - 12:17(00:46)  
    8. root pts/4219.139.223.142Sun Mar 27 15:58 - 18:10(02:11)  
    9. root pts/3113.57.224.3Sun Mar 27 14:28 - 18:25(03:57)  
    10. root pts/3113.57.224.3Sun Mar 27 09:20 - 11:56(02:35)  
    11. root pts/3219.140.210.152Sun Mar 27 01:16 - 01:29(00:12)  
    12. root pts/2220.249.72.138Sat Mar 26 08:42 - 18:38(1+09:55)  
    13. root pts/2220.249.72.138Thu Mar 24 11:19 - 14:44(1+03:25)  
    14. root pts/2220.249.72.138Wed Mar 23 10:26 - 09:13(22:47)  
    15. root pts/2220.249.72.138Tue Mar 22 07:22 - 13:38(06:16)  
    16. root pts/2119.103.112.43Mon Mar 21 18:08 - 18:38(00:29)  
    17. root pts/2119.103.112.43Mon Mar 21 16:26 - 18:07(01:41)  
    18. root pts/3119.103.82.129Mon Mar 21 12:22 - 12:25(00:02)  
    19. root pts/2119.103.121.252Mon Mar 21 11:59 - 14:11(02:12)  
    20. root pts/2119.103.121.252Mon Mar 21 11:50 - 11:53(00:02)  
    21. root pts/2119.103.30.213Sun Mar 20 10:03 - 12:42(02:39)  
    22. root pts/358.19.17.3Sat Mar 19 12:22 - 12:22(00:00)  
    23. root pts/2220.249.72.138Sat Mar 19 07:07 - 16:05(08:58)  
    24. root pts/2219.140.213.209Sat Mar 19 01:39 - 01:55(00:16)

      4、记录登录时间

      /var/log/lastlog记录每个使用者最近登录系统的时间。因此当使用者登录时,就会显示其上次登录的时间,你应该注意一下这个时间,若此时间不是你上次登录的时间,表示账号可能被人盗用了。此可执行文件可用/usr/bin/lastlog指令读取(在FreeBSD8&FreeBSD8.1下为/usr/sbin/lastlogin)。使用此命令后的记录如下所示:

    1. [root@localhost ~]# lastlog  
    2. 用户名  端口 来自 最后登录时间  
    3. root  pts/2220.249.72.138三 3月 30 08:33:33 +0800 2011  
    4. bin**从未登录过**  
    5. daemon**从未登录过**  
    6. adm**从未登录过**  
    7. lp**从未登录过**  
    8. sync**从未登录过**  
    9. shutdown**从未登录过**  
    10. halt**从未登录过**  
    11. mail**从未登录过**  
    12. news**从未登录过**  
    13. uucp**从未登录过**  
    14. operator**从未登录过**  
    15. games**从未登录过**  
    16. gopher**从未登录过**  
    17. ftp**从未登录过**  
    18. nobody**从未登录过**  
    19. nscd**从未登录过**  
    20. vcsa**从未登录过**  
    21. pcap**从未登录过**  
    22. rpc**从未登录过**  
    23. apache**从未登录过**  
    24. mailnull**从未登录过**  
    25. smmsp**从未登录过**  
    26. ntp**从未登录过**  
    27. hsqldb**从未登录过**  
    28. xfs**从未登录过**  
    29. rpcuser**从未登录过**  
    30. sshd**从未登录过**  
    31. dbus**从未登录过**  
    32. avahi**从未登录过**  
    33. haldaemon**从未登录过**  
    34. avahi-autoipd**从未登录过**  
    35. gdm**从未登录过**  
    36. longfei**从未登录过**  
    37. ldap**从未登录过**  
    38. www**从未登录过**  
    39. mysql**从未登录过**



     5、服务器的邮件日志

      服务器的邮件为/var/log/messages,如果要用专业的日志分析工具来分析的话,我推荐使用Awstats。如果公司的开发系统对邮件的要求比较低,可以配置最简单的Sendmail或Postfix,通过看邮件日志里的status状态来判断邮件到底有没有正确发送。在配置Nagios服务器时,我也习惯用此日志来判断报警邮件到底有没有发送。如果对自己的shell水平足够有自信,也可以写脚本来收集邮件服务器的返回状态等。但专业的事情,建议还是由专业的Awstats工具来做,特别是邮件负载比较大时(比如,每天几百万条日志或上千万条日志),依靠人力完全不可取。

      6、输出iptables日志到一个指定的文件中

      iptables的man参考页中提到:我们可以使用iptables在Linux内核中建立、维护和检查IP包过滤规则表,iptables自身的3个表可能已经创建,每一个表包含了很多内嵌的链,也可能包含用户自定义的链。iptables默认把日志信息输出到/var/log/messages文件中。不过在有些情况下(比如你的Linux服务器是用来作为防火墙或NAT路由器的),你可能需要修改日志输出的位置,通过修改或使用新的日志文件,可以帮你创建更好的统计信息,或者帮你分析网络攻击信息。下面向大家介绍如何建立一个新的日志文件/var/log/iptables.log。输出iptables日志信息到一个指定文件的方法如下所示:

      1)打开/etc/syslog.conf文件。

    # vim /etc/syslog.conf

      2)在文件末尾加入下面这行信息:

    kern.warning /var/log/iptables.log

      3)保存和关闭文件,使用下面的命令重新启动syslogd。

    /etc/init.d/syslog restart

      7、日志文件的专业工具

      系统的一些服务,比如Apache、Nginx、Squid,还有MySQL数据服务器,都有自己特定的日志文件,不过由于其格式比较复杂,还是推荐使用专业工具(如Awstats、Cacti)来分析。MySQL的binlog日志可以用mysqlbinlog来分析,Cacti用得比较多的情况是用来分析Nginx负载均衡器一段时间内的并发情况及服务器的流量异常情况。

      8、用dmesg查看启动消息

      dmesg提供了一个简单的方法查看系统启动信息。当Linux启动的时候,内核的信息被存入内核ring缓存当中,dmesg可以显示缓存中的内容。默认情况下,dmesg打印内容到屏幕上,当然你可以将其重定向输出到一个文件中。如果硬件损坏的话,在dmesg日志里是有显示的,可用以下命令来查看dmesggrep error,其实看到的也就是/var/log/dmesg中的内容。

      9、关于cron的日志

      默认情况下,Crontab中执行的日志写在/var/log下,我们可以先看看/etc/syslog.conf里的配置,通过命令grep cron/etc/syslog.conf来查看,如下所示:

    1. [root@localhost log]# grep cron /etc/syslog.conf  
    2. *.info;mail.none;authpriv.none;cron.none /var/log/messages  
    3. # Log cron stuff  
    4. cron.*/var/log/cron

      接着看/var/log/下的cron日志,如下所示:

    1. [root@localhost log]# ls -lsart /var/log/cron*  
    2. 80 -rw------- 1 root root 72378 03-20 04:02 /var/log/cron.2  
    3. 812 -rw------- 1 root root 819861 03-27 04:02 /var/log/cron.1  
    4. 524 -rw------- 1 root root 525442 03-31 13:59 /var/log/cron

      当crond执行任务失败时,Crontab的日志会给用户发一封邮件。如果在服务器上发现一个任务没有正常执行,而crond的邮件发送也失败,那么就检查一下mail的日志,看看是否是因磁盘空间不够而造成的。

      为了方便收集crond的日志信息,也可以将cornd错误输出和标准输出日志都指向自定义的日志文件:0 6 * * * root /root/test_file.sh >>/data/log/mylog.log 2 >&110.用shell或perl来分析日志

      我们在维护线上服务器时,并不是每台服务器的日志都需要查看,可以偏重于我们有需求的服务器。如果不太喜欢用Awstats来分析Nginx负载均衡器的日志,可以编写一段分析日志的脚本,下一节我将跟大家分享用shell编写的分析Nginx日志的脚本。

    posted @ 2011-11-17 16:00 顺其自然EVO 阅读(646) | 评论 (0)编辑 收藏

    第三方测试保证什么?

      直至目前,我国还没有适应国情的、系列化协调配套的、工程化的软件生产过程管理、软件质量评测、控制技术规范和法律规程指导,为此,我国急需以大力发展软件第三方测试工程为基础,建立、健全我国软件工程监理体制。

      第三方测试有别于开发人员或用户进行的测试,其目的是为了保证测试工作的客观性。从国外的经验来看,测试逐渐由专业的第三方承担。同时第三方测试还可适当兼顾初级监理的功能,其自身具有明显的工程特性,为发展软件工程监理制奠定坚实的基础。

      第三方测试工程主要包括需求分析审查、设计审查、代码审查、单元测试功能测试性能测试、可恢复性测试、资源消耗测试、并发测试、健壮性测试、安全测试、安装配置测试、可移植性测试、文档测试以及最终的验收测试等十余项。

      测试并不仅仅是为了要找出错误。测试方还需要对错误进行归类和总结,通过分析错误产生的原因和错误的分布特征,可以帮助项目管理者发现当前所采用的软件过程的缺陷,以便改进,更好地帮助用户。根据软件工程的要求,测试工作应贯穿开发的全过程,如右图所示。

      从测试流程中可以看出,编码和单元测试基本上属于程序的调试,一般由开发方自己进行。作为第三方测试,定位在系统测试和集成测试最为有效。但是,为了得到高质量的软件,第三方也要适当介入编码与单元测试,能够更好地保证测试的有效性、准确性和可信性。

      认清“第三方”的责任

      第三方测试以合同的形式制约了测试方,使得它与开发方存在某种‘对立’的关系,所以它不会刻意维护开发方的利益,保证了测试工作在一开始就具有客观性。第三方一般都不直接参加开发方系统的设计和编程,为了能够深入理解系统,发现系统中存在得问题,第三方测试必须按软件工程的要求办事,以软件工程的标准要求开发方和用户进行配合,从而较好地体现软件工程的理念。引入第三方测试后,由于测试方相对的客观位置,由用户、开发方、测试方三方组成的三角关系也便于处理以往用户、开发方双方纠缠不清的矛盾,使得许多问题能得到比较客观的处理。

      第三方测试不同于开发方的自测试。由开发人员承担的测试存在很多弊病,除去自身利益驱使带来的问题外,还有许多不客观的毛病,主要表现在思维的定势上。由于他熟悉设计和编程等,往往习惯于按一定的“程式”考虑问题,以至思路比较局限,难于发现“程式”外存在的问题。因为第三方测试的目的就是为尽量多地发现程序中的错误而运行程序的过程,可以更多的发现问题。此外,随着系统越做越大,客观上讲开发人员也无精力参与测试,同时也不符合大生产专业分工的原则。

      第三方测试不同于用户的自测试。用户是应用软件需求的提出者,对于软件应该完成的功能是非常清楚的,是进行功能验证的最佳人选。客观情况是,大部分的用户都不是计算机的专业人士,很难对系统的内部实现过程进行深入的分析。对系统的全面测试,功能测试仅仅是一个方面,还要包括并发能力、性能等多种技术测试。这些测试对技术有很高的要求,必须由计算机的专业人员才能完成。

      第三方测试一般还兼顾初级监理的职能,不但要对应用进行各种测试,还进行需求分析的评审、设计评审、用户类文档的评审等,这些工作对用户进行系统的验收以及推广应用都非常有意义。

      如何组织管理

      在测试的过程中,用户、开发方与测试方形成了一个三角关系,从最终目标来讲,三方是完全一致的,都是希望保证系统稳定运行。但在测试过程中,三方的关系却是既对立又合作。对立是指各自坚持自己的职责,合作是指每一方的工作都需要其它两方的支持和帮助。

    软件测试的过程

      为了保证测试的顺利进行,测试方必须强化内部的组织管理。根据我们的经验,完整的测试机构必须包括业务分析部门、技术支持部门、规划设计部门和综合后勤部门。例如在中国现代化支付系统第三方测试项目当中,信息化工程总体研究中心的人员分工大致是:部分人员专攻支付业务,部分人员专攻技术支持,部分人员负责测试规划与综合案例的设计,部分人员负责现场情景调度,部分人员从事案例的细化与运行。测试结果表明,总体上达到了各司其职、忙而有序。


     “第三方”测试什么

      根据软件的特性,第三方软件测试工程可划分为三种类型四个层次。

      (1) 第一类是系统软件、环境软件和各类工具软件等的测评。这类软件多作为计算机的环境或作 “公用” 支撑软件,产品类型多、市场销量大、生产厂商多,产品的特点大都有企业、甚至国际的产品质量标准,用户选择使用时大都希望进行产品功能、性能的对比测试;对于这类软件的评测重点是软件产品的功能、性能和特点评测。

      (2)第二类是面向应用软件系统的测评。这类软件,具有很强的行业应用特性,往往是要由用户与开发商签定项目合同,开发商负责开发,用户负责验收。对这类软件的评测,根据用户对第三方的依赖程度,又可分为两个层次。

      ① 第一个层次只对应用软件系统进行综合性功能、性能测试。大体是在软件系统级进行“黑盒”测试,并不对软件过程进行控制、监督。

      ② 第二个层次是对应用软件系统进行质量监理与评测。不仅承担第一个层次的任务还要对软件过程进行监控,具备初级软件工程监理的职责。

      承担该类软件质量监理评测的第三方,承担软件过程质量监理的责任,在软件生命周期过程中,从软件定义开始,要对软件过程从质量保证角度进行规范化的监督、管理和控制。评测工作不仅包括软件生命周期各阶段的评审,而且还要对程序系统,进行包括模块白盒测试在内的系统集成、系统验收等测试。第三方实际上是软件业主授权的初级的软件工程监理。

      (3)第三类是对软件企业的CMM评估认证,也是最高层次的软件评测。

      了解测试评估

      测试评估是软件测试的一个阶段性的结论,用所生成的测试评估报告,来确定测试是否达到完全和成功的标准。在测度评估阶段向用户提供强有力的支持,包括通过测试报告,验证测试结果是否符合测试计划中制定的测试标准;根据缺陷报告提供的测试结果数据,给出软件质量和测试完整性的评估报告;特别在以下几方面对测试的过程进行评测:

      (1)评估测试用例覆盖:测试的目标是确保100%的测试用例全部成功地执行。如果这个目标可行或不可能达到,则要根据不同的情况制定不同的测试覆盖标准。主要考虑风险和严重性、可接受的覆盖百分比。

      (2)评估代码覆盖:需要断定测试目标期望的总的测试代码行数,在测试中真正执行的代码行数及其百分比,将此结果记录在测试评估报告中。

      (3)分析缺陷:对缺陷进行分析,应遵照缺陷分析策略中制定的分析标准。

      最常用的缺陷分析标准有三种:缺陷分布——缺陷数量作为随缺陷属性变化的函数(如状态和级别);缺陷趋势——缺陷数量作为以时间为条件的函数;缺陷滞留——特殊的缺陷密度报告,缺陷数量与缺陷在某一状态保留的时间长短有关。

      (4)确定测试是否达到完全和成功的标准在此阶段将判定测试是否已达到完全并可接受,生成测试结果报告。

    posted @ 2011-11-17 15:58 顺其自然EVO 阅读(147) | 评论 (0)编辑 收藏

    敏捷测试理论以及实践(4)

    上面已经谈到了准敏捷测试模式了,离咱们所说的敏捷测试已经无限接近了,但是要了解真正的敏捷测试,还是需要回到敏捷开发上来讲,前面一开始已经说过,敏捷测试严格上来说其实是属于敏捷开发的一部分,所以敏捷开发的价值观也会同样适用于敏捷测试,那么敏捷有哪些价值观呢?总共是五个,分别是简单、沟通、反馈、勇气、谦逊。

      光看这五个词,我想大部分人可能会晕乎了,不知所云的,难道敏捷就五个词能概括了?就像电影里出现的武功秘籍一样,一招就一个图,我们看了根本就不知道是啥,人家一看就能炼成神功了。

      其实呢,这几个价值观并不是教你怎么去实现敏捷,而是教你用一种什么样的态度去对待开发:要时刻想着最简单的方法去处理需要解决的问题,要经常与和开发/客户沟通,对于积极对待反馈,要有勇气去做决策,对团队各个成员都要尊重。这么几个价值观,对于你去初次理解敏捷而言,我相信几乎没有用处,甚至会让你觉得很迷茫,到底敏捷是啥,但是一旦当你已经真正理解了敏捷的时候,你就会发现,诶,的确是这样子的,说得很好!(哲学上说,事物的发展总是需要经历否定之否定阶段,对知识的理解也是一样,一开始看一下概念觉得很简单,觉得自己已经理解了(肯定);深入下去,发现问题越来越多,觉得自己没办法去理解(否定);到最后经过不断地思索与实践,终于彻底理解后,你就会觉得一开始那些简单的概念很精辟,就应该那么简单!(否定之否定=肯定))

      不过相对于当初的先行者而言,我们又是幸运的,因为很多前辈已经帮我们理解了这些价值观,并且研究出了很多实现的方式, 但是我们也不能去奉行拿来主义,毕竟是人家想出来的,是基于人家的实际情况,对于我们的情况不一定会适合,最好的办法就是取其精华,去其糟粕,结合实际,加以改进。

      接下来我就开始讲什么是真正的敏捷测试模式和我们公司怎么结合它来取其精华,去其糟粕,结合实际,加以改进。

      当然这个所谓的真正的敏捷测试模式也是业内主流的模式,我们公司的实际运用中还是有所区别的,下面都会提到。

      跟前面讲到的准敏捷测试相比,真正的敏捷测试其实也只是加以改进和丰富,所以与客户的沟通、积极响应需求的变更、以及开发与测试的同步,这些都还是存在的,当然敏捷测试改进和增加了许多地方,主要有:

      1、过程需要实现迭代:每个迭代周期需要完成一定量的功能,没有完成的功能不能Check In代码,这些功能需要经过严格测试,并且开发需要修复主要的严重Bug,这样子在最后就得到一个可以工作的并且相对稳定的Build,这个迭代周期就算完了,然后开始下一个迭代周期。这样就类似与我们修路一样,修路的话需要打好几层地基,每层地基打严实后,再铺上面一层,这样子即使最上层破了,只要修一下最上层就好了,不会影响到下面层的质量,如果是最下面那层没打严的话,一出问题每层都会损坏,要修的话,要全部扒掉这么多层地基才能修好。所以迭代对于测试的要求就特别高了,因为只有把这个迭代的主要Bug找到并修好,下面的迭代周期才能不受影响,才能确保以后出现的问题不用“打到最底层”才能被修好,“打到最底层”意味着就是人力,物力,时间以及最重要的产品的质量!

      下面是一个迭代的简单示意图,应该可以理解的,就不多讲了。

      2、测试不单单要和客户沟通,也要跟公司里的人经常进行沟通,因为一个公司的所有人其实都只有一个共同目标,就是把公司发展好,这样子其他的比如自己的发展,待遇等等才有可能实现。那么体现在实际的工作中就是:

      a)测试需要完全理解需求讲的知识点,不懂或者有疑虑要及时跟设计沟通,这样子可以让你更好地理解需求,甚至帮助设计人员发现错误;

      b)测试人员需要经常跟开发人员沟通,看看做的功能,修的Bug主要会影响哪些其他模块,主要出现问题的原因是什么,怎么弄可以最快速度重复出Bug来,这样子就帮助自己掌握测试的方向以及帮助开发快速修复Bug以及避免以后出现类似Bug。

     c)测试也需要跟测试人员之间进行沟通,来探索怎么能发现有质量的Bug,怎么能覆盖到很多的测试点,怎么解决自己没办法解决的问题,帮助他人也帮助自己。(每日立会是其中一个好办法)

      d)测试还需要跟自己沟通,不断地经常反思自己的优点和缺点,反思团队的优点和缺点,反思公司的优点和缺点,大胆提出和实施改进意见,为以后更好地开展工作做准备。(反思会是一种办法)

      沟通,只有沟通才能了解双方的想法,才能及时消除前进中的阻力和困难,让大家在同一方向上用同一个信念前进。

      3、建立有效的监测机制:这里所谓的检测机制主要有两点,一个是对测试的监测,另外一个就是对产品的监测。对于测试的监测主要在于检查测试的覆盖面是否全面,发现的Bug与测试覆盖面的一些对比数据,这些有助于提高测试的覆盖面从而提高Bug发现率;而对于产品的监测就是主要有两点,一点就是做功能和修Bug的进度是否是可控的,可预判的;另一点就是发现Bug的情况,也就是产品的质量是怎样的,质量发展的趋势是怎样的。

      我主要想补充的是这么三点,当然要是我想到其它的,我还是会修改这篇文章的。看过网上也有很多人来写关于敏捷测试的一些文章,很多都是国外英文解释的标准中文翻译,当然也有很多是自己的一些想法,所以远近高低各不同,不过既然敏捷只是一种思想,也就不会拘泥于何种实现方式,所以各人有不同想法都Ok的。其实说的再过一点,只要你自己认为你的方法是敏捷的,那你就可以认为是敏捷的,不用关心人家怎么想,人家的方法不一定适合你的,你只要有办法能在正确的时间交付正确的产品,那就Ok了。

      所以我接下来就会按照我们公司的流程来实际介绍一下敏捷测试在我们公司的实现,中间可能会有一些地方为主流敏捷测试所不容的,但是我觉得他们比较符合我们公司的实际,如果大家有不同的意见或者更好的方法,我也会悉心接受。

      (未完待续)

    posted @ 2011-11-17 15:57 顺其自然EVO 阅读(172) | 评论 (0)编辑 收藏

    测试培训引发的感想

     病初愈,最近做了几次培训,性能测试和测试工具。现在自己弄了一个论坛也把很多的心思放到性能测试上,个人喜好所在。

      在这几培训和最近别人问的问题中,感觉到有这么几件事情:

      1、有些人很想接触性能测试,但是一到具体的细节,兴趣索然。不管是工具的操作,还是理论的理解。要说我讲课能力有限,可以把人讲的没有兴趣,这是我个人问题。这个因素在实际的操作中,总不会有吧。实际的操作还是有些人觉得没什么意义。有的人就像是见了刺猬,不知道从哪下口。要说工具有多麻烦,我觉得也不至于。至少LoadRunner比word简单多了。我曾经说:一周时间完全可以掌握LoadRunner的操作,其他的就要看练习和经验了。这么说,是不是有经验的过来人,感觉对?当然人不可能都一样的。我想强调的就是工具并不复杂。复杂的是应用。

      2、理论对性能测试的指导作用容易被忽视。很多时候,技术人在考虑问题的时候,都是技术细节,觉得只要是理论都挺无聊的。大而泛,忽悠人用的。从我自己的感受来说,我觉得完全不是这样。当然对某个词的定义这样的理论问题,我们用不着太细究。但是性能测试理论,真的对我们的实际工作没有指导意义吗?或者说意义不大?比如,在讨论基准测试的时候,很多人都知道基准测试是什么意思?但是很少有人能把基准测试的范围和程度说清楚。应该测试什么?做到什么程度?这些仅是技术问题吗?在相应的位置上的测试人员,有没有考虑过你的职位能做或不能做什么事?能做到或做不到什么事情?应该做或不应该做什么事情?这些都会对项目的质量产生影响的。

      3、面对性能测试过程、结果、数据,真的理解清楚了吗?针对同一个数据和过程不同的人感觉到的层面是不一样的。这就是经验和能力的区别,就算是两个人做的结果完全一样,我想由于能力不同,也会这一结果的理解不同。在多次培训的过程中,我解释最大、最小、平均、标准方差等值的时候,都会有人有醒悟的样子。我们说为什么这几个值,重要到放在summary里面,为什么不是中位数?为什么不取个微分放那儿?其实,这都是有设计上的原因的。所以说,我们面对这些东西的时候,要知道它具体的含义,从而把握的更清楚。也对我们做的事情更确定。不会经常出现别人问几句就问倒了的现象。

      写这个文章就是想告诉大家:

      1、技术是一步步积累的;

      2、理解自己做的事情。

    posted @ 2011-11-17 15:56 顺其自然EVO 阅读(124) | 评论 (0)编辑 收藏

    120度视角看PD

     跟着师傅做了几个日常,参加了几次需求的讨论,渐渐感觉到做需求还是需要花费不少精力的。如果说对原来的业务非常熟悉,相对来说做起来就轻松一些,而要是从来都没接触过这块内容,就会感觉有点像丈二和尚摸不着头脑:知道用户想要什么,但是却不知道如何跟现有的系统更好的结合起来,我们到底能够提供什么?用户的需求是否合理?做需求分析,不能跟着用户的感觉走,因为这样的话,只能是用户说一你做一,而如果用户不能很好的提炼需求的时候,我们就会进入一个死循环了。在和用户讨论的时候,我们首先要知道用户为什么会提出这个需求?能够帮助他解决什么样的问题?希望达到什么样的效果?并不是所有的用户都能正确的表达自己所想要的东东的。

      一个比较典型的例子:最近跟一个营销平台的PD在聊用户一般会怎么样来提需求的時候,谈到曾经做过的一个营销活动的推广需求,运营人员为了推广某一项活动,往往会比较纠结在页面上这个按钮应该如何放置,需要新增加几个显示字段才能达到这次活动的效果,那这是用户最根本的需求吗?不是,实际上他真正需要的是应该给他提供几个维护活动的界面:类似什么样的活动时应该出现下拉的选择框进行维护,什么样的活动应该给他提供几个选项项。他们习惯上只会关注到现在他需要什么样的功能,在下次需要新的功能的时候,又会来提新的需求,所以对于类似这样的问题,PD的作用就显现出来了:透过现象看本质,要善于抓住用户描述问题的过程,引导他抛出隐含在这个需求背后的衍生内容,复述一下用户所说的目前存在的问题,了解一下用户可能会用的方式有哪些?并说明对流程的理解,再结合流程中的不明确点设计要询问的问题,并将客户的反馈记录下来,然后与客户确认一下是否有遗漏的内容,增加这些属性是否就都已经覆盖了他所想要的所有功能了?

      我想这其实也就是需求分析的价值所在吧。这步工作如果没有做好,往往就会导致考虑得不够充分而引起新的需求变更,甚至关系到开发出来的软件产品能否得到用户的认可,客户能否真正运用我们的产品帮助他们解决业务或管理上的问题。当然要做到这一点,也不是一两天就能搞定的,需要一个逐渐积累的过程,学会如何巧妙的向客户提问也是一门非常值得我们去思考的学问。业务方在需求的提出方面起着主导作用,但PD必須要能够对客户的需求进行过滤,要在非常了解原有系统功能,架构设计的基础上来给出建议,这样才有可能在需求阶段规避掉一些具有比较大业务风险、技术风险的需求。

      我们与运营方讨论的过程中会收集到一些新的需求,回来后一般需要对用户繁杂的业务进行流程的提取,把那些分布在各个部门的同一种业务提取出来进行初步的整理和分析, 把大致的功能点整理一下,遇到不明确的、有疑问的再咨询师傅,必要的时候还要跟开发进行讨论实现上是否可行。整体的思路是这样的:业务的目标是什么?用户需要怎么做才能完成业务目标?系统要能为用户提供哪些支持?系统必须符合哪些规则?展现的形式可以包括:用例的分析,业务流程和活动输入输出的分析,业务操作规则的整理,通过确定用户的任务,每项用户任务的步骤,定义对业务具有重要意义的数据并确定已有的逻辑关系。在确保业务描述基本没什么问题的前提下,邀请开发和业务方进行评审,并对业务流程上不对的地方进行修改。经过几次来回的交流,最终才能取得较全面的需求。需求分析关注的目标应该是“做什么”,而不是“怎么做”,所以在描述需求的时候,表述的方式应该是“实现什么”,而不是“如何实现”。

      做需求分析的过程,其实跟我们的测试分析工作有非常相似之处:我们在测试活动中,也都是从理解业务的需求开始的,首先需要明确测试需求(What),才能决定怎么测(How),通过了解这个项目具体是做什么的,完成一个什么样的业务,哪些功能是最常用的?哪些功能是重点?还有就是用户在处理实际业务时都要作些什么,多个业务之间的先后顺序是怎样的,用户在处理业务时对于哪些地方有特别的要求,等等。这部分规则,就是我们的测试需求中最基本的一部分。测试需求不明确,只会造成获取的信息不正确,无法对所测项目有一个清晰全面的认识,活在自己世界里的人是可悲的。

      测试需求并不等同于软件需求,它是以测试的观点根据项目需求整理出一个checklist,作为测试该项目的主要工作内容。根据所测的功能点进行分析、分解,从而得出着重于某一方面的测试,如界面、业务流、接口、数据等等。理解项目需求,需要从整体到局部,从局部到细节。测试人员不要总只了解自己模块的内容,要先从整个项目的业务流程入手,然后再到自己的功能模块,这样的好处是,测试人员了解上下游的交易功能,更加的能够了解业务的实现方法。经过一番狂轰乱炸式的深入理解之后,再将自己负责的模块有条有理的整理出来,然后讲解给项目组成员,这样也有利于模块之间的整合理解,再由他们提出各种各样的问题,若能很轻松的回答出各种各样的问题,说明你对项目的理解已经很到位了,而如果在提问的过程中有很多的问题,都是你之前没有考虑到的,那说明测试的需求分析做的还不够到位,这时你就需要好好总结一下,是因为自己经验方面的问题,还是由于其他方面的原因。总结起来测试需求的内容大致如下:

      1、理解系统的流程:整理出业务的常规逻辑,一项一项列出各种可能的测试场景,同时借助于需求文档资料,来确定该场景应该导致的结果

      2、进行功能的分解:系统包含哪些主要的功能,每个功能的期望值是什么;各个模块处理哪些业务,各子系统模块之间的数据接口关系,基础数据从哪里进入,通过哪些处理生成哪些结果等等。在做完以上步骤之后,将业务流中涉及的各种结果以及中间流程分支回顾一遍,确定是否还有其他场景可能导致这些结果,以及各中间流程之间的交互可能产生的新的流程,从而进一步补充与完善测试需求。

      以上只是个人对如何进行需求的捕获以及怎么样做好需求理解的一些看法,同时也是对我自己前段时间的工作做的一点梳理,希望大家能多多交流,共同进步,把我们的测试工作做的更好。

    posted @ 2011-11-17 15:55 顺其自然EVO 阅读(129) | 评论 (0)编辑 收藏

    巅峰访谈:应用质量管理与软件测试

     主持人:首先,我给大家介绍一下我们推出的巅峰访谈系统活动,我们是邀请来自厂商的领导和专家,来解读一下技术趋势和应用方案。今天我们请到的是惠普公司的Mark Sarbiewski先生和王滢女士。

      Mark Sarbiewski先生是资深的产品市场主管,他全面参与惠普软件的市场工作,在测试软件领域有非常长的工作经历。那么,王滢女士是中国惠普软件部技术顾问,她也有多年从事测试软件的售前咨询和技术支持的经历。

      我们第一个环节是请Mark Sarbiewski先生为大家讲解一下惠普提出应用质量管理包括哪些具体的内容。

      Mark Sarbiewski:非常感谢大家能够发出这样的邀请,抽出时间和我们一起做这样的访谈。首先,我简单地和大家做一个介绍,和大家谈一谈惠普在软件应用质量管理方面的一些观点。

      在我介绍的开场白,我想引用一个非常著名的资深公司说过的一番话,这个话的中心思想软件的最终目的在何处呢?当最终用户使用这样的软件的时候,软件的性能是有效的,而且是安全的。所以,我们是最开始在这个价值上面,把它最终传送到用户手上,让他觉得物有所值。

      接下来,我们再看另一则引言,这其实告诉我们一个思想,就是软件是不断变化的,它现在已经变得越来越复杂,而且与很多事物都是相关联的。这提醒我们如果我们依然用10年前的老办法来做软件,我们很难在日新月异的软件市场当中获得成功。

      那么,我们来用这页简单地看一下应用软件方面的一个变化。最一开始的时候,我们只是看到一个孤立形式的软件的应用,我们更多地是用于金融行业。

      当时的问题是当它用于金融行业的时候,它最一开始的效果是不错的,但是随后我们要对它进行一些调整的时候,却发现很难做出这样的调整。

      现在,我们在全球很多公司看到一个跟以往不同的情况,就是现在都采取一个不同的架构,我们是根据服务来选择软件,而且这个软件因为取决于服务,所以可以应用到整个的业务流程当中。

      现在我们也很高兴见到了很多新进的科技产生,比如说Web2.0的技术,这使得应用可用性更强,而且具有更高的挑战性,同时带来的可用性和安全方面、性能方面的挑战。惠普希望能够在这个基础上,更加了解我们客户的需求,能够更好地帮助他们。

      在惠普,我们采取的解决方案第一步就是把质量是三个支柱支撑的,首先是功能性,就是它是否能够很好地运行。第二个支柱就是性能,当有上千万的用户来使用这个应用的时候,它是否能够正常运行。第三个支柱就是是否安全。

      那么,这个解决方案的第二步,就是在整个应用的生命周期当中,我们支持的是哪一个环节。很多人在谈软件的开发周期、生命周期,这意味着什么呢?这是开发之初一直到最后的交付使用。

      如果说仅仅关注于开发这个环节的话,那么实际上会忽略很多真正应该值得我们去注意的问题,如果我们来看一个完整地应用生命周期的话,它应该是更加宽泛的,应该延续到最终用户使用运行起来这个阶段。

      因为在这个时候,就是在真正运行这些软件的时候,或者是使用这些应用的时候,我们这个时候发现的问题所需要来解决的资源、人力,甚至这个问题产生对于公司造成的一些风险、影响,都值得我们去关注。

      在我们解决方案中,最后的一步就是要统观全局,纵观整个的生命周期,找出几个最重要的点,能够使得我们的软件应用在交付客户使用的最后可以发挥它的效用,就是最后是我们需要关键控制的关键控制点。

      我来谈一谈为什么我们要谈论着几个关键控制点,或者说战略控制点。因为很多的公司他们在考虑是应用什么样的科技、技术来做研发,来选择它们的应用,是用JAVA还是用.net来做,是买这样的应用还是自己研发这样的应用,但是真正的问题在于他们是否理解了需要这个软件、需要这些应用背后的需求,如果最一开始没有把这个需求搞明白,没有和他们的客户沟通,那么应该说最后的效果也是不好的。

      所以,我们提倡的是应该正确地去理解这些需求,同时也要分析所有这些需求所意味的风险,这样才能够做出适当地选择来完成测试,最后把这个应用推上线。

      我们的解决方案就是有各种各样不同的中心,这就是我们的产品组合,使各个部门所相关到的人员都能够彼此联系,做出一个协同的决定。

      最后,我想用另外一句引言来做结,这个引言告诉我们在很多的IT公司、IT部门每个人都应该很忙碌,但是我们不应该以这种表相认为这个项目就做成功了,我们应该这个结果或者是效果来衡量、评价所做的应用是否成功。

      以上就是我简单地介绍,我们来进行问答环节。

      主持人:我们这次问题的来源,首先是为这次访谈我们准备了一些具体的问题,同时我们在网上发出了一个征集问题的帖子,我们大概有近40位的网友在上面留言,他们提出了实际工作中包括软件测试人员职业发展的问题。

      首先,我想请问一下Mark Sarbiewski先生,在刚才您提到的介绍中讲到,现在是越来越复杂的IT系统给企业带来了业务的风险,那么在这个很长的应用生命周期的过程中,谁需要来为规避这些风险负责呢?

      Mark Sarbiewski:这个问题提得相当地好,我总体的一个答案是说,并没有说某一方要为所有的风险买单,并不是这样一个情况的。说起来,现在软件应用对于每个公司来说是至关重要的,所以我们应该设立一个中心风险管理的团队,来对待这些风险,每个团队有一个负责人,但是并不是说这个负责人就应该对于风险负责,而是团队当中的每一个人都应该负责,一直到设计人员、开发人员、运行团队、质量团队每一个人都应该负担这样的责任。

     主持人:刚才您也介绍了我们为企业提供了很多包括质量中心等提供服务的解决方案,那么目前在国外,企业应用自动化测试的

      Mark Sarbiewski:应该说这样的一个趋势是非常强劲的,有几个驱动的因素。首先,我们现在看到软件已经是驱动整个企业业务完整地一个重要的因素,我们在企业的每一个角落都能看到软件的身影。但是,企业发展业务需要增加,那么应用也要增加,可是企业并不能说增加多少业务就增加多少人做软件开发和测试,这也是为什么我们看到自动化测试给大家带来的便利,以及它的趋势走强的原因。

      主持人:同样的问题我想问一下王滢女士,我们国内的企业他们是否同样表现出对于自动化测试表现出显著的、越来越强的需求呢?

      王滢:没错,市场上包括我们很多用户也在不断地向我们咨询一些如何采购和实施自动化测试工具的愿望和想法。基本上,我们的用户他们会去考虑自动化测试这样的一个目的基本上有两个驱动力。第一个驱动力是对于在测试这个领域,因为我们知道它是非常繁琐,需要花费很多的时间、人力的事情,对于这样的一种活动来讲,一方面我们的用户会发现有些测试的工作是没有办法通过手工来进行完成的。比如说我们大家都比较熟知的性能测试,那么我们以前的应用可能它的模式用户量非常少,但是现在随着BS应用逐渐地普及,越来越多的应用会使用一些关键的应用来进行一些在线的交易或者是活动。因为这样的应用是直接面向客户的,所以它的性能是不是足够好,用户体验是不是足够愉快,对于我们的用户来讲是非常重要的。但是,如果我们的用户应用的用户量是到了一定的规模,用手工测试可以说是不可能完成的任务,所以这个时候我们会碰到越来越多的用户考虑用自动化的方式来进行测试。

      主持人:刚才二位介绍得比较多是我们的测试解决方案和需求方面的情况,但是我们知道软件测试不但是工具和方法的问题,它和测试的工作人员也是有非常紧密的联系。那么,我首先想请问一下Mark Sarbiewski先生,目前国外专门从事软件测试工作的这些人的培训、分工和就业的情况是怎样的?因为现在在国内,普遍有一个很迫切的需求,就是认为软件测试人员是中国软件业发展最缺失的一块人才。

      Mark Sarbiewski:以我们的应验来看,我们和客户合作或者是和第三方合作伙伴合作的时候,我们感觉到现在的质量保证团队和开发团队、运行团队的地位几乎是平起平坐了,我们感觉到了这样的趋势变化。因为很多的公司越来越认识到,最后做出的应用质量的可靠,对于整个的公司来说是非常重要的,而且也非常需要十分专业的人员来做这样的工作。因此,我们在测试人员这个行业的培训和职业发展上面,都看到一些可喜的变化,比方说他们的薪酬会有提高。

      现在,我们的测试团队的人员在这样的发展下面都有很多好的机会,那么有没有好的机会他们首先要做到两点,首先他们要十分了解他们所要运用的工具和这些技术,就是我们今天谈到的比如说性能测试和自动化测试,所以我们的测试人员不仅仅要知道如何成为一个好的测试人员,同时要知道他们所运用的技术和工具如何更好地帮他们完成工作。

      主持人:接下来我想问一下Mark Sarbiewski先生,在中国现在IT外包服务也是发展得非常好的一个新的行业,同时,我们国内也有非常多的独立软件开发商,就是ISV,那么自动化测试对于他们来说又能够起到哪些帮助呢?

      Mark Sarbiewski:这是一个非常好的问题,今年年初的时候我在印度也和很多的软件外包商谈过,有过很多的沟通,他们都是惠普的合作伙伴,他们的业务模式也在悄然地发生变化。在一开始的时候,他们有很多非常非常出色的软件测试人员,他们的成本非常低,大家多靠手工来完成工作。但是,现在对于这些软件人员来说,他们的工资都提高了,他们有更多的机会能够跳槽,所以这些外包公司的管理层跟我说,他们希望能够有更多地自动化的测试和自动化方面的应用。也就是说,能够用更少的人,但是这些留下来的更少的人,应该具有更高的专业水平。

      主持人:Mark Sarbiewski先生刚才介绍的是印度的一些情况,我想问一下王女士,在中国是否也有大型的ISV和知名的IT外包企业也在使用咱们的这个解决方案?

      王滢:没错,在我国内实际上我们有很多的合作伙伴他们是非常大型的集成商,或者是ISV或者是IT外包企业。

      主持人:您刚才说的是现在也有这种软件外包企业把测试服务作为一个可以对外提供的服务项目?

      王滢:没错。

      主持人:那么方便介绍一下他们这种测试团队可以达到什么样的规模吗?

      这个测试团队可能每个用户的规模不是非常类似,基本上我们看到从几十人到上百人都会有。

      刚才我们提到了外包的情况,现在对于企业用户来说,他很多的IT项目也是交给外包的合作伙伴去做。过去我们看到企业在选择合作伙伴的时候,往往有一些资质的要求,比如说看服务商的CMM或者是CMMI的级别的方式。那么,我想问一下二位专家,现在光看这种服务商的资质,是否足以保证我们的应用质量是可靠的?有没有一些建议可以给这些企业,让他们在选择外包服务商的时候,知道怎么考量我们把服务外包出去之后他得到的效果?

      Mark Sarbiewski:应该说CMM本身也是不错的选择,但是并不是有很多的公司都达到很高的级别,所以光看CMMI或者是CMM还是不够的。那么,我有三个建议,第一个是可以咨询一下同行,比如说别的公司也同样地跟你一样有外包服务的需求,你可以咨询一下他们的结果是什么样的,咨询一下他们的感受和意见。

      主持人:那么,比如说我们企业常见的像ERP或者是CRM这种大型系统实施之后,企业是否可以要求实施企业他的咨询公司和实施方为他提供一个第三方的性能测试的评估报告,以此来作为系统上线的前提的条件呢?

      Mark Sarbiewski:对于企业来说,要求有一个这样的测试报告是非常明智的一个想法、决定,因为这个企业需要理解这样的测试是怎么进行的,最后的结果是什么。那么,我的意见是无论这个测试报告来自第三方或者是外包商自己都是没有问题的,如果说外包商自己就能够做出这样的测试,并且可以十分良好地保证这个质量也是不错的,当然第三方也可以。

      主持人:我们也收集到非常多来自网友的问题,我们刚才很多的问题可能比较严肃,接下来问一个网友比较轻松的问题。

      急性子的人是不是适合做软件测试工作,软件测试工作对于测试人员的性格会不会有要求?

      Mark Sarbiewski:这个问题的确很有意思。我觉得作为一个好的测试工作人员,他应该具有非常丰富的想象力,而且他们必须考虑到我客户在使用这些应用的时候会有一些什么样天真的想法。因为对于天真的客户来说,他们并不考虑软件是怎么开发出来、怎么测试完的,客户只考虑我怎么用。所以,作为一个好的测试人员,他应该想象客户怎么用,会出现什么问题,然后来保证软件的质量。说起来,急性子的人确实不太适合做测试,因为这个工作还是需要一些耐心的。

      王滢:除了刚才Mark Sarbiewski提到的需要一些想象力和耐心,我觉得还有一个我个人认为比较重要的特征,就是他的好奇心。可能他发现了一个问题之后,他非常期望去了解这个问题为什么会产生,我们如何才能找到它的原因,怎么去很快地、很有效率地解决这个问题。这样的话,通常会给这样的人带来很大的成就感,我想这个也是他能够从中得到一些成就感和乐趣的来源。

      Mark Sarbiewski:我还要再加两条,第一条,测试人员应该是一个非常非常细心的人,并且在遇到问题的时候不会追求走捷径,应该是一个脚踏实地的人。还有一点,他应该是一个非常坚强或者是非常强悍的人,因为他的背后是他的客户或者是开发团队、项目经理,他们都要求在最后测试这一步的时候,把这个应用做好,最后把它推出去、交付给客户,所以我们的测试人员应该是非常有技术和实力非常强悍的一个人,能够做到这一点。

      主持人:测试人员要精通一门语言和了解多门语言,那么是精通C++更好还是掌握JAVA更好?

      Mark Sarbiewski:我先说说我的想法,再让我的同事谈一下她的看法。

      王滢:我的看法和Mark Sarbiewski是一致的,对于我个人来说,我认为不管是精通JAVA或者是C++,对于语言都是举一反三的,我们要掌握哪个和不要掌握哪个,要看你的应用环境和应用中使用到的技术。如果你没有一点点JAVA垫底的话,可能做JAVA的测试是比较困难一点。所以,我建议看一下你的应用环境和应用中使用到的技术。主持人

      Mark Sarbiewski:对于很多很多在公司里工作,但是感觉到缺乏这方面支持的人,我觉得很重要的一点,他们所做的工作并没有被管理层看到,或者是他们所做的工作他们没有把它显示出来,这也是很多的测试人员或者是测试团队做得不好的方面。就是他们所做的工作没有让管理层看到,或者是他们的贡献没有把它量化出来。比方说测试团队可以这样做,因为我们每次做项目都要考虑到成本节约,所以如果测试团队可以让管理层看到,因为测试团队的工作让成本节约了多少,把这样的贡献量化出来,而且时时地提醒管理层,那么渐渐地管理层会支持测试的。

      主持人:第二个问题是项目组把测试工作当成对立面,或者是把测试组当成给他们挑毛病的情况怎么办?

      Mark Sarbiewski:你说的这种情况也是非常多见的,那么对于开发团队来说,他们很希望开发出新的应用,但是他们同时也希望开发出可用应性很高的应用或者是软件。那么,对于测试团队和开发团队这种僵局,应该说测试团队应该要注意提醒开发团队,我们之间是一种合作的关系。那么,测试团队所做的工作,并不会阻碍开发的脚步或者是创作的脚步,而是与开发团队一起把这个事情做好、做对,最后开发出来的产品优越性是高的。所以,测试团队应该更紧密地和开发团队有沟通,了解他们的一些惯性的思维,他们是怎么想的,也能够帮他们尽快地解决这些问题,这样就能够和开发团队成为朋友,可以解决你说的这种互相掣肘的情况。

      王滢:实际上,我们也从我们用户那边看到一个非常好的现象存在,就是之前我们的开发团队和测试团队的确是比较对立的。像我们在银行的一个用户,他们有自己的数据中心,也有开发中心。之前,他们之间的关系确实是比较紧张的,就像您刚才提到的,测试团队是来挑错的,是来找问题的,是来给我们挑出意见来的。但是,实际上我们测试团队当然也做了很多的工作,包括一个非常重要的方面,在一个项目里面他们提供了非常好的性能测试,大大提升了应用的可用性。现在来看,开发团队和测试团队会主动要求把这个项目拿来做测试。

      主持人:这是在我们的自动化测试解决方案之后才得到这样的情况?

      王滢:对,因为大量的手工是无法完成的,在采用了这样的自动化测试之后,开发团队确实看到了性能的提升,而且是很大的提升。

      主持人:那么在这个过程当中,测试团队是不是对于他们的之间关系找到共同的目标,起到了一些从理念、工具、方法上的帮助?

      王滢:对,因为这并不是测试团队一个部门或者是开发团队一个部门可以做的事情,他们必须进行沟通,比如说测试团队会给一些团队,开发团队可以从这些信息里面更快地修复问题,这是一种朋友或者是协作的关系。

    主持人:我们看自动化测试,实际上这个概念提出已经有相当长的一段时间了,过去都是讲从表格驱动的框架。但是,现在惠普提倡的是业务流程驱动的测试,这二者之间有怎样的区别,您怎么看这样变革的过程?

      Mark Sarbiewski:说起来,其实在几年前用户在我们的基础之上,他们自己做了这样的工作,就是他们用这些工具或者是Excle的电子表格来理解这些测试,来确认这个软件应用是没有问题的,这是让客户他们自己本身更好地理解。因为我们现在看到了这一点,所以我们说我们可以帮助客户分担这部分的工作。因为我们把这些工作都做好了,并且统一交给客户,使得他们使用起来更方便。

      王滢:我解释一下,表格驱动或者是业务流程测试是一个比较专业的词汇。那么,表格驱动的测试它的初衷是为了让我们的测试脚本更加易读、易懂,它主要还是关注测试脚本的本身。刚才Mark Sarbiewski提到了,我们越来越多地注意到了我们的用户有一些应用性的要求,他们希望编程经验不是那么好的、不是那么多的人也可以参与到测试工作当中来,特别是我们的业务人员,因为他们在测试当中所起到的作用是非常重要的。因为只有业务人员他们才懂得如何去进行一个交易,如何去运行一个业务流程。所以,如果我们拿自动化测试的脚本去给他们看,即使是这种表格驱动的脚本给他们看,可能对于他们来讲都是比较困难的。所以,因为我们注意到了这样的需求,我们惠普在几年之前提出了一个业务流程测试。业务流程测试一个最重要的贡献,在于它可以让业务人员更早、更多地参与到测试的构建和执行过程当中来。

      所以,我觉得它们两个所达到的目的是不一样的。

      主持人:那么,企业应该如何去选择这种自动化的测试方案,他们在选型和实施的时候,有怎样的一些可以遵循的原则和注意的事项?

      Mark Sarbiewski:我所见过的在这方面做得最成功的公司,其实他们很关键的因素就是他们是很关注测试流程本身的。比方说在整个开发生命周期当中,哪一个环节、哪一点特别需要我们做验证,我们在设计的时候就需要重新审核一下,或者是编码的时候需要重新审核一下,或者是什么时候做单元测试,或者说哪个环节需要再做测试。所以,整个的生命周期他们都是需要实时地去做验证,这是很关键的。

      主持人:那么在选择的时候,有怎样的关注点?比如说从哪些重要的指标去考量软件测试的自动化解决方案是适合的?

      Mark Sarbiewski:确实是这样的,有几个原则,我想说三条。

      首先,第一个是你所选的这个型,是否能够在不同的环境下工作。我们不希望看到一个应用就对应一个测试,可以说一个测试可以在很多的应用当中用到。

      第二个是扩展性,必须具有很强的扩展性。如果我们有500个人员来做测试,你可以扩展到这样的等级。

      第三个是你所使用的测试是否支持你所使用的流程,比如说在某一个决策点或者是某一个阶段你需要做测试,或者是整个的流程是什么样子的,你所选的测试方案应该适用于你这个流程。

      我再补充一点,这个应该是易于操作的,如果你这个测试在理论上是可以运行的,但是没有人能够懂,不知道到底应该怎么操作,这也是不成功的。所以,一定要是简单、易于操作的,实用性很强,也易懂,这样你的测试人员可以很快地上手。

      主持人:您讲的易用性在很多的软件当中是非常重要的一点,那么我想请问一下王滢,您看到的我们国内企业的案例当中,他们在这方面大概是用多长的时间可以掌握我们的AQM,或者是我们解决方案当中的工具使用的情况?

      王滢:是这样的,我觉得要从两个方面来说。一个是工具本身,另外一个是工具背后的方法。

      如果就工具本身来讲,如果具有几年经验的测试人员,因为他有相应的应用的背景,我们用开发性能测试工具来举一个例子。这样的人员经过了4天左右的培训,工具本身的使用已经没有问题了。但是,我想说另外一个方面,工具只是工具,它实际上是要支持我们的测试方法,至于我们如何把这个工具更好地运用到我们的测试中来,在于我们如何把这个测试规划,有一个想法通过这些工具实现,让它更好地支持包括前期的规划,到后期的分析。实际上,工具本身它只能给你提供一定的帮助,更多地还是需要你本身的经验。

      主持人:接下来的一些问题还是来自我们51CTO的网友,他们留在论坛里的问题。硬件的驱动测试,它应该是属于软件测试的范畴吗?

      Mark Sarbiewski:我们说到首先是硬件,然后是固件到软件、应用,这是一个范围。应该说很多商业用户,他们关注的是应用的层面,所以我们很多时候还算是软件测试的,就是您所说的情况是属于软件测试的。

      说到开源代码这个方面,对于开发团队来说,他们可以选择的工具其实是非常少的,JUnit是经常用到的。对于他们来说可能他们是借用微软的工具来做开发,而且他们所用测试自己那一块东西的工具,也都是比较少的开源代码的东西。对于惠普来说,我们是提供商用测试手段和方案。


     主持人:性能测试方案和测试结果分析哪个更重要?

      Mark Sarbiewski:我认为这两者应该是同等重要的,说到测试结果的分析,是专注于应用功能方面,这个显然很重要。但是,性能测试也是一样很重要的,因为它应该要支持尽量多的用户。如果说一个用户使用了这个软件,但是他需要花好几分钟的时间才能得到一个结果,其实这样的效果要比他返回一个错误的结果还要糟糕。

      我再补充一点,讲到我们做测试时候的顺序,应该说功能方面的测试或者是验证,我们在周期当中比较早的时候就做了。因为一项不能完成功能的软件应用应该是没有用的,所以我们在早期就做了。随后,我们要对性能方面做更多的测试,要解决这些在性能方面出现的一些缺陷等等。

      主持人:也就是说,先去考虑功能测试再做性能测试,而不是说哪一个更重要?

      Mark Sarbiewski:其实很难说测试中某一方面要比另外一方面更重要,对于测试人员来说性能测试和非性能测试都是非常重要的,因为每一个测试都是一个渐进的过程。所以,要保证我们在测试当中要把这些问题一一解决,使得端对端的应用是很出色的。

      王滢:制定一个非常好的功能测试方案和我们对于测试结果进行分析这两个那个更重要,我认为我可以用两句话来解释。第一个是对于性能测试方案它的好与不好,我们可以说“好的开始是成功的一半”。因为一个好的性能测试方案可以帮助我们非常有效率地完成一个测试。那么,对于结果分析来讲,“行百里者半九十”,我们在测试当中要找出性能是否具有我们所期望的标准或者是具有我们所期望的特性。究竟是不是这样,我们要靠结果分析来告诉我们,所以这个结果分析也是非常考验我们测试人员的功力的。他需要从纷繁复杂的数据里面找到最重要的数据和最能说明问题的数据。

      主持人:最后这个问题是更本地化一些。目前国内的软件测试没有一个很权威的认证,在外界看到一个初级的培训,情况真的是这样吗?

      Mark Sarbiewski:像惠普这样的供应商,我们会针对我们所提供的产品,提供相应地认证。我们的客户会了解我们所提供的产品,并且对于他们了解我们的产品是什么样的等级,我们都有一个认证。

      我觉得,作为一个好的测试人员,他不应该仅仅知道测试要怎么做,同时他要非常了解所使用的技术,对于技术本身也要吃得很透。所以,我建议如果有这样的初级培训班当然可以去上,同时要和惠普合作了解我们所提供的技术,再一点是买几本好的教材。最重要的一点是找到一个好的雇主,他能够真正明白这个测试是什么,并且知道重要性,随着他们的成长就可以有很多的实践,因为实践出真知,我认为是这样的。

      王滢:提这个问题的网友可能是比较关注他的职业发展,我想可能很多很多的用户也是这样认为的,我有了认证就代表我有了技能水平,我可以尝试更多的工作,可以给我的雇主带来更多的价值。

      我觉得从这个方面来讲,我们主要考虑的问题是我们选择什么样的测试认证。首先,他提到有很多初级的培训班,那么初级的培训班,据我了解他们主要是教授一些测试的理论,比如说非常基础的你如何选择规则测试和如何筛选数据理论等等,这是非常基础的,这是我们测试的基础。

      再一个是像一些工具的厂商,他也提供了一些相应地工具或者是产品的认证,比如说惠普目前对于我们的测试相关的一些产品提供这样初级或者是高级的认证,我们是有不同的级别的,我们可以按照我们的需要选择。

      更重要的是,我们拿到了这个验证,不仅仅表明我们可以更好地使用这个工具,更重要的一点,在背后是有方法论和实践来支持的。所以,我们拿到这个认证不仅仅是掌握了这个工具,同时对于我们的方法和考虑问题的思想有一些提升。除了这一类之外,对于我们的测试人员有更好的发展的方面是他应该关注一些测试之外的认证,比如说他应该考虑是不是进行ITIL或者是项目管理的认证,所以我们的目光不应该仅仅局限于这一点。

      主持人:就是他们可以掌握更高更广的技能?

      王滢:对,主要是在这个认证当中他获得的经验

      主持人:由于时间的关系,我们今天的访谈就要结束了,非常感谢王滢女士和Mark Sarbiewski先生来参加我们的技术访谈。我们希望今后有更多的机会将惠普应用管理的理念和测试软件的工具通过我们的平台传播给我们中国广大的人群。谢谢两位。

      Mark Sarbiewski:也非常感谢你们邀请我们来这里做这样一个专访,我们肯定还要再回来的。



    posted @ 2011-11-17 15:53 顺其自然EVO 阅读(164) | 评论 (0)编辑 收藏

    性能测试团队如何组建?

    本人一直在做产品和项目的公司测试部门从事测试工作,从未在第三方测试团队中工作过,因此,本人的观点仅限于非第三方测试团队。

      在本人的从业经历中,先后涉及过医疗、水利、政府、军队等行业,以个人的经历来看,在非第三方测试团队中,是不存在专职的性能测试团队的。这是由于所在公司的性质以及测试工作任务所决定的。由于处在非第三方的测试团队中,其工作任务就是负责公司的产品或项目的质量保证。在日常的工作中,80%以上的工作属于需求分析和功能测试,当然,对于做产品的公司来说,功能测试中还包含自动化测试;而性能测试工作仅在功能稳定后,才会正式开展,因此,性能测试的工作量仅占日常工作的20%左右。正是由于性能测试工作所占日常工作量的比重不大,所以,公司不可能组建专职的性能测试团队,因为公司不可能让这些性能测试工程师在一年的大部分时间内都闲着。。。

      (当然,性能测试应该从单元测试就开始,这样才能尽早的发现问题,这也是国外软件测试所推崇的。但是,这不符合我国当前的软件测试发展形势。毕竟软件测试行业在国内尚属发展初期,现在能组织性能测试工作的公司就已经很不错了,有相当一部分公司都是只要软件不宕机,压根就不会想起性能测试的。 )

      抱怨完当前的形势之后,咱们言归正传。虽说公司不会组建专职的性能测试团队,但是公司却提倡软件测试人员具备性能测试的技能,平时从事功能测试,一旦有性能测试需求,也可以立即投入。(给的是功能测试工程师的待遇,干的却有性能测试工程师的活。公司还真会算账。。。 )

      接下来谈一下测试团队应具备的性能测试技能吧。

      首先,性能测试的重点是场景设计。那么,测试团队就必须具备需求调研和分析的能力。有人会说,性能测试指标都是用户给定的,还需要需求调研和分析能力么?答案是肯定的。因为相当一部分用户所提出的性能测试指标是不可靠的。他们提出的性能测试指标,往往是拍脑袋拍出来的。如:一个业务发生频率不高的系统,但用户数却在4万人,这时候用户很可能就会要求并发数在4000左右,但实际上没有那么大的业务量,系统是不需要那么高的并发数的。反之,有的系统虽说用户数不是太多,但是业务发生频率很高,这种系统要求的并发数也不会很低。因此,测试人员必须具备需求调研和分析的能力,能够引导客户,得到真实的业务发生频率、发生类型、业务量以及数据量。从而,分析出系统可能出现性能瓶颈的业务,并进行场景设计;

      其次,应具备一定的系统分析能力。被测软件所用框架、中间件、业务组件、硬件、网络、部署结构等所有因素,哪些地方有可能出现性能瓶颈。那么,它一定在你的测试场景覆盖范围之内。如:一个使用频率不高的业务组件,但由于业务复杂度较高或资源冲突等因素,很有可能会成为性能瓶颈的。

      最后,就是应具备负载生成工具及监控工具的应用能力。毕竟,设计的性能测试场景是需要被执行,性能测试执行结果是需要被采集的。

      如果已经掌握上述的各项能力,那么说明这支团队已经具备初级的性能测试执行能力。接下来,再谈一下更高的要求。

      第一,掌握硬件的配置及原理。如:F5负载均衡服务器,采用的是哪种均衡策略,这将直接影响到你的性能测试场景的设计及执行的效果;

      第二,掌握被测软件所用操作系统的常用命令,它可以帮助你启动/关闭操作系统的服务,以及系统资源使用情况;

      第三,掌握被测软件所用中间件的配置参数及监控方法;

      第四,掌握必要的开发能力。商业化的测试工具毕竟有一定的局限性,很难完全支撑各类性能测试的执行。因此,需要开发必要的负载生成工具、预埋数据脚本、监控工具等;

      第五,掌握测试结果分析和调优的能力。测试结果仅仅是采集到还是不够的,还需要分析系统运行时的资源使用情况,分析系统性能瓶颈以及是否存在由于性能原因导致功能性错误等问题。当然,如果能够根据测试结果,给出性能瓶颈的解决方法,那么,这支测试团队就是支高素质的性能测试团队。

      以上仅仅是个人的一些观点,不足之处,还望大家指正。

    posted @ 2011-11-17 15:47 顺其自然EVO 阅读(216) | 评论 (0)编辑 收藏

    仅列出标题
    共394页: First 上一页 363 364 365 366 367 368 369 370 371 下一页 Last 
    <2024年11月>
    272829303112
    3456789
    10111213141516
    17181920212223
    24252627282930
    1234567

    导航

    统计

    常用链接

    留言簿(55)

    随笔分类

    随笔档案

    文章分类

    文章档案

    搜索

    最新评论

    阅读排行榜

    评论排行榜