<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經轉移至github,大家請訪問 http://qaseven.github.io/

    UIAutomation: 登錄界面測試實例

     功能介紹:包括2個文本輸入框,分別叫 User name 、 Password ,和一個按鈕,叫 Login。
      以下為測試腳本:
    //Get the handle of application main window
    var window = UIATarget.localTarget().frontMostApp().mainWindow();
    //Get the handle of view
    var view = window.elements()[0];
    var textfields = window.textFields();
    var passworldfields = window.secureTextFields();
    var buttons = window.buttons();
    var textviews = window.textviews();
    var statictexts = window.staticTexts();
    var target = UIATarget.localTarget();
    //Check number of Text fields
    if(textfields.length != 1)
    {
    UIALogger.logFail("FAIL: Invalid number of Text fields");
    }
    else
    {
    UIALogger.logpass("PASS: Correct number of Text fields");
    }
    //TESTCASE_001: Test Log on Screen
    //Check existence of desired TextField on UIScreen
    if(textfields["username"]==null || textfields["username"].toString() == "[object UIAELementNil]")
    {
    UIALogger.logFail("FAIL:Desired textfield not found.");
    }
    else
    {
    UIALogger.logPass("PASS: Desired UITextfield is available");
    }
    //TESTCASE_1.2:Check existence desired of PasswordField On UIScreen
    if(passwordfields[0] == null || passworldfields[0].toString() == "[object UIAElementNil]")
    {
    UIALogger.logFail("FAIL: Desired UISecureField not found.");
    }
    else
    {
    UIALogger.logPass("PASS: Desired UISecureField is available");
    }
    //TESTCASE_1.3 :Check for Existence of Buttons On UIScreen
    if(button["logon"] == null || buttons["logon"].toString() == "[object UIElementNil]")
    {
    UIALogger.logFail("FAIL:Desired UIButton not found.");
    }
    else
    {
    UIALogger.logPass("PASS:Desired UIButton is available");
    }
    //TESTCASE_001: Missing User Name
    textfields["username"].setValue("");
    passwordfields[0].setValue("password");
    buttons["logon"].tap();
    //target.delay(2);
    var errorVal = textviews["error"].value();
    if(errorVal != "Invalid User Name or PassWord")
    {
    UIALoger.logFail("Did Not Get Missing UserName Error:" + errorVal);
    }
    else
    {
    UIALogger.logPass("Missing User Name");
    }
    //TESTCASE_003: Successful Log On
    textfields["username"].setValue("username");
    passwordfields[0].setValue("password");
    buttons["logon"].tap();
    target.delay(2);

    posted @ 2014-05-14 10:10 順其自然EVO 閱讀(1751) | 評論 (0)編輯 收藏

    如何制定語境驅動的測試計劃

     本指南旨在幫助讀者制定測試計劃。請注意,真正的測試計劃是實際指導自己實施測試的一套想法。不管讀者是否制定書面測試計劃,我們設計的這個指南都會有所幫助。
      本指南并不是一種模板,不是供讀者填寫的表格,而是一組旨在幫助讀者思考的思想,用于降低讀者遺忘重要內容的可能性。我們使用的是簡潔語言和描述,有可能不太適合測試新手。本指南主要向有經驗的測試員或測試組長提供支持。
      以下分 七個任務主題。這些主題沒有一定順序。實際上,讀者可以按任何順序閱讀。只是需要注意,測試計劃的質量與是否很好地執行了任務以及使否很好地考慮了像這里提出的問題相關。狀態檢查部分有助于讀者確定是否制定了足夠好的測試計劃,但是我們建議讀者要在整個項目開發過程中,重新檢查并修改測試計劃(至少要在心中修改)。
      1. 監視影響測試計劃的主要問題
      確定影響制定實用、有效的測試策略中時間、工作量或可行性要素的風險、障礙或其他挑戰。要把握計劃的整體作用。在整個項目開發過程中,全程監視這些問題。
      ____ 狀態檢查___________________________________________________
      □ 是否有要滿足的特別關鍵或很難度量的產品質量標準?
      □ 產品是否復雜或很難學會?
      □ 測試員是否需要特殊培訓或工具?
      □ 是否很難得到或配置的部分測試平臺?
      □ 是否將測試未集成或半可操作的產品組件?
      □ 是否存在具體的可測試性問題?
      □ 項目團隊是否缺乏產品設計、技術或用戶群的經驗?
      □ 測試是否必須很快開始?
      □ 是否有制定測試計劃所需的信息還沒有收集到?
      □ 是否能夠評審被測產品的某個版本(甚至是演示版、原型版或老版本)?
      □ 是否有足夠的難以錄用或組織的測試人員?
      □ 是否必須遵循自己所不熟悉的測試理論?
      □ 項目計劃的制定是都沒有考慮測試需要?
      □ 計劃是否要經過漫長的協商或批準?
      □ 測試員是否遠離客戶?
      □ 計劃是設計的一個內容嗎?
      □ 客戶是否說不出測試員能夠為他們做什么?
      2. 明確任務
      本節給出的任何一部分或全部目標都可能是具體測試任務的一部分。有些任務比另外一些更重要。根據對具體項目的了解,為這些目標排隊。對于所有使用的目標,找出可以用來評判的具體的成功指標。
      需要考慮的任務要素
      □ 快速找出重要問題。
      □ 進行綜合質量評估。
      □ 確認產品質量是否達到具體標準。
      □ 盡可能縮短測試時間或降低測試成本。
      □ 盡可能提高測試效率。
      □ 就提高質量或可測試性問題,向客戶提出建議。
      □ 就如何測試向客戶提出建議。
      □ 保證測試過程總是可以充分說明的。
      □ 嚴格遵守特定的方法或指示。
      □ 使特定的項目相關人員感到滿意。
      可能的工作產品
      □ 說明測試任務的簡短電子郵件。
      □ 一頁紙篇幅的測試要求。
      ____ 狀態檢查___________________________________________________
      □ 是否知道誰是自己的客戶?
      □ 關鍵人物是否贊同測試任務?
      □ 測試任務是否足夠清晰,以作為制定計劃的基礎?
    3. 分析產品
      了解被測試產品及其內部技術。了解如何使用被測產品。需要深入下去。隨著對產品了解的深入,測試會變得越來越好,因為自己越來越接近成為產品專家
      分析什么
      □ 用戶(用戶是誰,他們的職業是什么)。
      □ 結構(代碼、文件等)。
      □ 功能(產品做什么)。
      □ 數據(輸入、輸出、狀態等)。
      □ 平臺(外部硬件和軟件)。
      □ 運營(產品是用來完成什么任務的)。
      分析方式
      □ 執行探索式測試。
      □ 評審產品和項目文檔。
      □ 與設計人員和用戶面談。
      □ 與類似產品進行比較。
      可能的工作產品
      □ 測試覆蓋大綱。
      □ 帶注釋的規格說明。
      □ 產品問題清單。
      ____ 狀態檢查___________________________________________________
      □ 設計人員贊同產品覆蓋大綱嗎?
      □ 設計人員認為測試員了解產品嗎?
      □ 測試員能夠可視化產品并預測產品行為嗎?
      □ 測試員能夠產生測試數據(輸入和結果)嗎?
      □ 測試員能夠配置并操作被測產品嗎?
      □ 測試員理解產品將被怎樣使用嗎?
      □ 測試員是否發現設計中的不一致問題?
      □ 測試員是否找出顯式和隱式規格說明?
      4. 分析產品風險
      被測產品可能怎樣以一種重要方式失效?開始測試員最多也智慧有一個一般想法。隨著測試員對產品了解的深入,測試策略和測試會變得越來越好,因為對被測產品的失效機理了解的越來越多。
      分析對象
      □ 威脅(具有挑戰性的條件和數據)。
      □ 脆弱性(在什么地方可能失效)。
      □ 失效模式(可能的問題種類)。
      □ 失效影響(問題的嚴重程度)。
      分析方式
      □ 評審需求和規格說明。
      □ 評審實際失效。
      □ 與設計人員和用戶面談。
      □ 對照風險啟發和質量評判大綱評審產品。
      □ 找出一般問題和失效模式。
      可能的工作產品
      □ 組件/風險矩陣。
      □ 風險清單。
      ____ 狀態檢查___________________________________________________
      □ 設計人員和用戶對風險分析認可嗎?
      □ 測試員能夠找出所有重要的問題種類嗎?這些問題都應該在測試期間出現嗎?
      □ 為了盡可能提高測試效果,測試員知道該把測試工作集中到哪些對象上嗎?
      □ 設計人員是否采取措施使重要問題更容易被檢測,或降低發生的可能性?
      □ 測試員如何發現自己的風險分析是否準確?
      5. 設計測試策略
      為了根據已有的產品最佳信息快速、有效地測試,測試員可以做什么?首先盡可能做出最好的決策,同時又要讓測試策略能夠在項目整個開發過程中改進。
      考慮五方面的手段
      □ 以測試員為核心的手段。
      □ 以覆蓋率為核心的手段(結構覆蓋率和功能覆蓋率)。
      □ 以問題為核心的手段。
      □ 以活動為核心的手段。
      □ 以評估為核心的手段。
      計劃方式
      □ 針對風險和產品域確定手段。
      □ 可視化具體和實用手段。
      □ 使測試策略多樣化,盡可能減少遺漏重要問題的機會。
      □ 尋找通過自動化測試擴展測試策略的途徑。
      □ 不要計劃得過死,使測試員能夠發揮自己的才智。
      可能的工作產品
      □ 逐項列出的每條所選測試策略以及如何運用的說明。
      □ 風險/任務矩陣。
      □ 所選測試策略固有的問題或挑戰清單。
      □ 針對沒有充分覆蓋的產品部分提出的建議。
      □ 測試用例(僅當需要時)。
      ____ 狀態檢查___________________________________________________
      □ 客戶認同測試員制定的測試策略嗎?
      □ 測試策略給出的所有內容都是必要的嗎?
      □ 測試策略是否能夠實際貫徹?
      □ 測試策略是否過于通用?可以容易地用于任何產品嗎?
      □ 是否還有不準備測試的任何重要問題?
      □ 測試策略利用了可用的資源和幫助者嗎?
    6. 條件計劃
      測試經理將如何實現測試策略?測試策略會受到條件約束或指示的很大影響,努力爭取所需的資源,并盡量利用可用的所有資源。
      保障條件方面的問題
      □ 測試工作量估計和進度評估。
      □ 可測試性宣傳。
      □ 測試團隊力量(合適技能)。
      □ 測試員培訓與管理。
      □ 測試員任務分配。
      □ 產品信息收集與管理。
      □ 項目團隊會議、溝通和協同。
      □ 與項目團隊所有其他小組、包括開發小組的關系。
      □ 測試平臺的獲得和配置。
      □ 約定和協議。
      □ 測試工具和自動化測試。
      □ 插樁和模擬需要。
      □ 測試包的管理和維護。
      □ 構建和傳送協議。
      □ 測試周期管理。
      □ 錯誤報告系統和協議。
      □ 測試狀態報告協議。
      □ 代碼凍結與增量測試。
      □ 項目最后的壓力管理。
      □ 測試停止協議。
      □ 測試效果的評估。
      可能的工作產品
      □ 問題清單。
      □ 產品風險分析。
      □ 責任矩陣。
      □ 測試進度計劃。
      ____ 狀態檢查___________________________________________________
      □ 項目團隊的保障條件是否支持已制定的測試策略?
      □ 是否存在阻礙測試的問題?
      □ 測試條件和策略是否能夠修改,以適應可以預見的問題?
      □ 現在是否可以開發測試,以后再解決其余問題?
      7. 共享測試計劃
      測試員并不孤獨。測試過程必須服務于項目團隊。因此,要吸收項目團隊成員參與測試計劃的制定。不必夸大這個問題,至少要與團隊的關鍵成員討論,從而得到他們的理解和隱含的支持,以爭取實現測試計劃。
      共享方式
      □ 吸收設計人員和項目相關人員參加測試計劃制定過程。
      □ 積極征求有關測試計劃的意見。
      □ 盡自己所能幫助開發人員獲得成功。
      □ 幫助開發人員理解他們的行為會對測試產生的影響。
      □ 與技術文檔編寫員和技術支持人員就分享質量信息進行溝通。
      □ 請設計人員和開發人員評審和批準參考材料。
      □ 記錄和跟蹤約定。
      □ 請別人分段評審測試計劃。
      □ 通過減少測試計劃文檔中不必要的文字,來改進文檔的可評審性。
      目標
      □ 對測試過程的一致理解。
      □ 對測試過程的一致承諾。
      □ 測試過程的合理參與。
      □ 管理層對測試過程的合理預期。
      ____ 狀態檢查___________________________________________________
      □ 項目團隊是否關注測試計劃。
      □ 項目團隊,特別是一線管理人員是否理解測試小組的角色?
      □ 項目團隊是否感覺到測試小組關心項目團隊的最佳利益?
      □ 測試小組和項目團隊其他小組之間是否有對立或積極的關系?
      □ 是否有人認為測試員沒有將注意力集中到重要的測試上?
      =========================================================================
      這是一篇很長的文章,是討論如何制定語境驅動測試的測試計劃。會有很多的檢查項,幫助讀者不要忘記重要的內容。如果想照搬,肯定是不現實的。

    posted @ 2014-05-14 10:09 順其自然EVO 閱讀(145) | 評論 (0)編輯 收藏

    如何切分用戶故事

      在把用戶故事切分成小塊,從而更好地利用敏捷技術時,很多新組建的敏捷團隊都會遇到困難。 敏捷社區的成員在多篇文章中為如何有效地切分用戶故事提供了指導。
      當把龐大的用戶故事切分成小塊時,是否有一些一般的準則供我們遵循呢? Rachel Davies建議對每個用戶故事都要進行切分,從而讓產出的軟件:
      · 能夠工作
      · 交付價值
      · 能有效地得到用戶的反饋
      Richard Lawrence提供了以下技術,他認為在切分大型用戶故事時它們會很有用:
      根據工作流程的步驟來切分故事——可能是把簡單的首尾循環的用例作為一個故事,然后讓工作流中的其它步驟作為單獨的故事。
      切分故事,讓業務規則中的每種變化都是其自身的故事。
      把故事切分為“實現第一個[X]”,然后“實現其它[X]”。 當實現第一個[X]的時候所要付出的努力要比實現之后的所有[X]所要付出的都大時,就可以應用這種方法。
      當面對復雜故事的時候,把故事最簡單的版本切分為單獨的故事。
      通過故事所操作的數據類型來切分。
      通過找到簡單數據輸入方法和更復雜方法之間的區別來切分故事。
      把對當前故事的性能的考慮轉移到一個或多個新故事中。
      按照創建-讀取-更新-刪除(CRUD)來切分故事。
      最后一種方法,創建一個spike故事,從而描述出如何實現特性。
      Rachel Davies提供了關于如何根據輸入/輸出的數據來切分故事的細節:
      你可以為每個輸入頁面創建故事。
      你可以為輸入頁面每個可用的元素創建故事。
      你可以創建簡單的(不是很漂亮的)UI。
      你可以創建一個命令行界面。
      此外,Bob Hartman為切分故事提供了以下技術:
      在涉及到多個角色的故事中,根據角色來對其進行切分。
      切分故事,使得高風險的部分和低風險的部分分離。
      切分故事,從而使能夠在每個故事上工作的開發者數量最大化。
      切分故事以有助于測試
      你認為最有用的切分用戶故事的方式是什么呢?

    posted @ 2014-05-14 10:07 順其自然EVO 閱讀(185) | 評論 (0)編輯 收藏

    基于Selenium的自動化平臺設計

     前言
      相信說起QTP,大部分測試的同學都會知道;它作為一個成功商業軟件,其功能的強大自然不言而喻,但同時它也有自己的局限性;所以當人們在工作中發現有些想要的功能,在現有的工具中不能得到滿足的時候;可能就需要產生出一種新的設計或者方式來解決問題。
      本文中提到的就是類似的一種產出物,一個類QTP的又能滿足我們自己測試需求的測試工具。它是一個基于Selenium的上層自動化測試平臺,主要做的工作就是圍繞selenium來搭建起一套相對完善的自動化測試套件,讓基于selenium的自動化測試也能像QTP的測試體系一樣完整、易用。
      關鍵字:selenium、自動化平臺、web自動化測試
      設計的目的
      在自動化測試工具的使用方面,相信有很多人選擇QTP,也有不少人選擇selenium;所以選擇哪個工具都是基于具體項目的情況來確定的,而這里選擇selenium的初因可以大致羅列幾條:
      · 支持瀏覽器的兼容性測試
      · 支持跨平臺的web測試
      · 支持多種主流語言開發
      · 免費的、開源的項目
      · 易于二次開發和集成
      自然就像前面所提到的一樣,每一個工具都有它自己的局限和不足;selenium也沒有做到盡善盡美,但是當它的基本功能已經可以滿足我們核心業務的時候,剩下的工作可能需要我們自己來慢慢完善。這里也羅列幾條selenium不夠完善的部分:
      · 不支持對象庫管理功能
      · 沒有用例管理和執行功能
      · 沒有歷史結果查看系統
      · 不適合非技術人員使用
      依據上面的分析,我們可以很容易的發現selnium的不足正是QTP所擁有的;而QTP不支持的也是Selenium的被大家喜愛的原因之一。那么怎么能把它們各自的優點合二為一就是本文所要講述的內容----實現一個基于Selenium的自動化平臺。
         ......
      查看全文請點擊下載:http://www.51testing.com/html/15/n-860515.html
      測試用例管理模塊:
      測試用例管理模塊主要作用是新建、查詢、修改、執行測試用例;所以它要完成的功能有:
      · 測試用例的新建
      · 測試用例的查看
      · 測試用例的修改
      · 測試用例的執行
      測試結果管理模塊:
      測試結果管理模塊主要作用是查詢測試用例的執行結果、歷史記錄;所以它要完成的功能有:
      · 按測試用例查看結果
      · 按測試用例查詢歷史
      平臺的設計
      針對前面所設計到的功能;其主要功能都體現在管理上面,并非常見的代碼層面,所以要設計的平臺肯定要基于UI的;其次為了有更好的共享和通用性,所以應該選擇基于WEB的架構開發。
        ......
       查看全文請點擊下載:http://www.51testing.com/html/15/n-860515.html

    posted @ 2014-05-14 10:06 順其自然EVO 閱讀(256) | 評論 (0)編輯 收藏

    Java socket 服務和客戶端傳值

    packagesockerk;
    importjava.io.DataInputStream;
    importjava.io.IOException;
    importjava.net.Socket;
    importjava.net.UnknownHostException;
    publicclassSocketClient{
    publicstaticvoidmain(String[]args){
    Socketsocket=null;
    try{
    socket=newSocket("127.0.0.1",8888);
    DataInputStreamdis=newDataInputStream(socket.getInputStream());
    Stringstring="";
    while(!"end".equals(string)){
    string=dis.readUTF();
    System.out.println(string);
    }
    socket.close();
    }catch(UnknownHostExceptione){
    //TODOAuto-generatedcatchblock
    e.printStackTrace();
    }catch(IOExceptione){
    //TODOAuto-generatedcatchblock
    e.printStackTrace();
    }
    }
    }
      服務端
    packagesocket;
    importjava.io.BufferedReader;
    importjava.io.DataOutputStream;
    importjava.io.IOException;
    importjava.io.InputStreamReader;
    importjava.net.ServerSocket;
    importjava.net.Socket;
    publicclassSocketSingleServer{
    publicstaticvoidmain(String[]args)throwsIOException{
    ServerSocketserverSocket=null;
    Socketclient=null;
    try{
    serverSocket=newServerSocket(8888);
    client=serverSocket.accept();
    BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));
    DataOutputStreamdos=newDataOutputStream(client.getOutputStream());
    while(!client.isClosed()){
    Stringstr="";
    if((str=br.readLine())!=null){
    dos.writeUTF(str);
    dos.flush();
    }
    }
    }catch(IOExceptione){
    //TODOAuto-generatedcatchblock
    e.printStackTrace();
    }finally{
    client.close();
    }
    }
    }
      客服端

    posted @ 2014-05-13 16:26 順其自然EVO 閱讀(443) | 評論 (0)編輯 收藏

    Orcale 數據庫客戶端PL/SQL中文亂碼的問題

      配置一下環境變量即可:
      1.我的電腦--> 屬性---> 高級系統設置 --> 環境變量
      2.配置環境變量
      變量名:NLS_LANG
      變量值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
      這樣在PL/SQL 中就沒有亂碼了,也支持中文的查詢了。

    posted @ 2014-05-13 16:26 順其自然EVO 閱讀(166) | 評論 (0)編輯 收藏

    軟件測試過程管理——腦圖

      軟件測試過程管理,主要包括軟件測試是什么樣的過程,如何評價一個軟件測試過程,如何進行配置管理和測試風險分析以及測試成本的管理。

    posted @ 2014-05-13 16:25 順其自然EVO 閱讀(210) | 評論 (0)編輯 收藏

    LoadRunner監控tomcat的代碼

      最近想對tomcat的性能指標做監控,于是 想到loadrunner關聯函數的用法,于是做了本次嘗試,沒想到效果還不錯,所以拿出來供大家分享,通過本次測試發現,關聯的作用太強大了~
    Action()
    {
    double atof(const char *string);
    web_reg_save_param("JVM_FreeMemory",
    "LB=Free memory: ",
    "RB= MB",
    "Ord=1",
    LAST);
    web_reg_save_param("JVM_TotalMemory",
    "LB=Total memory: ",
    "RB= MB",
    "Ord=1",
    LAST);
    web_reg_save_param("JVM_MaxMemory",
    "LB=Max memory: ",
    "RB= MB",
    "Ord=1",
    LAST);
    web_reg_save_param("http_MaxThreads",
    "LB=Max threads: ",
    "RB= ",
    "Ord=1",
    LAST);
    web_reg_save_param("http_CurrentThreadCount",
    "LB=Current thread count: ",
    "RB= ",
    "Ord=1",
    LAST);
    web_reg_save_param("http_CurrentThreadBusy",
    "LB=Current thread busy: ",
    "RB= ",
    "Ord=1",
    LAST);
    web_reg_save_param("http_MaxProcessingTime",
    "LB=Max processing time: ",
    "RB= ms",
    "Ord=1",
    LAST);
    web_reg_save_param("http_ProcessingTime",
    "LB=Processing time: ",
    "RB= s",
    "Ord=1",
    LAST);
    web_reg_save_param("http_RequestCount",
    "LB=Request count: ",
    "RB= ",
    "Ord=1",
    LAST);
    web_reg_save_param("http_ErrorCount",
    "LB=Error count: ",
    "RB= ",
    "Ord=1",
    LAST);
    web_reg_save_param("http_BytesReceived",
    "LB=Bytes received: ",
    "RB= MB",
    "Ord=1",
    LAST);
    web_reg_save_param("http_BytesSent",
    "LB=Bytes sent: ",
    "RB= MB",
    "Ord=1",
    LAST);
    web_set_user("tomcat", "123","10.40.15.8:8080");
    lr_think_time(20);
    web_url("status",
    "URL=http://10.40.15.8:8080/manager/status",
    "Resource=0",
    "RecContentType=text/html",
    "Referer=",
    "Snapshot=t1.inf",
    "Mode=HTML",
    LAST);
    lr_user_data_point("Tomcat JVM FreeMemory", atof(lr_eval_string("{JVM_FreeMemory}")));
    lr_user_data_point("Tomcat JVM TotalMemory", atof(lr_eval_string("{JVM_TotalMemory}")));
    lr_user_data_point("Tomcat JVM MaxMemory", atof(lr_eval_string("{JVM_MaxMemory}")));
    lr_user_data_point("Tomcat http MaxThreads", atof(lr_eval_string("{http_MaxThreads}")));
    lr_user_data_point("Tomcat http CurrentThreadCount", atof(lr_eval_string("{http_CurrentThreadCount}")));
    lr_user_data_point("Tomcat http CurrentThreadBusy", atof(lr_eval_string("{http_CurrentThreadBusy}")));
    lr_user_data_point("Tomcat http MaxProcessingTime", atof(lr_eval_string("{http_MaxProcessingTime}")));
    lr_user_data_point("Tomcat http ProcessingTime", atof(lr_eval_string("{http_ProcessingTime}")));
    lr_user_data_point("Tomcat http RequestCount", atof(lr_eval_string("{http_RequestCount}")));
    lr_user_data_point("Tomcat http ErrorCount", atof(lr_eval_string("{http_ErrorCount}")));
    lr_user_data_point("Tomcat http BytesReceived", atof(lr_eval_string("{http_BytesReceived}")));
    lr_user_data_point("Tomcat http BytesSent", atof(lr_eval_string("{http_BytesSent}")));
    return 0;
    }

    posted @ 2014-05-13 16:24 順其自然EVO 閱讀(554) | 評論 (0)編輯 收藏

    Jmeter做web壓力測試時設置持續時間注意點

      頭一回使用jmeter做web壓力測試,遇到個很莫名其妙的問題,不管我的線程組怎么設置,它就是執行一次就結束了。
      設置循環次數為300,不使用調度器--〉執行一次就結束了,循環次數未生效
      設置循環次數永遠,設置高度器的開始和結束時間,不使用延遲和持續--〉開始時間有效,執行一次就結束了,結束時間未生效
      設置循環次數永遠,設置延遲1秒,持續1200秒--〉延遲1秒執行,執行一次就結束了,持續時間未生效
      不管我怎么設置,都是執行一次就結束了,也沒有錯誤發生,就是正常的結束
      jmeter版本2.9和2.11都一個德行的
      腳本是壓測web腳本,利用badboy錄制的,應該不會有問題,然后我就跟以前的腳本一個個比對,終于被我發現了!
      在step里還有個設置,需要勾選上永遠才行

    posted @ 2014-05-13 16:23 順其自然EVO 閱讀(761) | 評論 (0)編輯 收藏

    QTP校驗數據庫中數據后臺項目

     數據校驗功能后臺主要包括兩個類:QTPCommonServlet.java和QTPCommonDao.java
      其中QTPCommonServlet.java為:
    package com.runqianapp.qtp;
    import java.io.PrintWriter;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import com.runqianapp.qtp.QTPCommonDao;
    import com.geezn.exception.GeeznException;
    import com.runqianapp.common.log.GEZLoggerManager;
    import com.runqianapp.common.servlet.AbstractGezServlet;
    /**
    QTP數據檢查Servlet
    * @author RAQ
    *
    */
    public class QTPCommonServlet extends AbstractGezServlet {
    /**獲取表中所有數據*/
    private static final String GET_ALL_DATA = "getAllData";
    /**檢查刪除操作結果*/
    private static final String CHECK_DELETE_RESULT = "checkDeleteResult";
    /**
    * 重寫service()方法
    */
    public void service(HttpServletRequest request, HttpServletResponse response){
    response.setContentType("text/html");
    PrintWriter out = null;
    try {
    request.setCharacterEncoding("UTF-8");
    response.setCharacterEncoding("UTF-8");
    out = response.getWriter();
    } catch (Exception e) {
    GeeznException ge;
    if(e instanceof GeeznException){
    ge = (GeeznException) e;
    }else{
    ge = new GeeznException(QTPCommonDao.MODULE_QTP, GEZLoggerManager.LOGLEVEL_ERROR,"設置字符格式、獲取輸出對象時,發生錯誤", e, "{}");
    }
    out.print(ge.getErrorMessageJson());
    }
    String action = request.getParameter("action");
    if(GET_ALL_DATA.equals(action)){
    String sql = request.getParameter("sql");
    String sqlDateNumber = request.getParameter("sqlDateNumber");
    String allDatas = "";
    try {
    allDatas = QTPCommonDao.getAllDatas(sql,sqlDateNumber);
    } catch (GeeznException e) {
    GeeznException ge;
    if(e instanceof GeeznException){
    ge = (GeeznException) e;
    }else{
    ge = new GeeznException(QTPCommonDao.MODULE_QTP, GEZLoggerManager.LOGLEVEL_ERROR,"得到表中數據時,發生錯誤", e, "{}");
    }
    out.print(ge.getErrorMessageJson());
    }
    out.print(allDatas);
    }else if(CHECK_DELETE_RESULT.equals(action)){
    String sql = request.getParameter("sql");
    boolean deleteResult = false;
    try {
    deleteResult = QTPCommonDao.checkDeleteResult(sql);
    } catch (GeeznException e) {
    GeeznException ge;
    if(e instanceof GeeznException){
    ge = (GeeznException) e;
    }else{
    ge = new GeeznException(QTPCommonDao.MODULE_QTP, GEZLoggerManager.LOGLEVEL_ERROR,"檢查刪除動作結果時,發生錯誤", e, "{}");
    }
    out.print(ge.getErrorMessageJson());
    }
    out.print(deleteResult);
    }
    }
    }
     QTPCommonDao.java為:
    package com.runqianapp.qtp;
    import java.sql.*;
    import com.geezn.exception.GeeznException;
    import com.runqian.mis2.util.DBAccess;
    import com.runqianapp.common.log.GEZLoggerManager;
    /**
    * QTP通用數據庫操作類
    * @author RAQ
    *
    */
    public class QTPCommonDao {
    /**
    * 用于存儲表字段名稱,各字段名稱之間用“;”分隔
    */
    public static StringBuffer columns = new StringBuffer();
    /**
    * 用于存儲當前操作表名
    */
    public static String tableName = "";
    /**
    * 用于日志輸出,模塊標識
    */
    public static final String MODULE_QTP = "qtpModule";
    /***
    * 獲取表字段名稱及所有數據信息
    * @param sql 用戶輸入的查詢sql語句
    * @param sqlDateNumber 查詢數據條數(保留功能,目前暫不處理)
    * @return 表字段名稱及所有鏈接信息 如:"short_link;...;link_name||/link1,...,百度@_@{};/link2,...,谷歌@_@{}"
    *         表字段名稱與表數據之間用"||"分隔,各表字段名稱之間與各表數據之間用";"分隔,每條表數據內部用"#"和"@_@"分隔
    *         其中"#"用來分隔表字段數據,"@_@"用來分隔表字段數據與json字符串
    * @throws GeeznException
    */
    public static synchronized String getAllDatas(String sql, String sqlDateNumber)
    throws GeeznException {
    getTableName(sql);  //解析出表名
    PreparedStatement pstmt = null;
    DBAccess dba = null;
    ResultSet rs = null;
    StringBuffer allDatas = new StringBuffer();  //方法返回的字符串
    try {
    dba = new DBAccess();
    rs = dba.executeQuery(sql);
    ResultSetMetaData rsmd = rs.getMetaData();
    int columnCount = rsmd.getColumnCount();
    /** 每次請求處理之前,先對columns進行一次清空 */
    columns = columns.delete(0, columns.length());
    /** 在返回的字符串里添加表字段信息 */
    for (int i = 1; i <= columnCount; i++) {
    allDatas.append(rsmd.getColumnName(i)).append(";");
    columns.append(rsmd.getColumnName(i)).append(";");
    }
    allDatas.deleteCharAt(allDatas.length() - 1);
    columns.deleteCharAt(columns.length() - 1);
    String[] column = columns.toString().split(";");
    allDatas.append("||");
    /** 在返回的字符串里添加表數據信息 */
    while (rs.next()) {
    for (int i = 0; i < column.length; i++) {
    allDatas.append(rs.getString(column[i])).append("#");
    }
    allDatas.deleteCharAt(allDatas.length() - 1);
    allDatas.append("@_@");  //以"@_@"符號分隔前臺的數據字段信息和整條數據信息
    /**生成每條數據的json字符串*/
    allDatas.append("{");
    for (int i = 0; i < column.length; i++) {
    allDatas.append("\"").append(column[i]).append("\"")
    .append(":")
    .append("\"").append(rs.getString(column[i])).append("\"")
    .append(",");
    }
    allDatas.deleteCharAt(allDatas.length() - 1);
    allDatas.append("}");
    allDatas.append(";");
    }
    allDatas.deleteCharAt(allDatas.length() - 1);
    } catch(Exception e){
    throw new GeeznException(QTPCommonDao.MODULE_QTP, GEZLoggerManager.LOGLEVEL_ERROR,"根據傳入的sql獲取數據時,發生錯誤", e,"{}");
    } finally {
    close(dba, pstmt, rs);
    }
    return allDatas.toString();
    }
    /**
    * 從用戶輸入的sql語句中解析出表名并存入變量tableName中
    * @param sql 用戶輸入的sql語句
    */
    public static void getTableName(String sql){
    if (sql.contains("where") || sql.contains("WHERE")) {
    int start = 0;
    int end = 0;
    if (sql.contains("from")) {
    start = sql.indexOf("from");
    } else if (sql.contains("FROM")) {
    start = sql.indexOf("FROM");
    }
    if (sql.contains("where")) {
    end = sql.indexOf("where");
    } else if (sql.contains("WHERE")) {
    end = sql.indexOf("WHERE");
    }
    if (start == 0 || end == 0) {
    System.out.println("解析表名失敗");
    } else {
    tableName = sql.substring(start + 5, end);
    }
    } else {
    int start = 0;
    if (sql.contains("from")) {
    start = sql.indexOf("from");
    } else if (sql.contains("FROM")) {
    start = sql.indexOf("FROM");
    }
    if (start == 0) {
    System.out.println("解析表名失敗");
    } else {
    tableName = sql.substring(start + 5, sql.length());
    }
    }
    }
    /**
    * 判斷某條數據是否已被成功刪除方法
    * @param sql 查詢刪除數據的sql語句
    * @return  返回某條超鏈接是否已被成功刪除 true:已被刪除 false:沒有被刪除
    * @throws GeeznException
    */
    public static synchronized Boolean checkDeleteResult(String sql)throws GeeznException{
    boolean flag = true; //方法返回的字符串
    DBAccess dba = null;
    ResultSet rs = null;
    try{
    dba = new DBAccess();
    rs = dba.executeQuery(sql);
    while(rs.next()){
    flag = false;
    }
    }catch(Exception e){
    throw new GeeznException(QTPCommonDao.MODULE_QTP, GEZLoggerManager.LOGLEVEL_ERROR,"判斷某條數據是否已被成功刪除時,發生錯誤", e,"{}");
    }finally{
    close(dba, null, rs);
    }
    return flag;
    }
    /**關閉所有連接
    * @throws GeeznException
    */
    private static void close(DBAccess dba,Statement ps,ResultSet rs) throws GeeznException{
    try{
    if(rs!=null){
    rs.close();
    }
    if(ps!=null){
    ps.close();
    }
    if(dba!=null){
    dba.close();
    }
    }catch(Exception e){
    throw new GeeznException(QTPCommonDao.MODULE_QTP, GEZLoggerManager.LOGLEVEL_ERROR,"關閉所有連接時,發生錯誤", e,"{}");
    }
    }
    }

    posted @ 2014-05-13 16:22 順其自然EVO 閱讀(299) | 評論 (0)編輯 收藏

    僅列出標題
    共394頁: First 上一頁 113 114 115 116 117 118 119 120 121 下一頁 Last 
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統計

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 久久国产乱子伦精品免费一| 成年女人毛片免费观看97| 亚洲日韩区在线电影| 999国内精品永久免费视频| 精品亚洲福利一区二区| 国产aⅴ无码专区亚洲av麻豆 | 亚洲小说区图片区| 日韩在线天堂免费观看| 丝瓜app免费下载网址进入ios | 丝瓜app免费下载网址进入ios| 亚洲视频精品在线观看| 四虎1515hm免费国产| 99免费视频观看| 污污的视频在线免费观看| 亚洲色图在线观看| 亚洲福利中文字幕在线网址| 91麻豆最新在线人成免费观看| 一级特黄a免费大片| 国产精品亚洲专区在线观看| 亚洲精品无码少妇30P| 亚洲色中文字幕无码AV| 成人免费一区二区无码视频| 久久最新免费视频| 亚洲av无码有乱码在线观看| 亚洲国产成人久久精品影视| 亚洲成?Ⅴ人在线观看无码| 8x网站免费入口在线观看| 一级做α爱过程免费视频| 国产精品亚洲精品| 亚洲成熟xxxxx电影| 亚洲国产a级视频| 女人张腿给男人桶视频免费版| 久久精品私人影院免费看| 少妇亚洲免费精品| 亚洲欧美日韩国产精品一区| 亚洲尹人九九大色香蕉网站 | 久久精品亚洲中文字幕无码网站| 国产高清免费在线| 久久精品网站免费观看| 亚洲视频在线观看免费视频| 最近中文字幕大全免费版在线 |