程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Rational >> 正則表達式在 Rational Function Tester 中的應用概述

正則表達式在 Rational Function Tester 中的應用概述

編輯:Rational

概述

正則表達式是一種由普通的字符及特殊字符組成的文字模式,用以描述在查找文字主體時待匹配的一個或 多個字符串。雖然正則表達式是一個很龐雜的體系,但在自動化腳本中只要引用一些簡單的語法,就可以在控 件識別時起到事半功倍的效果。在自動化測試過程中使用正則表達式可以減少開發的費用,並且有助於維護自 動化腳本。這篇文章首先總結了正則表達式常用規則及實例;接著分析了 RFT 中兩種正則表達式類 RegularRexpression 和 Regex 的區別;最後列出了正則表達式在 RFT 中常見的應用實例。以幫助 Rational Function Test 的初學者更好的理解正則表達式,以便快速在自己的測試項目中運用,使得自動化腳本更加靈 活和易於維護,節約開發成本。

正則表達式常用規則概述

熟練掌握和理解正則表達式的規則是使用正則表達式的基礎和前提條件,下面總結了常用正則表達式的規 則和簡單的例子。

一些不便書寫的字符和一些有特殊意義的字符,需要在其前面加上"\"

抽象意義的符號本身不匹配任何字 符,它要求匹配的位置。

RegularExpression 和 Regex 的區別

RFT 實際上有兩個類庫包來處理正則表達式,即 Regex 和 RegularExpression。

Regex 是一種高 效和輕量級的正則表達式引擎,它主要用來執行模式匹配和文本解析。除了匹配復雜的字符串和模式外, Regex 還可以進行快速模式提取,查找等。例如在國際化產品的測試中,需要對大量的 XML 格式的翻譯文本 數據進行查找和替換,這時候就需要使用 Regex。

RegularExpression 類簡單封裝了正則表達式模式 規范,主要用於描述數據,原始值被保存。通常和 RFT 中的一些方法進行交互,比如 RFT 中 TestObject's find() 和驗證點經常使用這種方式進行模式識別。如 Lotus Notes 在 9.0 的發布中改名 為 IBM Notes 9,如果想使得已有的腳本既能運行在新版本上,也能運行在原有的版本上如 Lotus Notes 8.5.3(比如測試升級的時候需要先安裝舊版本)。我們可以用正則表達式 "IBM Notes \d+(\.\d+)? (\.\d)+ ||Lotus Notes \d+(\.\d+)?(\.\d)+" 統一表示產品名,如清單 1 所示。

清單 1. RegularExpression 在 find 中的應用

RegularExpression sText = 

new RegularExpression
("IBM Notes \d+(\.\d+)?(\.\d)+ || Lotus Notes \d+(\.\d+)?(\.\d) +", true)
win = root.find(SubitemFactory.atChild(".processName", "NLNOTES.EXE", ".text", sText));

正則表達式在 RFT 中的應用實例

在 RFT 中可以將識別屬性替換為正則表達式或數字范圍以允許基於模式的識別。該模式允許在對象識別方 面有更大靈活性。可以從驗證點編輯器或對象圖內將屬性轉換為正則表達式和數字范圍。正則表達式在 RFT 中的常用情況有:

1. 對象動態屬性的表示

很多應用程序的圖形化用戶界面是用工具產生的, 這樣簡化了開發的工作和成本。但是應用程序在運行時產生用戶界面上的對象,可能存在的問題是同一對象在 每次運行時會獲取到不同的屬性,從而降低了自動化腳本的可維護性和穩定性。Rational Function Tester 利用正則表達式來此種動態屬性進行參數化,這樣就可以很好的避免動態屬性變化導致對象無法識別的問題。

2. 動態對象的驗證

比如在測試 IBM Notes 的過程中,收件箱中的未讀郵件是變化的,有時候 是 Inbox,有時候是 Inbox(2),Inbox(15) 等等,我們不能用一個固定的數字來表示收件箱。因此我們就 可以通過正則表達式 Inbox(\(\d{1,}\))? 來表示。

