程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Rational >> Rational Functional Tester的高效測試自動化技巧

Rational Functional Tester的高效測試自動化技巧

編輯:Rational

如果您經常使用測試自動化操作工具,那麼您可能對測試自動化框架的概念十分熟悉 。測試者們會經常尋找一些建議、參考,以及解決方案,但是框架只是您所需要考慮內容 的一半。如何構建您的測試代碼,使您所測試的應用軟件的測試過程最便利取決於有效自 動化操作的第二個步驟。

這篇文章重點強調第一個步驟,它可以幫助您理解如何有效地使用您所擁有的工具。 這個步驟包括以下幾個論題:

對象和屬性

使用浏覽器的常見問題

驗證點

低級的指令

腳本幫助器超類

對於每個論題,您可以在這篇文章末尾的參考資源中找到相關附加信息的連接。

注意:

作者是利用以下軟件來編寫這篇文章的:

IBM® Rational® Functional Tester Version 7.0.0

Microsoft® Internet Explorer® Version 6.0.2900.2180,SP2

Microsoft® Windows® XP Professional,SP2

查找對象及其屬性的替代方案

像對話框、命令按鈕,以及標簽這樣的組件都有相關聯的一些信息稱作屬性。這些屬 性都有自己的名稱和值。您經常需要接觸您所測試的對象的各種不同的屬性,這樣您可以 執行一些類型的驗證,或者您可以按照程序決定測試腳本下一步要做什麼。這個部分闡述 了對象,屬性,以及與您的腳本相吻合的方法。

查詢並設置對象屬性的值

您有沒有想過在運行時間將先前版本的值與當前的值動態地進行比較?或者您是否想 過將一個分支添加到您的基於包含於一個對象中的屬性當前值的 Rational Functional Tester 腳本中去? 您可以通過程序化地調用 getProperty 程序來重新獲取一個屬性的 值。

代碼列表 1 中的例子使用了 getProperty 程序來確定一個標簽是否包含一個成功消 息。如果包含,那麼就可以點擊 OK 按鈕。如果不包含,那麼就要點擊 Cancel按鈕。

列表 1:利用 getProperty 方法

if("SUCCESS".equals(dialog_htmlDialogStatic().
getProperty(".text")))
{
dialog_htmlDialogButtonOK().click();
}
else
{
dialog_htmlDialogButtonCancel().click();
}

如果您要算出一個對象有那些屬性,您可以打開 Test Object Map,可以在那裡查看 到可利用的屬性。(參見圖 1)

圖 1. 列在 Test Object Map 中的屬性

您還可以通過臨時記錄一個 Object Properties 驗證點(VP)或者通過 VP and Actions 向導插入這個指令來提取一個屬性值到一個變量中。

注意:

Rational Functional Tester 還支持一個 setProperty 方法。然而,那個方法卻有 一個放棄聲明:不要使用它除非您能確定這個結果。這是因為它調用了內部的方法,這種 方法可能干擾您測試的應用軟件的完整性。

現在您已經了解如何從您的對象中獲取屬性,但是您可能回有這樣的疑問:“我 如何才能優先找到這個對象呢?”這是一個很好的問題。

搜索 TestObjects 的方法

您的 Rational Functional Tester 腳本的基本構建塊到處都存在 TestObject 一個 TestObject 代表重新運行這個應用腳本與您正在測試的應用軟件之間的一個連接點。對 於產生測試腳本中的每個 TestObject,一個相應的對象存在於這個您所記錄的相應的應 用軟件中,並且這個對象同時也存在於 Test Object Map 中。

很可能的是,您通常會利用這個對象圖與 TestObject 產生相互作用。然而, Rational Functional Tester 還支持一個程序化尋找 TestObject 位置的方法。這種搜 索是基於一對代表 TestObject 或者您要查找的 TestObjects 屬性的名稱和值基礎上的 。這個搜索要麼是整體的要麼局限於一個父 TestObject 的子對象。

Rational Functional Tester 使用一個叫作 RootTestObject 的對象來代表正在被測 試軟件的整體視圖。

如果您想要搜索整個應用軟件,您可以調用這個 RootTestObject 上的查明程序。

如果您想要搜索一個特殊的對象,那麼您可以簡單地調用 TestObject 上的查明程序 。搜索一個特殊的 TestObject 將僅僅搜索 TestObject 的子對象。

