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中,寫入如下代碼,建立兩個類之間的關聯:

        1. @ManyToOne 
        2. public Department department;
        3.   這里依然使用了@ManyToOne的JPA注解去實現多對一的關系。在再次運行程序后,會發現,在增加員工時,會出現下拉菜單選擇框,讓其選擇該員工屬于哪一個部門。

            七、建立公司實體類和控制類

            最后,我們建立公司實體類和控制類。同樣,在app/models目錄下,建立Company類如下:

        4. package models;  
        5. import javax.persistence.Entity;  
        6. import play.db.jpa.Model;  
        7. @Entity 
        8. public class Company extends Model {  
        9. public String name;  
        10. public String address;  
        11. public boolean isPublic;  
        12.  }
        13.   company的控制層類代碼如下:

        14. package controllers;  
        15. import models.Company;  
        16. @CRUD.For(Company.class)  
        17. public class Companies extends CRUD  
        18. {  
        19. }
        20.   這里要提醒一點的是,由于company的復數是companies,而play框架原先約定俗成的是在實體類名后直接加字母s,所以這里使用了注解 @CRUD.For(Company.class),以表明該控制類文件Companies是為company實體類服務的。

            同樣,一個公司里有許多部門,因此在Deparment部門類中,建立如下的多對一關系:

        21. @ManyToOne 
        22. public Company company;
        23.   再次運行程序,可以看到,現在三個實體類都建立起來了,可以分別對公司,部門和員工進行CRUD操作,如下圖:

            八、優化列表

            我們在查看每個實體類的列表時,發現在列表中,會把每條記錄的id都顯示出來,這個在程序中假設不需要看到id字段的話,可以通過修改代碼實現,比如在Company類中,增加toString方法即可:

        24. public String toString() {  
        25. return name;  
        26. }
        27.   而在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 閱讀(321) | 評論 (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 閱讀(487) | 評論 (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 閱讀(204) | 評論 (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 閱讀(157) | 評論 (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 閱讀(194) | 評論 (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 閱讀(174) | 評論 (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 閱讀(274) | 評論 (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 閱讀(141) | 評論 (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 閱讀(310) | 評論 (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 閱讀(5934) | 評論 (0)編輯 收藏

          僅列出標題
          共394頁: First 上一頁 365 366 367 368 369 370 371 372 373 下一頁 Last 
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 齐齐哈尔市| 鹤庆县| 诸城市| 尉氏县| 郸城县| 吉木萨尔县| 安乡县| 滦南县| 诸城市| 武城县| 南丹县| 正安县| 时尚| 阜宁县| 梅河口市| 公主岭市| 双江| 昭苏县| 怀仁县| 平凉市| 台江县| 东明县| 航空| 吉首市| 湖南省| 衢州市| 巍山| 来宾市| 丹东市| 来凤县| 新昌县| 威远县| 馆陶县| 梅河口市| 桃江县| 温宿县| 新昌县| 衡南县| 凌云县| 类乌齐县| 博客|