3. 文本的動態查找和替換

比如在測試過程,有時候需要檢測某個界面是否包含一些特定的信息, 比如版本信息,這時候就用到正則表達式去搜索。

下面結合了自己的項目,列舉了在使用 FRT 過程中 ,正則表達式的一些具體應用實例。

1. 正則表達式在 find 中的應用

find 方法可以實現在運行時,動態地在被測應用程序(application under test,AUT)中定位 TestObject,通過使用它,您可以避免不得不記錄動作以向對象地圖(Object Map)中添加 TestObject 對象 。在 RFT 中,被映射的對象使用被存儲的、靜態的、識別屬性和對象層次來驗證回放過程中腳本是否使用了 正確的控件。但是被測應用程序在不同的版本中,對象的屬性會有一些細微差別,尤其對一些動態屬性,更新 屬性是相當費時的。

RFT 測試腳本可以使用基於模式的對象識別,這允許更大的靈活性。正則表達式 的使用可以忽略被測應用新版本發布中引入的細微差別,而不需要經常根據版本不同頻繁更新已經存在的功能 測試腳本。使 TestObject.find() 方法可以接收一個正則表達式作為輸入參數,從而更加有效查找目標對象 。在圖 1 中,這個 button 的 id 是動態的 , 有時候是"view:_id1:dynamicContent:button1"; 有時候是"view:_id2:dynamicContent:button2",如果每次執行前都去檢查和修改腳本,這是相當 費時的。id 屬性可以設置成一個正則表達式參數 view:_id\\d:dynamicContent:button\\d ,如清單 2 所示 。

圖 1. 屬性中包含動態參數

清單 2. 正則表達式表示 動態屬性

RegularExpression idRex = new RegularExpression 

("view:_id\\d:dynamicContent:button\\d",
                                                  true);
TestObject[] tos = RationalTestScript.getRootTestObject().find(
     SubitemFactory.atDescendant(".type", "button",".id", idRex));

2. 正則表達式在測試對 象圖(Test Object Map)中的應用

當我們記錄腳本時,RFT 會為被測的應用程序自動創建測試對象地圖 (Test Object Map),RFT 用測 試對象地圖來管理測試腳本的測試對象。對象地圖中包含了對每個對象的識別屬性。當我們在對象地圖中更新 記錄信息時,任何使用了該對象地圖的腳本會共享更新的信息,減少了維護的成本及整個腳本開發的復雜度。

在我們錄制腳本的時候,有些對象的屬性包含一些變化的參數,如圖 2 中,登錄框的標題包含服務器 的 IP,但是當我們登錄不同的服務器,這個 IP 是變化的,我們可以使用正則表達式來代替變化的 IP 值, 允許基於模式的識別,這樣使得腳本具有更好的靈活性。圖 2. 正則表達式在對象地圖中的應用

圖 2. 對話框的標題中含有動態變量

圖 3. 將動態變量轉換成 正則表達式

右鍵單擊包含動態變量 的屬性值,選擇"Convert Value to Regular Expression", 在彈出的'正則表達式評估器 '中輸入匹配的模式,如圖 2 中的模式為 \d+(\.\d+){3}. 輸入完可以通過"Evaluate"進行 測試所輸入的內容是否匹配正則表達式。

圖 4. Regular Expression Evaluator 的使用

3. 正則表達式 在驗證點編輯器中的應用

使用 RFT 進行功能測試的過程中,測試結果往往是通過插入驗證點(Verfication Point)來完成的 ,RFT 中的驗證點有屬性驗證點,數據驗證點和圖像驗證點。

圖 5 是 RFT 自帶 ClassicsCD 中的一 個界面,我們想驗證總價格的顯示格式是否正確,總價格是不斷變化的,如果我們用固定數值 $18.95 來驗證 ,當我們測試不同的數據時,腳本一定會失敗。於是我們將值轉換為正則表達式 "^\$\d+(\.\d+)? ",這樣就可以更加靈活的匹配不同的數據。同時我們可以用正則表達式計算器來檢驗我們輸入的模式是 否正確。這節省下了不得不運行腳本觀察模式是否工作的時間。