Mark Nowacki 和 Lisa Nodwell 編寫了關於如何更好地理解並使用 TestObject.find 程序(參見 參考資源 中的第二個列表)。我已經向您們提供了我的代碼樣本這樣您可以 他們的代碼。他們做了大量的工作通過實際的例子來解釋和舉例說明這些原則。

處理對象中不明確的識別

有時,Rational Functional Tester 在重新執行的過程中不能區別兩個相似的對象。 當同一個應用軟件的兩個浏覽器或者圖例同時打開時,通常會發生這樣的情況。當兩個 Web 浏覽器都打開,Rational Functional Tester 將試圖通過利用一個錨來確定這個目 標對象,從而解決對象不明確的問題。既然您已經了解了如何使用查找程序,那麼您可以 通過利用一個 TestObject 參考來確定這個浏覽器和應用軟件實例。

在重新運行的過程中同時運行一個應用軟件的多個實例,將會導致命令目標的模糊不 清,比如 object() 或者 click()。要解決這個問題,當您調用 startApp 命令時可以使 用 ProcessTestObject。在列表 2的實例中,ProcessTestObject 功能就像一個錨來確定 您想要的應用軟件的位置。

列表 2: 利用 ProcessTestObject 來確定這個應用軟件的位置

ProcessTestObject pto1 = startApp("ApplicationOne");
ProcessTestObject pto2 = startApp("ApplicationTwo");
object(pto1, DEFAULT).click();

通過刪除測試對象的注冊表來清理內存

最後使用查找程序是刪除這個對象的注冊表。TestObject.find 會返回一個新的 TestObject 參考(有時稱作 范圍參考,已查找參考,或者 非影射參考)。這些參考將 保留對這個對象的訪問權直到您明確地表明“沒有注冊”它們,這意味著如果 您對它們使用不當將會導致一些錯誤。

Rational Functional Tester 不注冊范圍參考僅僅在整個重新運行結束以後,而不是 當腳本結束時。只要這個對象的范圍參考存在,Rational Functional Tester 就可能阻 礙應用軟件中對象的整個自由。例如,當您持有一個 Java™ 對象的范圍參考,這 個 Java 對象就不會看作是比較持久的需要,這樣就會被刪除。因此,一旦您不再需要它 們時就明確地清除您所創建的任何范圍參考的注冊表是很好的方法。

RationalTestScript 包含幾個您清除 TestObjects 參考的方法:

com.rational.test.ft.script

RationalTestScript.unregister

unregisterAll

警告:

當直接處理 TestObjects 時,利用它們可以在您的應用軟件中引起不穩定性。要盡快 清除您的 TestObjects 的注冊表。

處理使用浏覽器常見問題的方法

這裡有幾個您在測試 HTML 應用軟件時可能遇到的幾個常見問題,並說明了如何處理 的方法。

利用 .readystate 方法選定令人驚恐的行為

如果您的浏覽器或者浏覽器中的對象狀態不對,當您與它們發生相互影響時可以得到 一些令人驚恐的(奇怪的,不穩定的)行為--尤其是當您不使用助手程序而產生了大量 交互作用時。這就是為什麼檢查 Web 浏覽器或者一個對象的 readyState 是良好習慣的 原因。

Rational Functional Tester 中的 readyState 值

值 狀態 描述 0 uninitializedObject 對象未初始化數據 1 loadingObject 對象正在加載數據 2 loadedObject 對象已完成加載數據 3 interactiveUser 用戶可以與對象交互,即時對象還沒有被完全加載 4 completeObject 對象已被完全初始化

如果您知道您將要與一個大型表格/樹(文件目錄),或者 HTML 文檔發生交互作用, 那麼在開始交互作用之前檢查它們的狀態(列表 3)是非常好的做法。

列表 3. 檢查 readyState

while
 (Integer.parseInt(object.getProperty(".readyState").toString())
 < 4)
 {
 sleep(2);
 }

通過利用 waitForExistence 程序來提高測試執行

您可能也注意到,在您重新運行您的測試腳本時,當這個重新運行窗口等待第一個命 令運行時這個浏覽器仍然在啟動。這是因為新的浏覽器速度很慢,或許是額外條目的原因 ,比如標簽,現在需要加載。因此,當您打開一個浏覽器時使用 waitForExistence 程序 是很好的辦法。這樣做的方法之一是使用一個 Wait for Selected TestObject 驗證點:

記錄時,啟用這個應用軟件。

點擊 Recording 工具條上的 Insert Verification Point or Action Command 按鈕 。

