qileilove

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

Java开发框架Play框架快速入门

Play 框架是一个完整的 Web 应用开发框架,覆盖了 Web 应用开发的各个方面。它借鉴了流行的 Ruby on Rails 和 Grails 等框架,又有自己独有的优势。具体表现在以下几个方面:其一,通过 Play 框架提供的命令行工具,可以快速创建Java Web 应用。其二,它拥有Java 代码动态编译机制,在修改代码之后,不需要重启服务器就可以直接看到修改之后的结果。其三,它还使用 JPA 规范来完成领域对象的持久化,可以很方便的使用不同的关系数据库作为后台存储。其四,它使用 Groovy 作为视图层模板使用的表达式语言。模板之间的继承机制避免了重复的代码。总的来说,Play 框架非常适合快速创建Web 应用开发。本文将为有一定Java Web框架基础的读者,来重点介绍如何使用play框架来编制一个最简单的信息增删改查应用。

  一、安装Play框架

  安装play框架前,只需要使用JDK 1.5以上的版本即可,将官网上的play框架下载后解压到某个指定目录下,使用的是eclipse开发工具即可。在本文中,将介绍的例子,是一个关于公司、部门、员工之间的CRUD操作,其关系为:一个公司有很多部门,一个部门有很多个员工。

  二、开始使用PLAY框架的脚手架功能

  PLAY框架为能让用户快速开始搭建play系统的原型。下面是使用play中脚手架功能的步骤:

  在命令行方式下,转到play框架的安装目录,本文假设为c:\play下。

  假设我们的应用的名称为corporations,则在play中,新建立一个应用只需要用如下命令即可:play new corporations,其中new表示新建应用,new后的名称则为应用的名称。

  在输入上面的语句后,会提示输入确认系统的名字,这里输入corporations,按回车确认即可。

  我们使用cd corporations目录中,会发现已经有play自带的框架的内容了。我们可以在命令行方式下,执行play run,这时play就会启动自带的jetty服务器,将应用启动起来。

  在启动后,可以通过浏览器浏览刚才新建的应用了,方法是http://localhost:9000,就可以看到一个默认的play应用,其中显示的首页中,简单指导了一些简单的配置方法。如下图:

  三、配置应用 将框架工程导入eclipse

  我们为了要在eclipse中方便我们的编码,所以需要把play刚为我们建立好的框架工程导入到我们的eclipse中去,所以我们按如下步骤去做:

  1、使用CTRL-C,先把我们正在运行的应用停止下来。

  2、依然在corporations目录下,输入play eclipse,表示要生成能导入eclipse的框架工程。

  3、再启动eclipse ,然后使用导入工程的方法,把corporations工程导入。

  4、在这个例子中,用的只是HSQL,所以打开conf/application.conf文件,将下面的

  db=mem 语句前的注释符号去掉,表示我们将使用hsql。

  5、同样,在conf/application.conf文件中,增加如下这行,表示我们将使用play脚手架框架自带的CRUD功能:

module.crud=${play.path}/modules/crud

  6、在conf/routes文件中,增加如下这行:

* /admin module:crud

  注意,在play框架中,routes是路由控制器,这行表示,将所有的CRUD操作都是只有通过 */admin访问的请求,才能实现play自带的CRUD功能。

  7、在进行上述修改后,我们再到命令行方式下,运行play eclipse,然后再到ECLIPSE下按F5刷新一下

  8、如果此时再使用play run,运行会发现暂时还没有更新,因为我们要进行数据层的配置。

Play 框架是一个完整的 Web 应用开发框架,覆盖了 Web 应用开发的各个方面。它借鉴了流行的 Ruby on Rails 和 Grails 等框架,又有自己独有的优势。具体表现在以下几个方面:其一,通过 Play 框架提供的命令行工具,可以快速创建Java Web 应用。其二,它拥有Java 代码动态编译机制,在修改代码之后,不需要重启服务器就可以直接看到修改之后的结果。其三,它还使用 JPA 规范来完成领域对象的持久化,可以很方便的使用不同的关系数据库作为后台存储。其四,它使用 Groovy 作为视图层模板使用的表达式语言。模板之间的继承机制避免了重复的代码。总的来说,Play 框架非常适合快速创建Web 应用开发。本文将为有一定Java Web框架基础的读者,来重点介绍如何使用play框架来编制一个最简单的信息增删改查应用。

  一、安装Play框架

  安装play框架前,只需要使用JDK 1.5以上的版本即可,将官网上的play框架下载后解压到某个指定目录下,使用的是eclipse开发工具即可。在本文中,将介绍的例子,是一个关于公司、部门、员工之间的CRUD操作,其关系为:一个公司有很多部门,一个部门有很多个员工。

  二、开始使用PLAY框架的脚手架功能

  PLAY框架为能让用户快速开始搭建play系统的原型。下面是使用play中脚手架功能的步骤:

  在命令行方式下,转到play框架的安装目录,本文假设为c:\play下。

  假设我们的应用的名称为corporations,则在play中,新建立一个应用只需要用如下命令即可:play new corporations,其中new表示新建应用,new后的名称则为应用的名称。

  在输入上面的语句后,会提示输入确认系统的名字,这里输入corporations,按回车确认即可。

  我们使用cd corporations目录中,会发现已经有play自带的框架的内容了。我们可以在命令行方式下,执行play run,这时play就会启动自带的jetty服务器,将应用启动起来。

  在启动后,可以通过浏览器浏览刚才新建的应用了,方法是http://localhost:9000,就可以看到一个默认的play应用,其中显示的首页中,简单指导了一些简单的配置方法。如下图:

  三、配置应用 将框架工程导入eclipse

  我们为了要在eclipse中方便我们的编码,所以需要把play刚为我们建立好的框架工程导入到我们的eclipse中去,所以我们按如下步骤去做:

  1、使用CTRL-C,先把我们正在运行的应用停止下来。

  2、依然在corporations目录下,输入play eclipse,表示要生成能导入eclipse的框架工程。

  3、再启动eclipse ,然后使用导入工程的方法,把corporations工程导入。

  4、在这个例子中,用的只是HSQL,所以打开conf/application.conf文件,将下面的

  db=mem 语句前的注释符号去掉,表示我们将使用hsql。

  5、同样,在conf/application.conf文件中,增加如下这行,表示我们将使用play脚手架框架自带的CRUD功能:

module.crud=${play.path}/modules/crud

  6、在conf/routes文件中,增加如下这行:

* /admin module:crud

  注意,在play框架中,routes是路由控制器,这行表示,将所有的CRUD操作都是只有通过 */admin访问的请求,才能实现play自带的CRUD功能。

  7、在进行上述修改后,我们再到命令行方式下,运行play eclipse,然后再到ECLIPSE下按F5刷新一下

  8、如果此时再使用play run,运行会发现暂时还没有更新,因为我们要进行数据层的配置。

  六、建立部门跟员工之间的连接关系

  现在我们在建立了部门类和员工类后,可以开始建立它们之间的关联关系了。由于一个部门中是有多个员工,所以在员工类employee中,写入如下代码,建立两个类之间的关联:

  • @ManyToOne 
  • public Department department;
  •   这里依然使用了@ManyToOne的JPA注解去实现多对一的关系。在再次运行程序后,会发现,在增加员工时,会出现下拉菜单选择框,让其选择该员工属于哪一个部门。

      七、建立公司实体类和控制类

      最后,我们建立公司实体类和控制类。同样,在app/models目录下,建立Company类如下:

  • package models;  
  • import javax.persistence.Entity;  
  • import play.db.jpa.Model;  
  • @Entity 
  • public class Company extends Model {  
  • public String name;  
  • public String address;  
  • public boolean isPublic;  
  •  }
  •   company的控制层类代码如下:

  • package controllers;  
  • import models.Company;  
  • @CRUD.For(Company.class)  
  • public class Companies extends CRUD  
  • {  
  • }
  •   这里要提醒一点的是,由于company的复数是companies,而play框架原先约定俗成的是在实体类名后直接加字母s,所以这里使用了注解 @CRUD.For(Company.class),以表明该控制类文件Companies是为company实体类服务的。

      同样,一个公司里有许多部门,因此在Deparment部门类中,建立如下的多对一关系:

  • @ManyToOne 
  • public Company company;
  •   再次运行程序,可以看到,现在三个实体类都建立起来了,可以分别对公司,部门和员工进行CRUD操作,如下图:

      八、优化列表

      我们在查看每个实体类的列表时,发现在列表中,会把每条记录的id都显示出来,这个在程序中假设不需要看到id字段的话,可以通过修改代码实现,比如在Company类中,增加toString方法即可:

  • public String toString() {  
  • return name;  
  • }
  •   而在Department和Employee类中,可以采用同样的方法,以不显示它们的id字段。

     九、增加校验规则

      在输入数据时,校验规则是必不可少的,在play框架中,可以很方便地使用注解来增加校验规则,比如在员工类中,可以要求输入的fullName字段内容不能超过100个字符,而且fullName字段不能为空,则在Employee类中,增加如下代码即可:

    @Required @MaxSize(100) public String fullName;

      下面列出一些常见的校验规则:

      @Email 校验email合法性
      @InFuture 检验是否将来的日期
      @InPast 检验是否是过往的日期
      @Match 对正则表达式的判断
      @Max 最大值
      @Min 最小值
      @Range 检验范围
      @URL 检验是否URL

      十、改变列表的显示格式

      在默认情况下,比如查看employee列表,只能看到employee的名称字段,假设要在列表中看到每条记录的每个字段的话,要修改下play的模版,方法如下:

      1、停止现在的服务,CTRL-C停止。

      2、在命令行下,输入:

      play crud:ov --template Employees/list

      这将在app/views/Employees目录下新建立一个list.html的页面。

      3、重新输入play run,并切换到eclipse中的项目中,按F5更新页面。

      4、在eclipse中,打开app/views/Employees/list.html,这个是雇员列表的模版文件。

      5、在该页中,找到id=”crudListTable”部分,修改为:

    #{crud.table fields:['fullName', 'dateOfHire', 'salary'] /}

      即显示完整所有字段。

      6、重新运行程序,即可看到效果,如下图,可以看到,能看到所有字段值。

      十一、改变列表中标题的显示

      在默认状态下,列表中显示的字段标题是用实体类中的名称的,假如想把fullName修改位Full Name的话,可以在conf/messages下,增加:

      fullName=Full Name

      即可,如下图显示:

      小结

      在本文中,我们学习了如何使用Play框架的脚手架功能,快速搭建CRUD的应用原型。Play框架的配置方法简化了工作代码量。目前Play框架正在不断的完善中,读者可以根据本教程的指引实际操作后,进一步阅读官方文档加以深入学习。

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

    再来 10 个新鲜的 HTML5 教程

    HTML5 火吗?看看 oschina 三天两头的 xx 个 xxx 就知道了。本文为你推荐最新的 10 个 HTML5 相关的教程,或许能启发你项目中的思路。


    1. HTML5 canvas – Creating own Paint program

    Canvas 是 HTML5 里非常重要的一部分,特别是在游戏开发中必不可少。
    HTML5 canvas – Creating own Paint program

    2. Creating Particles with Three.js

    此教程中介绍如何使用 Three.js 这个 js 三位模型库。
    Creating Particles with Three.js

    3. Making a Beautiful HTML5 Portfolio

    讲述如何使用 HTML5 创建 Web 相册,基于 jQuery 和 Quicksand 插件。
    Making a Beautiful HTML5 Portfolio

    4. Interactive Typography Effects with HTML5

    如果你想创建自己的交互式banner,那就阅读这篇文章吧
    Interactive Typography Effects with HTML5

    5. Getting Started with Web Audio API

    HTML5 的 Web Audio API 入门
    Getting Started with Web Audio API

    6. Mobile Snake

    创建一个移动版的贪吃蛇,使用 HTML5 Canvas 和 JavaScript 技术
    Mobile Snake

    7. Create Vector Masks using the HTML5 Canvas

    创建非规则的图像
    Create Vector Masks using the HTML5 Canvas

    8. Create a Drawing App with HTML5 Canvas and JavaScript

    使用 HTML5 Canvas 创建一个画图程序
    Create a Drawing App with HTML5 Canvas and JavaScript

    9. HTML 5 & Silverlight 5

    展示 HTML5 和 Sliverlight 5 技术
    HTML 5 & Silverlight 5

    10. How to make a simple HTML5 Canvas game

    开发一个简单的 HTML5 Canvas 游戏
    How to make a simple HTML5 Canvas game

    本站文章除注明转载外,均为本站原创或编译
    欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区
    转载请注明:文章转载自:开源中国社区 [http://www.oschina.net]
    本文标题:再来 10 个新鲜的 HTML5 教程
    本文地址:http://www.oschina.net/news/23168/10-fresh-html5-tutorials

    收藏此资讯

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

    JVM学习笔记(四)------内存调优

     首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM。

      对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数,过多的GC和Full GC是会占用很多的系统资源(主要是CPU),影响系统的吞吐量。特别要关注Full GC,因为它会对整个堆进行整理,导致Full GC一般由于以下几种情况:

      ● 旧生代空间不足
      调优时尽量让对象在新生代GC时被回收、让对象在新生代多存活一段时间和不要创建过大的对象及数组避免直接在旧生代创建对象

      ● Pemanet Generation空间不足
      增大Perm Gen空间,避免太多静态对象

      ● 统计得到的GC后晋升到旧生代的平均大小大于旧生代剩余空间
      控制好新生代和旧生代的比例

      ● System.gc()被显示调用
      垃圾回收不要手动触发,尽量依靠JVM自身的机制

      调优手段主要是通过控制堆内存的各个部分的比例和GC策略来实现,下面来看看各部分比例不良设置会导致什么后果

      1)新生代设置过小

      一是新生代GC次数非常频繁,增大系统消耗;二是导致大对象直接进入旧生代,占据了旧生代剩余空间,诱发Full GC

      2)新生代设置过大

      一是新生代设置过大会导致旧生代过小(堆总量一定),从而诱发Full GC;二是新生代GC耗时大幅度增加

      一般说来新生代占整个堆1/3比较合适

      3)Survivor设置过小

      导致对象从eden直接到达旧生代,降低了在新生代的存活时间

      4)Survivor设置过大

      导致eden过小,增加了GC频率

      另外,通过-XX:MaxTenuringThreshold=n来控制新生代存活时间,尽量让对象在新生代被回收

      由上一篇博文JVM学习笔记(三)------内存管理和垃圾回收可知新生代和旧生代都有多种GC策略和组合搭配,选择这些策略对于我们这些开发人员是个难题,JVM提供两种较为简单的GC策略的设置方式

      1)吞吐量优先

      JVM以吞吐量为指标,自行选择相应的GC策略及控制新生代与旧生代的大小比例,来达到吞吐量指标。这个值可由-XX:GCTimeRatio=n来设置

      2)暂停时间优先

      JVM以暂停时间为指标,自行选择相应的GC策略及控制新生代与旧生代的大小比例,尽量保证每次GC造成的应用停止时间都在指定的数值范围内完成。这个值可由-XX:MaxGCPauseRatio=n来设置

     最后汇总一下JVM常见配置

      堆设置

      -Xms:初始堆大小

      -Xmx:最大堆大小

      -XX:NewSize=n:设置年轻代大小

      -XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4

      -XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5

      -XX:MaxPermSize=n:设置持久代大小

      收集器设置

      -XX:+UseSerialGC:设置串行收集器

      -XX:+UseParallelGC:设置并行收集器

      -XX:+UseParalledlOldGC:设置并行年老代收集器

      -XX:+UseConcMarkSweepGC:设置并发收集器

      垃圾回收统计信息

      -XX:+PrintGC

      -XX:+PrintGCDetails

      -XX:+PrintGCTimeStamps

      -Xloggc:filename

      并行收集器设置

      -XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。

      -XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间

      -XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)

      并发收集器设置

      -XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。

      -XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。

    相关链接:

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

    不可不知 Linux操作系统网络服务器模型

     Linux系统网络服务器模型主要有两种:并发服务器和循环服务器。

      所谓并发服务器就是在同一个时刻可以处理来自多个客户端的请求;循环服务器是指服务器在同一时刻指可以响应一个客户端的请求。而且对于TCP和UDP套接字,这两种服务器的实现方式也有不同的特点。

      1、TCP循环服务器:

      首先TCP服务器接受一个客户端的连接请求,处理连接请求,在完成这个客户端的所有请求后断开连接,然后再接受下一个客户端的请求。

      创建TCP循环服务器的算法如下:socket(……); //创建一个TCP套接字bind(……); //邦定公认的端口号listen(……); //倾听客户端连接while(1) //开始循环接收客户端连接{ accept(……);//接收当前客户端的连接while(1)

      { //处理当前客户端的请求read(……);process(……);write(……);} close(……); //关闭当前客户端的连接,准备接收下一个客户端连接} TCP循环服务器一次只处理一个客户端的请求,如果有一个客户端占用服务器不放时,其它的客户机连接请求都得不到及时的响应。因此,TCP服务器一般很少用循环服务器模型的。

      2、TCP并发服务器:

      并发服务器的思想是每一个客户端的请求并不由服务器的主进程直接处理,而是服务器主进程创建一个子进程来处理。

      创建TCP并发服务器的算法如下:socket(……); //创建一个TCP套接字bind(……); //邦定公认的端口号listen(……);//倾听客户端连接while(1) //开始循环接收客户端的接收{ accept(……);//接收一个客户端的连接if(fork(……)==0) //创建子进程{ while(1)

      { //子进程处理某个客户端的连接read(……);process(……);write(……);} close(……); //关闭子进程处理的客户端连接exit(……) ;//终止该子进程} close(……); //父进程关闭连接套接字描述符,准备接收下一个客户端连接} TCP并发服务器可以解决TCP循环服务器客户端独占服务器的情况。但同时也带来了一个不小的问题,即响应客户机的请求,服务器要创建子进程来处理,而创建子进程是一种非常消耗资源的操作。

      3、UDP循环服务器:

      UDP服务器每次从套接字上读取一个客户端的数据报请求,处理接收到的UDP数据报,然后将结果返回给客户机。

      创建UDP循环服务器的算法如下:socket(……); //创建一个数据报类型的套接字bind(……); //邦定公认的短口号while(1) //开始接收客户端的连接{ //接收和处理客户端的UDP数据报recvfrom(……);process(……);sendto(……);//准备接收下一个客户机的数据报}因为UDP是非面向连接的,没有一个客户端可以独占服务器。只要处理过程不是死循环,服务器对于每一个客户机的请求总是能够处理的。

      UDP循环服务器在数据报流量过大时由于处理任务繁重可能造成客户技数据报丢失,但是因为UDP协议本身不保证数据报可靠到达,所以UDP协议是允许丢失数据报的。

      鉴于以上两点,一般的UDP服务器采用循环方式4、UDP并发服务器把并发的概念应用UDP就得到了并发UDP服务器,和并发TCP服务器模型一样是创建子进程来处理的。

      创建UDP并发服务器的算法如下:socket(……); //创建一个数据报类型的套接字bind(……); //邦定公认的短口号while(1) //开始接收客户端的连接{ //接收和处理客户端的UDP数据报recvfrom(……);if(fork(……)==0) //创建子进程{ process(……);sendto(……);}除非服务器在处理客户端的请求所用的时间比较长以外,人们实际上很少用这种UDP并发服务器模型的。

      4、多路复用I/O并发服务器:

      创建子进程会带来系统资源的大量消耗,为了解决这个问题,采用多路复用I/O模型的并发服务器。采用select函数创建多路复用I/O模型的并发服务器的算法如下:

      初始化(socket,bind,listen);while(1)

      {设置监听读写文件描述符(FD_*);调用select;如果是倾听套接字就绪,说明一个新的连接请求建立{建立连接(accept);加入到监听文件描述符中去;}否则说明是一个已经连接过的描述符{进行操作(read或者write);}多路复用I/O可以解决资源限制问题,此模型实际上是将UDP循环模型用在了TCP上面。这也会带了一些问题,如由于服务器依次处理客户的请求,所以可能导致友的客户会等待很久。

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

    大数据时代:如何节省存储成本

    现今的科技发展日新月异。尤其是存储方面,表现的极其突出。从技术、用户和应用方面来看,其发展速度超越了其他IT领域。同时也带来了相应的问题。数据中心和企业的管理者们都面临着如何选择存储阵列的困惑。通常的解决方案早已被大肆宣传开来,例如像闪存存储或诸如WAN优化等这些被炒作已久的技术似乎已在人们脑海中变得根深蒂固。

      下面的七个存储解决方案的建议不是基于任何技术的“新生事物”,而只是更具实用性并让企业的花费更具价值。这七个建议应使管理者考虑从新制定他们在2012年的存储预算。根据现有的存储基础设施、资源、数据的特点和所需的访问重新审视市场上存储的关键点,当今正是非常恰当的时机。而存储的关键就在于在提高存储性能的同时减少或至少维持经营成本和资本的支出。

      1、精简配置

      在3Par被惠普收购之前。自动精简配置技术在配置存储容量方面起着极其重要的作用。在SAN的初期,企业实际花费更大的力气来保证预期的数据增长。精简资源调配可帮助企业有能力提供他们所需要的,同时保证增加需要的容量而无需创建新的LUNs(logical unit numbers)。

      2、面向对象存储和REST(Representational State Transfer)

      最初,这项技术似乎对云计算有更大的影响。现在越来越多的企业认为数据更适合存储在公共云之上。同时HTTP将有可能成为一种传输的手段,利用REST方法来移动和存储数据,并提供丰富的元数据和相关的数据说明。当你看到这种跨广域网案例在数据中心扎根时请不要惊讶。

      3、广域网优化

      企业可通过广域网优化产品来提升网络的效率,如广域数据服务商Riverbed。这样做可有效减少通过广域网发送、删除重复数据和压缩数据的通信量。并可显著节省存储空间、降低延迟、降低企业广域网带宽相关费用等好处。通过广域网的优化企业可在世界各地查看和创建数据,就像在局域网内部一样。

      4、分层存储

      随着企业需求的成本平衡以及性能需求,将需要存储的数据放在最好的媒介上以匹配数据的价值和性能是非常必要的。对于一些不需要频繁访问的数据不一定存储在SSD或更高性能的磁盘驱动器上。现今供应商提供的存储产品具备根据访问模式自动布局数据的功能。企业应该了解数据存放在介质上形式以及数据模型的增长,以便在作出购买决定之前更好的了解扩展容量和性能的成本。

     5、向外扩展的NAS

      传统规模的NAS模型在中小型企业中所占的市场份额越来越小。它正被向外扩展的方式所替代。并开始逐步添加企业在集群方式下提高容量和性能的能力。同时构建一个全局命名空间,并在其中工作。这样可有效简化存储配置,还可大幅降低总成本。

      6、性能层的设备

      设备较少的关注基于NAS管理容量的能力。设备更多的关注存储的数据如何以最高的效率移动数据。NAS的优化是使IOPS返回到NAS之中,设备可以不承担所有繁重计算,这些任务全都由NAS负责。其带来的结果是提高性能并减少资本和运营开支。

      7、FCoE

      FCoE(以太网光纤通道)可帮助企业在以太网基础设备中扩展光纤通道。这可有效节省基础设施的开销。包括电缆和电源管理方面。而现今大多数人还不太了解FCoE。而且也没有iSCSI和FCoE竞争的消息。但是这并不意味着FCoE不会成为未来的重要技术。基于文件的存储的增长率已超过了数据块的存储。所以光纤通道和FCoE将会存在下去。

      做出新的选择并不会为你的当前的基础结构或数据中心带来风险。恰巧相反的是以上的建议有一些确实能够帮助企业得到非常真实的财务回报。

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

    多核平台下的Java优化

     现在多核 CPU 是主流。利用多核技术,可以有效发挥硬件的能力,提升吞吐量,对于 Java 程序,可以实现并发垃圾收集。但是 Java 利用多核技术也带来了一些问题,主要是多线程共享内存引起了。目前内存和 CPU 之间的带宽是一个主要瓶颈,每个核可以独享一部分高速缓存,可以提高性能。JVM 是利用操作系统的”轻量级进程”实现线程,所以线程每操作一次共享内存,都无法在高速缓存中命中,是一次开销较大的系统调用。所以区别于普通的优化,针对多核平台,需要进行一些特殊的优化。

      代码优化

      线程数要大于等于核数

      如果使用多线程,只有运行的线程数比核数大,才有可能榨干 CPU 资源,否则会有若干核闲置。要注意的是,如果线程数目太多,就会占用过多内存,导致性能不升反降。JVM 的垃圾回收也是需要线程的,所以这里的线程数包含 JVM 自己的线程

      尽量减少共享数据写操作

      每个线程有自己的工作内存,在这个区域内,系统可以毫无顾忌的优化,如果去读共享内存区域,性能也不会下降。但是一旦线程想写共享内存(使用 volatile 关键字),就会插入很多内存屏障操作(Memory Barrier 或者 Memory Fence)指令,保证处理器不乱序执行。相比写本地线程自有的变量,性能下降很多。处理方法是尽量减少共享数据,这样也符合”数据耦合”的设计原则。

      使用 synchronize 关键字

      在 Java1.5 中,synchronize 是性能低效的。因为这是一个重量级操作,需要调用操作接口,导致有可能加锁消耗的系统时间比加锁以外的操作还多。相比之下使用 Java 提供的 Lock 对象,性能更高一些。但是到了 Java1.6,发生了变化。synchronize 在语义上很清晰,可以进行很多优化,有适应自旋,锁消除,锁粗化,轻量级锁,偏向锁等等。导致在 Java1.6 上 synchronize 的性能并不比 Lock 差。官方也表示,他们也更支持 synchronize,在未来的版本中还有优化余地。

      使用乐观策略

      传统的同步并发策略是悲观的。表现语义为:多线程操作一个对象的时候,总觉得会有两个线程在同时操作,所以需要锁起来。乐观策略是,假设平时就一个线程访问,当出现了冲突的时候,再重试。这样更高效一些。Java 的 AtomicInteger 就是使用了这个策略。

      使用线程本地变量(ThreadLocal)

      使用 ThreadLocal 可以生成线程本地对象的副本,不会和其他线程共享。当该线程终止的时候,其本地变量可以全部回收。

      类中 Field 的排序

      可以将一个类会频繁访问到的几个 field 放在一起,这样他们就有更多的可能性被一起加入高速缓存。同时最好把他们放在头部。基本变量和引用变量不要交错排放。

      批量处理数组

      现在处理器可以用一条指令来处理一个数组中的多条记录,例如可以同时向一个 byte 数组中读或者写 store 记录。所以要尽量使用 System.arraycopy ()这样的批量接口,而不是自己操作数组。

      JVM 优化

      启用大内存页

      现在一个操作系统默认页是4K。如果你的 heap 是4GB,就意味着要执行1024*1024次分配操作。所以最好能把页调大。这个配额设计操作系统,单改 Jvm 是不行的。Linux 上的配置有点复杂,不详述。

      在 Java1.6 中 UseLargePages 是默认开启的,LasrgePageSzieInBytes 被设置成了4M。笔者看到一些情况下配置成了128MB,在官方的性能测试中更是配置到256MB。

      启用压缩指针

      Java 的64的性能比32慢,原因是因为其指针由32位扩展到64位,虽然寻址空间从4GB 扩大到 256 TB,但导致性能的下降,并占用了更多的内存。所以对指针进行压缩。压缩后的指针最多支持32GB 内存,并且可以获得32位 JVM 的性能。

      在 JDK6 update 23 默认开启了,之前的版本可以使用-XX:+UseCompressedOops 来启动配置。

      性能可以看这个评测,性能的提升是很可观。


    启用 NUMA

      numa 是一个 CPU 的特性。SMP 架构下,CPU 的核是对称,但是他们共享一条系统总线。所以 CPU 多了,总线就会成为瓶颈。在 NUMA 架构下,若干 CPU 组成一个组,组之间有点对点的通讯,相互独立。启动它可以提高性能。

      NUMA 需要硬件,操作系统,JVM 同时启用,才能启用。Linux 可以用 numactl 来配置 numa,JVM 通过-XX:+UseNUMA 来启用。

      激进优化特性

      在 Java1.6 中,激进优化(AggressiveOpts)是默认开启的。激进优化是一般有一些下一个版本才会发布的优化选项。但是有可能造成不稳定。前段时间以讹传讹的 JDK7的 Bug,就是开启这个选项后测到的。

      逃逸分析

      让一个对象在一个方法内创建后,如果他传递出去,就可以称为方法逃逸;如果传递到别的线程,成为线程逃逸。如果能知道一个对象没有逃逸,就可以把它分配在栈而不是堆上,节约 GC 的时间。同时可以将这个对象拆散,直接使用其成员变量,有利于利用高速缓存。如果一个对象没有线程逃逸,就可以取消其中一切同步操作,很大的提高性能。

      但是逃逸分析是很有难度的,因为花了 cpu 去对一个对象去分析,要是他不逃逸,就无法优化,之前的分析血本无归。所以不能使用复杂的算法,同时现在的 JVM 也没有实现栈上分配。所以开启之后,性能也可能下降。

      可以使用-XX:+DoEscapeAnalysis 来开启逃逸分析。

      高吞吐量 GC 配置

      对于高吞吐量,在年轻态可以使用 Parallel Scavenge,年老态可以使用 Parallel Old 垃圾收集器。

      使用-XX:+UseParallelOldGC 开启

      可以将-XX:ParallelGCThreads 根据 CPU 的个数进行调整。可以是 CPU 数的1/2或者5/8

      低延迟 GC 配置

      对于低延迟的应用,在年轻态可以使用 ParNew,年老态可以使用 CMS 垃圾收集器。

      可以使用-XX:+UseConcMarkSweepGC 和-XX:+UseParNewGC 打开。

      可以将-XX:ParallelGCThreads 根据 CPU 的个数进行调整。可以是 CPU 数的1/2或者5/8

      可以调整-XX:MaxTenuringThreshold (晋升年老代年龄)调高,默认是15.这样可以减少年老代 GC 的压力

      可以-XX:TargetSurvivorRatio,调整 Survivor 的占用比率。默认50%.调高可以提供 Survivor 区的利用率

      可以调整-XX:SurvivorRatio,调整 Eden 和 Survivor 的比重。默认是8。这个比重越小,Survivor 越大,对象可以在年轻态呆更多时间。

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

    B/S架构测试环境搭建_Oracle篇(Win32系统)

     一、新建数据库

      (1)、Oracle数据库安装完成之后,在程序的目录下会出现对应的可选项。选择“开始”-->“Oracle”-->“配置和管理工具”-->“Database Configuration Assistant”。具体见下图:

    图1  Oracle新建数据库开始菜单

      (2)按照提示的步骤,一步步走下去即可,记住自己填写的数据库名称或者SID。Oracle默认的DBA管理权限的用户为SYS和SYSTEM,密码在创建数据库的时候设置(在下图的页面上设置密码)。

    图2、Oracle设置DBA密码页面

      (3)建立数据库大约需要1分钟,建立完成后可以用DB工具或者SQL验证下数据库是否能够正常使用。个人比较偏向使用DBVisualizer。不过这还是提供下连接的命令:

      cmd到命令行后执行:sqlplus username/password@databaseName,数据库服务正常情况下会返回连接成功的提示信息。如果失败根据提示信息查看具体原因。要求执行该命令的系统上具有开启的Oracle服务。

      (4)数据库建立好之后是建立表空间的过程(数据库、表空间、用户、Schema、表、视图、索引这些数据库术语具体含义以及相互间的关系以后介绍),链接到该数据库下执行命令:

      create tablespace tablespace_Name datafile 'F:\oracle\oradata\qa10g\tablespace_Name.dbf'(存放路径,最后的表空间文件名称最好与表空间名一致,方便之后使用) size 100M(根据需要可以调大) autoextend on(数据文件自动扩展);

     之后是创建用户,在Oracle里面如果不指定的话,在创建用户时系统会建立一个相同名称的Schema与之对应所以在Oracle里面一般情况下用户名和Schema(模式)名称是一样的。

      create user username identified by password default tablespace tablespace_Name;

      这个不用解析了,SQL基本语法,看看就行。

      下面是给这个用户授权,如果不授权,创建的用户是个死的,相当于创建了一个占位的僵尸,授权就是激活这个僵尸的最有效的步骤。

      grant privilege[权限] to username;

      SQL授权命令grant,privilege(权限)这个可以有多个,如先来一个create session,让该用户能够连接到该DB上,然后是select、update、create table/tablespace之类的,具体的就看你创建这个用户做什么用的了,如果怕权限不足引发错误的话,直接可以授予用户DBA的权限(前提是当前连接的用户有授予DBA的权限)。用完之后怕引发问题可以用revoke命令回收权限,具体用法和grant相似。

      此时建立的用户、Schema是一个空壳子,里面的结构是空的。可以根据SQL建立对应的表和其他DB组件,这个比较复杂也比较多,我们留待以后整理。

      二、恢复现场环境

      Oracle数据库实验室中需要恢复现场的数据,Oracle数据库支持数据的导出为DMP的操作,一般现场需要恢复数据都会将现场的数据导回来,测试人员接手的是一个DMP文件,这时候我们需要去沟通了解更多的信息需要了解要恢复这个DMP中的哪个Schema(一般情况下一个DMP对应一个Schema,不排除一个DMP包含多个Schema的情况),以及对应的用户的默认表空间。我们先看下Oracle的导出命令:

      exp username/password@DataBase_Name file=d:\daochu.dmp(DMP存放路径) owner=(system,sys)(填写需要导出的Schema)。

      这下看到了,owner中允许多个用户被导入到同一个DMP中。

      与exp命令对应的就是imp命令了,用于恢复DMP中数据:

      imp username(新建的用户)/password@databaseName file=dmp_path(存放dmp的全路经,如C:\1.dmp) fromuser=需要恢复的Schema名 touser=username ignore=y;

      (使用ignore=Y,在创建表的时候如果有同名的表,那么就忽略,然后直接向里边导入数据.这样就可以实现你的要求.但是速度会比较慢. ignore=N,在创建表的时候如果有同名的表,那么就不执行后边的导入数据的操作了.)   如果导入无出错信息,此Schema(username)中就具备了现场的数据了。可以正常使用。

      如果某个DMP中只有一个Schema,那么导入的时候可以不必在乎fromuser(不过这样做不规范),简洁版的导入命令:

      imp username(新建的用户)/password@databaseName file=dmp_path full=y(完全导入) ignore=y;

      OK,“导入成功终止,没有出现错误”。现场DMP恢复就算大功告成了。

      Oracle的先介绍到这,初级使用,新手上路,请多关照。

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

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

     所谓的V模型,其实是对瀑布模型的一种修改,也算一个Change吧,详见下图:

      由于瀑布模型对于软件的需求分析与设计阶段考虑不足,导致可能会出现严重的设计问题,最后交付到客户手里才会被发现,所以V模型就考虑到这点,针对开发的各个过程都会有相应的测试环节,比如用户需求会对应验收测试,需求分析和系统设计会对应确认测试和系统测试等等(详见上表),这样子起码在交付前会把用户需求方面的问题覆盖到,不太会出现说这个产品不是客户想要的这种问题。

      但是缺点也是显而易见的,跟瀑布模型一样,测试过程还是放在了最后环节,虽然可以满足客户的需求,但是问题都只能到最后阶段才能被发现,必然会导致上面瀑布模型发生相同情况,也就是成本和时间的增加,所以V模型充其量也只能是瀑布模型的2.0版本。(不过好歹已经有了Change,我相信在那个年代的背景呀,已经算挺不错了,已经考虑到需要对需求分析这些进行测试了)

      当然,时代总是在不断地变化之中,你不懂得Change,那唯一的结局就是落后,落后就要挨打,有多少曾经风光的软件公司在今天已经找不到踪影,活下来的公司都是能不断适应时代改变而改变的公司。

      V模型虽然比瀑布模型稍微先进那么一点,但是总是没法跟得上时代的进步,因为有现在看来显而易见的缺点(当然,这里得说一下,即使在现在,瀑布模型和V模型还是有其用武之地,特别是那种对质量看得非常严格,基本上方案定了不会有改动的行业,所以它们没有被淘汰,我这里讲的Change其实更多是针对敏捷开发的公司的,这类公司其实以前就应该敏捷,只是那个时候没敏捷的想法,但是它们的开发流程总是有敏捷的需求,所以这个流程总是在Change中,并且不断地去适应和反过来推动它们的流程的继续发展。)

      上面讲了这么多,大家已经知道了瀑布模型和V模型对于需要敏捷的公司有一个致命伤了,也就是他们的测试环节总是放在开发完成后,从而导致了所有的Bug都是只能在最后才能被发现,客观上增加了产品是否能按时和正确地发布的风险。既然知道了问题所在,咱们的过程分析管理人员们也不是盖的,纷纷想出了高招。

      首先来介绍一下W模型(见下图),W模型其实是有两个V模型组成,其实也就是双V了,看起来像W就叫做W模型了,W模型强调测试需要和开发同步进行,开发包括哪几个步骤,测试就需要测哪几个步骤,更重要一点是需要同步进行,也就是说你做完这一步我就需要测掉这一步,那开发的步骤也无非就包括了需求、设计和代码了,所以这些步骤都进行测试。



     一看W模型,我就觉得这个模型已经很现代了,因为它终于把测试环节解放出来了,可以说是一个革命性的改变,把大家一直认为开发最后一步的测试环节,提到了跟开发同步的环节,并且把测试环节扩展到了需求和设计环节,这个理念已经跟现在的测试理念一样了。

      在W模型中,当客户需求出来后,测试就会开始介入,看看需求里写的是不是就是客户当时所说;在设计完成后,看看设计文档是不是真实地反映了客户需求精神;在开发完成后,就开始单元测试,集成测试,确认测试,集成测试和验收测试。这样子的话,基本上也就解决了前面瀑布模型和V模型碰到的问题。(能提出这个模型的研究员,我觉得很厉害,赞一下!)

      当然说了优点还是得说一下缺点,W模型虽然把测试与开发过程同步进行了,但是总是有前后关系,也就是一个过程完全完成后,才能进行下一个阶段,比如说需求过程完全做完以后,再去由测试去研究是否符合客户要求,然后才能开始设计阶段;设计工作完全完成后,再检查设计文档是否真正体现客户的需求,然后再开始编码阶段。。。。。。,这样子的话,简单的软件还行,但是一旦一个软件很复杂,需求可能会经常变更,这个模型就不知道怎么处理这种变更,因为它认为需求处理完了就完了,以后不会再有变更;设计验证过了就Ok了,以后不会再有变化。如果某一天,已经在进行单元测试了,突然客户一个需求改了,或者加了一个新功能,这个模型看着就蒙了,如果是经常有更改的话,这个模型就疯了,呵呵。

      其他还有几种著名模型,比如H模型和X模型,都是对瀑布模型和V模型进行了不错的更新,当然也还是有其局限性,上面W模型存在的问题还是没法解决。

      不过,时代还在继续发展,还有More Change等着咱们呢,且继续听下回分解。

      (未完待续)


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

    对C/S结构信息系统进行性能测试的几个关键问题

     在针对C/S结构的信息系统进行性能测试的时候,因为客户端实现机制的不同,往往会遇到很多棘手的问题。采用何种测试方法进行测试就是一个首先必须解决的问题,往往很多测试工程师都感到非常困惑。

      在进行了一番技术研讨之后,在本文的案例中,对于C/S信息系统进行性能测试的时候,采用的是自动化性能测试工具LoadRunner调用自动化功能测试工具Quick Test Professional脚本的方法实现性能测试。其实,对C/S结构信息系统进行测试的时候,重点不在使用LR,而在于熟练使用QTP,本文正是在总结项目经验的基础上,深入探讨了使用QTP的多个关键技术问题,愿与业内同行进行深入探讨,共同提升测试能力。

      1、QTP无法捕捉到菜单栏对象

      问题描述:用鼠标正常点击菜单栏,但是QTP捕捉不到菜单栏

      解决方法:这是属于对象不识别的问题,当鼠标点击菜单栏的时候,把对象识别的方式换成低级录制方式就可以捕捉到了。(这是QTP对象识别的第一法宝

      2、用QTP捕捉对象时,鼠标操作不起作用了

      问题描述:厂商进行了二次开发,但是所开发的子窗口,用鼠标在菜单栏里打开,QTP根本捕捉不到这个新对象。

      解决方法:换一种方式,不用鼠标,用键盘来捕捉!用键盘的上下键移动到相应要打开的地方,用Enter键就可以了,这样便可以捕捉到对象了,而且还不容易出错。(这是QTP对象识别的第二法宝

      3、弹出窗口后,QTP无法捕捉弹出来的窗口对象

      问题描述:窗口弹出来了,但是点击其中Button后,QTP无法捕捉对象。

      解决方法:在回放中发现,弹出的二次开发窗口并没有激活,界面呈灰色,所以在脚本录制时,弹出窗口后,先用鼠标点击一下窗口以便激活窗口。这样在回放的时候就可以看到窗口被激活了。里面的对象也随之可以识别了。

      4、QTP当从对象模式换成低级录制模式的时候引起变化

      问题描述:在录脚本过程中,采用的是对象识别模式,但是当需要换成低级录制模式时,这时候需要鼠标点击QTP,选择低级录制模式,然后再点击被测软件,其实这些操作都已经被记录到脚本里了,有时还引起了被测软件发生变化,给录制脚本带来很多麻烦。

      解决方法:这个问题是一个需要注意的问题,在我们录脚本过程中,当需要从对象模式转换成低级录制模式时,用Alt+Tab键就可以了,不要再点击QTP,然后再点击被测程序了,这样会增加很多步骤,回放脚本的时候也容易出错,用Alt+Tab键最灵活也最方便。

      5、在QTP的对象库里添加对象,用“小手”进行对象识别时,没办法进行操作软件了

      问题描述:用Spy进行对象识别的时候,鼠标会变成“小手”,可是我要捕捉的是对象里面的对象,比如帮助下拉菜单里的子项,没法操作,也就抓不到对象。

      解决方法:这个问题属于一个技巧性的问题,解决的方法是:在“小手”的情况下,按Ctrl键,“小手”自然就变成鼠标,和平时操作一样了,操作之后就可以捕捉我们想捕捉的对象了。

      6、QTP的自动化脚本录完了,可是还想增加检查点,怎么办?

      问题描述:脚本已经录制完成了,可是在当天新的测试规范中需要加入新的检查点,怎么办?我想加检查点,可是发现QTP中加检查点的那一项是灰色的,以我的经验我知道这是需要在录制脚本过程中才能加检查点的,难道重新录制脚本?

      解决方法:加检查点,不需要重新录制脚本,有三种灵活的方法:第一种,点击脚本的不同步骤,在Active Screen中,可以发现被测程序的截图,如果你要加检查点的控件在这个截图中,那么你用鼠标点中这个控件,右键,会发现有让你加检查点的选项,这样就可以加检查点了;第二种,当你发现在程序截图中没有你要加检查点的控件,如果在上下文中有过同样控件的检查点,那么你把该语句直接拷贝过来,然后把该检查点的属性改成你想做的操作就可以了;第三种,如果前两种方法都不行,那你也不必重新录制脚本。你在要加检查点的步骤的上一步设个断点,回放脚本让程序运行到这个断点,然后停掉脚本,然后重新录制脚步,注意,这可不是重新录制,而是中间录制,这个方法太灵活了,然后像真正录脚本一样,加入你想加的检查点就OK了。

      7、QTP自动化脚本的检查点的类型很多,如何选择?

      问题描述:有标准检查点,有图片检查点,文本检查点,这么多类型该怎么选择?

      解决方法:一般情况下,用标准检查点就可以了。文本检查点是检查在屏幕上、窗口上、Web页面上的文本,一般是针对附带环境里的文本。如果是小图片的话,可以用图片检查点。

     8、QTP脚本回放一直报错,出现对象属性不匹配的问题

      问题描述:脚本回放之后报错,看错误信息,发现好像是对象属性不匹配的问题引起的错误。

      解决方法:这个问题是比较深刻的,需要对QTP的对象识别原理有一定的认识。QTP有一个对象库,把所有识别的对象都放到了这个库里,在这个库里每个对象又有相应的属性,在回放的时候就是通过比对这些属性来识别不同的对象。这里报这个属性不匹配的错误,你需要把对象库里的对象调出来,然后用“小手”去查看运行界面中的相同对象,你会发现,这两个对象的属性不一样。也就是说,每次当程序运行到这个时候,这个控件的这个属性都会发生变化,就好比LR录制脚步中的Session,每次运行,系统都会分配一个新的值,这里的控件也是同样的道理。你要做的第一件事就是找到有哪些属性不匹配,你就在QTP的对象库中把它删掉,运行一下看看。如果系统又报错,说不止有一个对象是你想要的对象,说明,你删了属性,但是这些多个控件就无法区分了,你需要再增加一些新的属性,使不同的控件有个区别,这样应该就可以了,脚本就可以顺利运行了。(QTP对象识别的第三法宝

      9、C/S录脚本最重要的地方

      C/S录脚本最总要的地方,莫过于对象识别的问题了,对于这个问题,在上面也提到过,这里做个总结,无过于这三大法宝:第一,对象识别的模式换成低级录制的模式;第二,对象识别的模式换成键盘识别的模式;第三,属性不匹配,就增删一些属性就可以了。

      10、Studio开启状态,脚本回放错误

      问题描述:在厂商的Studio环境开启情况下,录脚本或回放脚本,报错。

      解决方法:这种情况下,需要把厂商的Studio环境关闭,不能在开发状态下录脚本或回放脚本,会报错的。

      11、QTP脚本中加事物点的位置要求变动

      问题描述:在新的测试规范里,要求变动事物点的位置。

      解决方法:这个问题的解决体现了QTP灵活编辑脚本的功能,不需要重新录制脚本了,只需要在脚本中,找到需要加事物点的步骤,然后把脚本中事物开始和结束的脚本语句剪切过去就行了。

      12、QTP脚本录制完了之后,是非常有必要进行优化的

      问题描述:仔细观看自己录制好的脚本发现,比如在text框中输入值的时候,会看到输了一个“5”,然后又删了“5”改成了“6”。

      解决方法:这个问题就反应出,在脚本录制过程中难免会有一些失误,脚本虽然录制完了,但是还需要优化!针对上面这个例子,就需要在脚本中把多余的步骤删掉,以优化脚本,提高脚本的性能。

      13、实现C/S并发测试的机理

      问题描述:因为用LR录C/S脚本,在Socket的协议下,脚本没有可读性,所以为了实现C/S的并发测试,采用LR调QTP脚本进行并发测试的方法。可是一台机器只能开一个QTP,如果要并发100,难道找100台测试机吗?。

      解决方法:不是的,这里采用善巧的方法,那就是采用Windows Server 2003的系统,在一台机器上开多个远程桌面,解决测试机不足的问题,虽然说效率以及真实性会有一定的质疑,但是这已经是很好的方法了。

      14、怎样让QTP脚本循环多次?

      问题描述:LR中可以设置Run Logic的次数,但是怎样让QTP脚本也有这个循环的功能呢?

      解决方法:QTP脚本中,在最开始和最后加进入for循环语句,就OK了,目前使用的是加语句的办法。




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

    用正交法设计测试用例

      一、正交表的由来

      1、拉丁方名称的由来

      古希腊是一个多民族的国家,国王在检阅臣民时要求每个方队中每行有一个民族代表,每列也要有一个民族的代表。

      数学家在设计方阵时,以每一个拉丁字母表示一个民族,所以设计的方阵称为拉丁方。

      2、什么是n阶拉丁方?

      用n个不同的拉丁字母排成一个n阶方阵(n<26 ),如果每行的n个字母均不相同,每列的n个字母均不相同,则称这种方阵为n*n拉丁方或n阶拉丁方。每个字母在任一行、任一列中只出现一次。

      3、什么是正交拉丁方?

      设有两个n阶的拉丁方,如果将它们叠合在一起,恰好出现n2个不同的有序数对,则称为这两个拉丁方为互相正交的拉丁方,简称正交拉丁方。

      例如:3阶拉丁方

      A B C          A B C

      B C A   和     C A B

      C A B          B C A

      用数字替代拉丁字母:

      1 2 3           1 2 3             (1,1)(2,2)(3,3)

      2 3 1    和     3 1 2     --->    (2,3)(3,1)(1,2)

      3 1 2           2 3 1             (3,2)(1,3)(2,1)

      二、正交试验法介绍

      人类在认识自然界的过程中,进行着多方面的探索,试验是构成学习过程的一个重要要素。

      爱迪生一生艰苦奋斗,经历了无数次的失败之后,为人类发明了许多重要的科技成果。他的座右铭是:“天才靠的是百分之一的灵感和百分之九十九的汗水”。他的助手在他去世后的第二天说:“如果在爱迪生工作的黑屋中能有一支蜡烛照亮他前进的方向,以他蜜蜂般地努力,他会获得远比他发明多的多的成果”。就是说如果有一点理论知识和计算能帮助爱迪生,他会节省90%的精力。爱迪生是边试验边分析后决定下次试验,这种方法速度太慢。

      正交试验设计是研究多因子(术语解释:把实验中影响响应变量的那些变量称为实验中的因子,因子分为可控因子和非可控因子)多水平(术语解释:把因子不同的取值称为水平)的一种试验方法,它是根据正交性从全面试验中挑选出有代表性的点进行试验,正交试验具备了“均匀分散,齐整可比”的特点,正交试验设计是分式析因设计的主要方法。

      日本著名的统计学家田口玄一将正交试验选择的水平组合列成表格,称为正交表。例如作一个三因素三水平的实验,按全面实验要求,须进行33=27种组合的实验,且尚未考虑每一组合的重复数。若按L9(33) 正交表安排实验,只需作9次,大大减少了工作量。正交实验设计是一种高效率、快速经济的实验设计方法,因此在很多领域得到广泛应用。

      利用场景法来设计测试用例时, 作为输入条件的场景非常庞大,以至于得到的测试用例数目多的惊人,给软件测试带来沉重的负担。如果舍弃一些场景又怕测试设计的覆盖度达不到,将缺陷遗留给客户。为了有效地减少测试缺陷遗留,合理地减少测试的工时与费用,从2008年开始公司推行正交试验设计方法进行测试用例的设计。

      三、正交表的构成

      1、正交表的构成

      行数(Runs):正交表中的行的个数,即试验的次数,也是我们通过正交实验法设计的测试用例的个数。

      因子数(Factors) :正交表中列的个数,即我们要测试的功能点。

      水平数(Levels):任何单个因子能够取得的值的最大个数。正交表中的包含的值为从0到数“水平数-1”或从1到“水平数” 。即要测试功能点的输入条件。

      2、正交表的形式

      L行数(水平数因子数

      如:L8(27)

      3、正交表的正交性

      ● 整齐可比性

      在同一张正交表中,每个因子的每个水平出现的次数是完全相同的。由于在试验中每个因子的每个水平与其它因子的每个水平参与试验的机率是完全相同的,这就保证在各个水平中最大程度的排除了其它因子水平的干扰。因而,能最有效地进行比较,容易找到较佳的试验条件。

      ● 均衡分散性

      在同一张正交表中,任意两列(两个因子)的水平搭配(横向形成的数字对)是完全相同的。这样就保证了试验条件均衡地分散在因子水平的完全组合之中,因而具有很强的代表性,容易得到好的试验条件。

      4、用正交表设计测试用例的优点

      ● 不需要对所有组合情况穷举,只需要少量的抽样组合数据,可明显地提高效率;

      ● 用正交表抽样出的组合数据,对组合情况具有最佳的覆盖性;

      ● 能减少手工对组合数据抽样导致的大量测试遗漏

      四、设计步骤

      (1)提取功能说明,提取因子

      把影响实验指标的条件称为因子,而影响实验因子的条件叫因子的水平。

      利用正交实验设计方法来设计测试用例时,首先要根据被测试软件的规格说明书找出影响其功能实现的操作对象和外部因素,把它们当作因子;而把各个因子的取值当作状态,把它们当做水平。对软件需求规格说明中的功能要求进行划分,把整体的、概要性的功能要求进行层层分解与展开,分解成具体的有相对独立性的、基本的功能要求。这样就可以把被测试软件中所有的因子都确定下来,并为确定每个因子的权值提供参考的依据。确定因子与状态是设计测试用例的关键。因此要求尽可能全面的、正确的确定取值,以确保测试用例的设计作到完整与有效。

    (2)判断是否可以使用正交表

      并不是任何情况都可以使用正交表,以下情况无法使用正交表:

      ● 因素的个数非常少,如只有2个;

      ● 因子数很大。

      另外在识别的因子中,还要进行以下分析:

      ● 组合因素之间必须为平行关系(平行:可以同时存在)

      ● 不能为互斥(互斥:1个因素存在,另1个因素不能存在)

      ● 因素不能被其它因素的因子制约(制约:当A因素的因子为A1,B因素不能存在)

      ● 排除非组合因素

      (3)查找和调整正交表

      如果判断可以使用正交测试方法设计测试用列,需要根据测试功能点的实际情况,选择正交表。

      选择正交表的原则如下:

      ● 实际因素数≤正交表因素数;

      ● 实际每个因子数≤正交表每个因子数;

      ● 如果出现2个或2个以上正交表符合以上条件,则选择Case数最少的正交表。

      选取了正交表后,删除正交表中多余的因子列,原则是删除靠后的列;

      (4)加权筛选,生成因素分析表

      对因子与状态的选择可按其重要程度分别加权。可根据各个因子及状态的作用大小、出现频率的大小以及测试的需要,确定权重的大小。对于权重高的因子放在最前面的列中,以此类推。

      (5)把变量的值映射到表中

      在使用正交法时,要考虑到被测系统中要准备测试的功能点,而这些功能点就是要获取的因子,但每个功能点要输入的数据按等价类划分有多个,也就是每个因素的输入条件,即状态或水平值。

      选取了因子和水平后,需要把变量实际的值映射到正交表中。

      (6)正交测试用例的制作

      把实际因子和水平代入正交表后,每一行制作成一个测试用例。

      (7)组合补充测试用例

      根据需求规格说明书或错误推断法,补充需要测试但正交表没有覆盖的测试数据,将其制作成测试用例。

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

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

    导航

    统计

    常用链接

    留言簿(55)

    随笔分类

    随笔档案

    文章分类

    文章档案

    搜索

    最新评论

    阅读排行榜

    评论排行榜