圖 5. 正則表達式在驗證點編輯器中的應用

4. 正則表達式獲取動態對象

在實際測試過程中我們有時候需要獲取界面上的一下動態對象,就是這個對象是不確定的,因此我們 可以用正則表達式進行模式匹配。圖 6 是獲取 developerWorks 上的搜索結果的例子,我們可以用模式 "of ([0-9]+)(,?)([0-9]+)" 表示搜索總數目的模式,然後利用 Regex getMatch 方法獲取匹配結果。

圖 6. 獲取搜索結果

清單 3. 利用正則表達式取得動態結果

public String GetPageNum(String 

sMatch){
 Regex sPattern = new Regex("of ([0-9]+)(,?)([0-9]+)");
 if(sPattern.matches(sMatch)){
 String sMatch0 = sPattern.getMatch(0);
 System.out.println(sMatch0);
 String s[] = sMatch0.split(" ");
 System.out.println("Total searched page number is: " + s[1]);
 return s[1];
 }else
 System.out.println("There is no match");
 return null;
 }
 }
String sMatch = "1-20 of 5,800 results";
String msg = new regex().GetPageNum(sMatch);
JOptionPane.showMessageDialog(null,"Total searched page number is: "+msg);

圖 7. 獲取搜索結果

5. Pattern 和 Matcher 在 RFT 中的應用

在頻繁使用正則表達式的場合,可以用 Pattern 的 complier 方法對字符串進行剖析,驗證,確定正則表 達式語法無誤,再對字符串進行匹配和比較,這樣有助於提高效率。

在執行 RFT 測試用例的時候,有 時候我們需要將本文格式的測試結果(如圖 7 所示)寫到 html 文件中,這樣便於查看結果。圖 8 是文本格 式的 RFT 測試結果(summary.txt),圖 8 是轉換後的 html 格式的測試結果,很明顯圖 9 的顯示非常直觀 。這樣的轉換在執行每個 case 的時候都要進行操作,因此屬於比較頻繁的使用,我們就用 Compiler 和 pattern 來進行匹配。

圖 8. 文本格式的測試結果

清單 4. 代 碼示例(將測試結果寫到 HTML 表格中的每行)

File file = new File(filename);
FileReader in = new FileReader(file);
char c[] = new char[(int) file.length()];
in.read(c);
String fileContentsString = new String(c);
in.close();
Pattern p1 = Pattern.compile(".*<tr.*>TESTCASE RESULT:s*
(w.*? )s*:s*([A-Zs]+?)<.*/tr>.*", Pattern.DOTALL) ;
               
String resultclass = "";
String result = "";
String name = "";                      
Matcher m1 = p1.matcher(fileContentsString);
while(m1.find()){
name = m1.group(1);
result = m1.group(2);
if(result.equals(sEXCEPTION)){
    resultclass = "exception";
}else{
    resultclass = result.toLowerCase();
}
}

代碼中的 group 是指裡用括號括起來的,能被後面的表達式調用的正則表達式。group 0 表示整 個表達式,group 1 表示第一個被括起來的 group,以此類推。所以; A(B(C))D 裡面有三個 group:group 0 是 ABCD, group 1 是 BC,group 2 是 C。

圖 9. HTML 格式的測試結果

在這個例子中,result 為"PASSED", name 為 "testcases_gvt.teamroomxl.teamrm1"。

總結

在自動化測試過程中使用正則表達式減少了由於不確定性修改腳本的次數,增強了腳本的穩定性和可維護 性。這篇文章結合了自己的項目,總結了使用 RFT 進行自動化測試過程使用正則表達式的實例,幫助 RFT 初 學者快速掌握正則表達式的使用。希望本文能夠起到探路石的作用,幫助更多的使用 RFT 進行自動化腳本開 發人員在自動化測試這條道路上走的更輕松。

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