在 Verification Point and Action Wizard 的 Select an Object 頁面上,點擊 Object Finder 圖表並拖到 HTML 頁面 (而不是浏覽器本身)。

點擊 Next。

在 Verification Point and Action Wizard 的 Select an Action 頁面上,點擊 Wait for Selected TestObject 選項。

如果需要,清除 Use the defaults 來更改 Maximum Wait Time 和 Check Interval 設置,它們事先分別調整為2分鐘和2秒。

點擊 Finish。

然而,您會發現在 startApp 命令之後添加這個調用程序會更簡單。您所要做的只是 參考 BrowserTestObject 並將這個調用程序添加到 waitForExistence 程序中。

處理意想不到的活動窗口

浏覽器的另一個常見問題(和一些 Java 應用軟件)是她眾多意想不到的活動窗口。 尤其當您的腳本在不同的機器上運行或者與不同的浏覽器和浏覽器配置一起運行時產生一 些意想不到的活動窗口是十分常見的。

可是 Rational Functional Tester Help 文件提供了一對很好的解決方案(一個簡易 的,一個並不那麼簡單)。一種解決方案是使用標准的 try-and-catch (列表 4),等 待消息的出現。如果沒有出現,那麼您可以繼續。

列表 4. 等待一個活動對話框

try
 {
 // Dialog_HtmlDialogButtonOK().waitForExistence(5,1);
 Dialog_HtmlDialogButtonOK().click();
 }
 catch(ObjectNotFoundException e)
 {
 }

提示:

如果您要等待一段精確數量的時間,您可以清除這個代碼的注釋行。

另一個有些棘手的解決方案,就是在一個 onObjectNotFound 特例中執行一個與此類 似的檢驗。通過將這個執行置於助手的上標,您可以為任何能夠擴展這個幫助器超類(此 後會有更多)的 Rational Functional Tester 腳本的事件進行操縱。

考慮並不很常見的驗證點

除了在記錄過程中有詳細說明的驗證點之外,您還可以將新的驗證點合並到 Rational Functional Tester 腳本中去(不僅僅可以使用 Insert at Cursor 命令)。腳本指南和 動態驗證點可以向您詳細說明與 Test Object Map 中不存在的對象進行對比的具體數據 。

手工驗證點

當您自己創建一個驗證點的數據並想將這個數據用來做比較時,手工驗證點是十分有 用的。例如,這個數據可能是一次計算的結果或者可能來源於外界,比如一個電子數據表 ,數據池,數據庫,或者自定義的計算。

手工驗證點是通過使用列表 5中的 vpManual 方法來構建的。

列表 5. 使用 vpManual 方法

vpManual
 ("ManualVP_01", "Check something manually.").performTest();
 // or
 vpManual
 ("ManualVP_01", "Check something manually.",
 "Check something manually.").performTest();

起初這個手工的驗證點是有效的,如果這個驗證點對象不存在,那麼這個被傳遞的值 將會變成基線值(稍後您可以在 Rational Functional Tester 中看到並對它進行編輯, 正如任何其它驗證點一樣)。您的日志文件顯示:創建驗證點基線。

從這個點向前,對這個驗證點任何後起的 vpManual 調用,都要將實際點與這個點做 對比。如列表 5所示,您還可以通過傳遞基線和實際結果來調用 vpManual。在這種情況 下,Rational Functional Tester 中的驗證點將被忽視。

動態驗證點

有些時候 ,您需要在您的對象圖上沒有的測試對象上執行驗證點。要達到這一目的, 您可以通過利用 vpDynamic 方法(列表 6)來使用動態驗證點。在下一次這個腳本被重 新運行時動態驗證點就會激活適當的用戶界面。您可以根據腳本詳細指定的對象插入一個 測試過的驗證點。這樣就避免了在記錄這個驗證點之前手工運行測試到適當的狀態。

如果您只是傳遞了這個驗證點的名稱,那麼 Recording Verification Point and Action 向導就會在下次腳本被重新運行時激活。利用這個向導,您就可以為以後測試對 比的運行詳細指定 TestObject 和數據。

列表 6. 使用 vpDynamic 方法

vpDynamic
 ("DynamicVP_01").performTest();
 // or
 vpDynamic
 ("DynamicVP_01", TestObjectHere()).performTest();

警告:

列表 6中顯示的第二個例子要求您傳遞實際的 TestObject。盡管這個具體的 TestObject 並不一定要來自 Test Object Map,但是它必須是與有意義的結果一致的同 一個對象。此外,如果您使用的是查找方法 TestObjects,一定要仔細。

使用這些方法一個常見的問題是忽略了 performTest 方法。盡管這是允許的方法且在 編譯的時候沒有任何警告,但是在腳本運行的時候沒有任何引人注意的行為發生。

關於使用低級命令的詳細資料

低級的回放仿效了用戶執行的精確鼠標的動作和鍵盤的行為。這個回放還為特定的用 戶行為考慮了更多控制,比如繪制程序,PDA 仿真器,以及其它非傳統的對象順應工具, 而不像簡單的 點擊 和 輸入 命令。

例如,假如您正在測試一個圖 2中顯示的 VTech Helio Emulator 中的手寫識別。

圖 2: VTech Helio Emulator

傳統的 Rational Functional Tester 腳本對於類似於 Helio Emulator 的應用軟件 無能為力。事實上,正如我在先前關於利用 IBM® Rational® Robot 的低級腳本 的文章中所提到的(參見參考資源),關於您對類似於這樣的應用軟件設置的唯一選項是 低級的記錄。通過進入低級,您可以回放一個鼠標點擊分解動作。

RootTestObject 類包括兩個低級的方法:

emitLowLevelEvent(LowLevelEvent)

emitLowEvent(LowLevelEvent[])

制造商關於 LowLevelEvents 構建的 SubitemFactory 方法包括以下幾種:

delay(int) 注意:按毫秒計

keyDown(string)

keyUp(string)

mouseMove(point)

mouseWheel(int)

leftMouseButtonDown()

leftMouseButtonUp()

rightMouseButtonDown()

rightMouseButtonUp()

middleMouseButtonDown()

middleMouseButtonUp()

列表 7中的腳本代碼為 Microsoft® Paint® 中的 Helio 使用筆跡識別。

列表 7. 在 Rational Functional Tester 中使用低級的腳本

afx10000008window().click(atPoint(100,100));
 LowLevelEvent llEvents[] = new LowLevelEvent[7];
 llEvents[0] = mouseMove(atPoint(100,100));
 llEvents[1] = leftMouseButtonDown();
 llEvents[2] = delay(250);
 llEvents[3] = mouseMove(atPoint(105,120));
 llEvents[4] = delay(250);
 llEvents[5] = mouseMove(atPoint(110,100));
 llEvents[6] = leftMouseButtonUp();
 getRootTestObject().emitLowLevelEvent(llEvents);

列表 7 中的代碼在版面上產生一個字母 V,如圖 3 所示。

圖 3:在 Microsoft Paint 中使用 Helio Emulator

這種巨大能力的缺點是什麼呢?就我所知,不像 Rational Robot 一樣,您需要手工 編寫所有的代碼。我不清楚在 Rational Functional Tester 中啟用一個低級記錄器的方 法。但是這樣也好。如果您正在測試類似 Helio 的腳本,您無論如何要創建可重復使用 的方法來編寫字母。因此,大多數情況下,您需要一次就可以將它們描繪出來。

無論怎樣,這是一個需要記住的很好的特性,因為在記錄的時候您可能有幾次並不能 准確地獲得 click-drag-type 組合。在那些情況下,有時低級的回放就可以得到答案。

怎樣利用腳本幫助器超類加強您的腳本

如果您必須閱讀 Dennis Schultz 編寫的 "Creating a super helper class in IBM Rational Functional Tester," ,現在就開始進入 參考資源來進行。那篇文 章是我見過的關於理解超類如何運行的最好的資源。助手類允許您將功能添加到您的測試 腳本中。

默認情況下,所有的 Rational Functional Tester 腳本都會擴展 RationalTestScript 類,因此可以繼承眾多的方法(象 callScript)。高級測試者們可 能更喜歡創建他們自己的幫助器超類來擴展 RationalTestScript ,並添加方法或者從 RationalTestScript 重寫並覆蓋這些方法。

無論何時您要在您的項目中創建或者記錄一個腳本,您都可以詳細指定 Rational Functional Tester 將使用的幫助器超類。這個默認的超類在功能測試的 項目屬性 頁面 上有詳細說明。您可以在功能測試的 腳本屬性 頁面詳細說明單個腳本的幫助器超類。當 創建完一個腳本以後,它保留著默認超類的參考,就好象是它自己的助手參考一樣。

在多個腳本之間共享功能時,助手超類十分有用。一個超級助手將會為您提供一個獨 立的空間放置您想要每個腳本訪問的代碼。您放置的每個代碼都會被擴展您的超級助手的 助手類所繼承。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved