LDTP幫助文件翻譯版

Just4life發表於2013-08-21
LDTP安裝:
• 原始碼形式ldtp軟體安裝
 
  下載   $gitclone git://anongit.freedesktop.org/git/ldtp/ldtp.git
  安裝   $./autogen.sh --prefix=/usr;make,然後su登入root使用者  $make install

• 二進位制形式ldtp
  下載  http://download.opensuse.org/repositories/home:/anagappan/Fedora_10/i386/
   安裝   $rpm -i<包的名稱>

下載LDPT幫助文件: LDTP Tutorial PDF/ODF

LDTP的結構和原理

LDTP整體結構圖
LDTP幫助文件翻譯版
      測試指令碼       LDTP客戶端      LDTP引擎      AT-SPI Layer   Application under test


LDTP內部構造:

LDTP的客戶端通過LDTP命令轉換協議(LDTPCTP)和LDTP引擎互動。現階段我們是用嵌入python語言實現的LDTP命令轉換協議,將來可能還會有基於mono/java/perl版本的。客戶端和服務端的互動是以XML形式進行的。

大多數的LDTP命令需要兩個引數,第一個是將要操作什麼樣的視窗,第二個是在設定的視窗裡將要操作的物件
例如:click ('*-gedit', 'btnNew')
這個click操作將在一個開啟了*-gedit (regexp)的視窗中進行,視窗中有一個名為“New”的物件,其型別為“pushbutton”

LDTP幫助文件翻譯版

服務端:

當一個測試指令碼開始執行時,LDTP客戶端將會使用AF_UNIX / AF_INET建立一個與LDTP引擎的連線

客戶端處理器:
一旦來自指令碼的命令被執行,客戶端就會構建XML資料併傳送到服務端。LDTP引擎解析從客戶端發來的請求,呼叫相應的組建處理器

元件處理器:
每個元件處理器通過AT-SPI倉庫與各自相關的應用程式通訊,它們會根據執行的情況,返回成功或失敗(以XML格式)給客戶端。在某些情況下,元件處理器會將索求的資料返回給客戶端,這取決於客戶端發出的是何種請求,比如:gettextvalue

事件處理器:
為了處理一些意外出現的視窗,比如連線超時的重置視窗,可以通過事件處理器為這樣的視窗指定一個召回函式。只要這個被登記的視窗出現了,就算是處於非意外的情況下,相應的召回函式都會被呼叫。

記錄器:
記錄執行的狀態(採取XML格式)

LDTP的慣用表達規則

Appmap[ApplicationMap]以文字的方式表述被測試的圖形使用者介面。所有的UI操作,即按鈕、文字框等,都按照Appmap已經設定好的規則來表述,並附加上它們的父UI物件的資訊。執行時,我們就可以通過Appmap來獲取特定的UI操作。
Appmap預設規則列表見LDPT的pdf幫助文件的第11~13頁

如何從指令碼獲取UI物件

兩個要素:視窗名稱物件名稱

視窗名稱

> 視窗的不同型別:
1. Frame (frm)
2. Dialog (dlg)
3. Alert (dlg)
4. Font Chooser (dlg)
5. File Chooser (dlg)
6. Window (這種型別的視窗一般沒有相關標題,所以我們需要通過索引 -dlg來表述它 )

> 表示式:
視窗標題可以用表示式的形式,以*和?號來取代一定的字元,如*-gedit'表示標題以-gedit結尾的視窗

> 表述視窗名稱的不同方式:
1.視窗型別和視窗標題(如:'frmUnsavedDocument1-gedit')
2.視窗標題(如:'Unsaved Document 1 - gedit')
3.視窗型別,視窗標題表示式 (如: 'frm*-gedit',或'frmUnsavedDocument1*')
4.視窗標題表示式 (如: '*-gedit')
5.視窗型別,視窗標題和索引(如:若有兩個標題相同的視窗,一個為'dlgAppoinment',另一個則為'dlgAppoinment1')
6.視窗型別和索引(如:'dlg0',僅在視窗沒有任何可用標題的情況下)

> 視窗名稱的格式:
視窗標籤裡出現空格或轉行字元會被過濾,例如
1.'Unsaved Document 1 – gedit', 將被轉換成'UnsavedDocument1-gedit'
2. 'Unsaved Document 1
    -
   gedit', 將被轉換成'UnsavedDocument1-gedit'

物件名稱

1>.對於menu / menu item / push button /toggle按鈕類,一般來說,我們通過它們的標籤來獲取,如:
mnuFile (gedit menu)
mnuNew (gedit menu item)
btnNew (gedit tool bar, push button)
tbtnLocation (gedit Open File dialog, toggle bar control)

2>.對於text / tables/ check box / radio button / spin button /combo文字框類,一般來說,我們只能通過它們的相關標籤來獲取,如:
txtLocation (gedit Open File dialog, text control)
tblFiles (gedit Open File dialog, table control)
cboSearchfor (gedit Find dialog, combo box control)
chkMatchcase (gedit Find dialog, check box control)
sbtnRightmarginatcolumn (gedit Preferences dialog, spin buttoncontrol)

3>.而對於既沒有標籤又沒有相關標籤的物件,我們通過索引來獲取,如:
txt0 (gedit text rendering region)
ptl0 (gedit Preferences dialog, page tab list control)
ptl0 (In gedit when more than one files are opened, a page tab listcontrol will be available)

4>.對於在一個視窗中多次出現的物件,我們可以在它們的名稱里加上索引來獲取,如:
btnAdd – First push button control with label Add
btnAdd1 – Second push button control with label Add
btnAdd2 – Third push button control with label Add

物件名稱的格式
物件名稱裡出現的空格、點、冒號、下劃線以及轉行字元會被過濾,例如:
 Search for:' 將被表述成 'Searchfor'
'File name 'a_txt' already exist.
Replace' 將被表述成 'Filename'atxt'alreadyexistReplace'.

AT-SPI(accessibilitylibraries)
我們需要啟用gnome控制中心下的輔助技術(AssistiveTechnology),通過它我們可以得到應用程式的資訊和狀態。

匯入LDTP模組
  from ldtp import *
  from ldtputils import *
我們以如上的方式而不是以'importldtp'匯入的原因在於,這樣我們就能直接使用ldtp功能的名稱來呼叫它們,不然我們就得這樣呼叫-ldtp.<fuction name> 。
示例 1:
    from ldtp import *
    selectmenuitem ('*-gedit', 'mnuFile;mnuNew')
示例 2:
    import ldtp
    ldtp.selectmenuitem ('*-gedit', 'mnuFile;mnuNew')

呼叫函式執行操作:

為了選中一個選單,我們需要使用selectmenuitem命令,例如,使用如下的命令選中gedit的開啟選單:
selectmenuitem ('frmUnsavedDocument1-gedit','mnuFile;mnuOpen')

此命令會彈出一個新的對話方塊,這時你可以通過guiexist (驗證視窗存在否)或 waittillguiexist(預設設定為等候30秒來確認視窗的存在與否)來判定此視窗是否是被開啟的

如果想要獲取視窗中一個按鈕,我們需要使用click命令

如果我們修改了一個用gedit開啟的檔案,此檔案的標題也將會被改變。為了繼續控制視窗,我們可以使用setcontext 命令,不再需要時使用 releasecontext

編輯開啟的檔案使用:
• settextvalue ('frmUnsavedDocument1-gedit', 'txt0', 'Testingediting')

之前標題是 'Unsaved Document 1 - gedit' ,經過settextvalue後,標題將會變成'*Unsaved Document 1 - gedit'。如果我們還是想延用以前的視窗名稱 ,使用:
• setcontext ('Unsaved Document 1 - gedit', '*Unsaved Document 1 -gedit')
這樣的話我們就能繼續使用同樣的視窗名稱,例如:
• selectmenuitem ('frmUnsavedDocument1-gedit','mnuFile;mnuSaveAs')
這個命令將會啟用一個儲存檔案的對話方塊

LDTP的應用程式介面
已實現的LDTP API列表

LDTP具體操作示例見操作手冊第18~36頁

召回事件處理
當一個給定標題的視窗被建立時,我們可以給它指定一個召回事件。這樣我們可以很簡地處理掉意外出現的視窗,幫助手冊第37頁有一個很詳細的例子

資料xml檔案

xml檔案儲存了指令碼在執行時要求的輸入資料。

使用LDTP資料XML的優點
• 分離指令碼和資料,實現複用
• 只需編寫指令碼一次,根據需求構造資料XML
• 某些迴歸測試我們只需要一個指令碼和多個資料XML檔案
• 選擇XML格式的原因在於它很容易被解析

資料XML的標籤
• data -完整的XML是被包裹在<data>和</data>標籤裡的
•<使用者定義的標籤>-使用者定義的標籤可以出現多次,伴有使用者定義的取值。如果使用LDTP工具XML解析器,使用者定義標籤的取值將會以列表的形式返回,我們可以以索引來使用它。列表的索引從0開始

語法
LdtpDataFileParser('[XML Filename]')
LdtpDataFileParser類以XML的檔名為可選引數,它還提供了兩個函式
● * setfilename ('[XML Filename]').如果LdtpDataFileParser類沒有帶引數,那麼應該呼叫這個函式
● * gettagvalue ('tag name'). 取得提供的標籤的值
例子:
Example 1
     addr_book = LdtpDataFileParser ()
     addr_book.setfilename ('evolution-ab.xml')
     addr_book.gettagvalue ('AddressbookType')
Example 2
     addr_book = LdtpDataFileParser ('evolution-ab.xml')
     addr_book.gettagvalue ('AddressbookType')

XML檔案的例子:
<data>
  <AddressbookType>On ThisComputer<AddressbookType>
  <AddressbookName>LDTP-AB</AddressbookName>
</data>

ldtprunnerXML檔案

ldtprunnerXML檔案的作用是通過把相關的指令碼和對應的資料xml檔案納入一個集合,一次執行。如果其中的一個測試指令碼失敗了,則餘下的指令碼將不再執行。

使用LDTP資料XML的優點
• 相關測試指令碼置於同一個目錄下
• 在一個組裡,當下在執行的指令碼失敗後,剩下未執行的指令碼將會被跳過,ldtprunner將會執行下一個組
• 每個指令碼可以把可選的data XML檔案當作引數
• 同一個指令碼對應不同data XML檔案可以執行多次
• 指令碼可以以任何順序組合,指令碼按照此順序執行

ldtprunner的標籤 (#表示為可選項)
• ldtp -完整的XML是被包裹在<ldtp>和</ldtp>標籤裡的
• logfileoverwrite# - 取值0(新增到已有的日誌檔案)或1(覆蓋重寫)
• logfile - 檔名,即日誌檔案將寫入何處。日誌檔案是以XML格式生成的。最好輸入檔案的絕對路徑。
• appmapfile# - 可選的檔名對映。此標籤只對向後相容的可用,不推薦使用 ???
• category# - 一個目錄可以包含一個或多個組。同一目錄下所有組的成員都會按一順序執行。
• group -一個組可以包含一個或多個指令碼。組裡所有指令碼將會按某一順序執行。分組的目的是為了當一個指令碼執行失敗時,整個組可以跳過。
• testcaseid - 一個組有一個testcase id。如果可以,此id會作為日誌檔案的一部分被記錄下來
• comment - 指令碼的註釋,不會被日誌檔案記錄
• script - 指令碼包含一個指令碼檔名和可選的資料檔名
         • name - 指令碼檔名
         • data# - 資料檔名(資料檔案的內容為xml格式)
以下為生成ldtprunner XML時的建議
•  選擇用ldtprunner XML初始化的日誌檔案
•  選擇日誌檔案重寫選項

ldtprunner XML 檔案的例子:見幫助手冊第41~42頁

如何執行LDTP指令碼

確認在你當下的工作目錄裡有如下檔案:
   •  可執行的測試指令碼
   •  data XML - 可選
   •  ldtprunner XML - 可選
   • 確認ldtp,ldtprunner,ltfx(可選),digwin(可選),ldtprecord(可選)已安裝

呼叫 ldtprunner XML
    $ ldtprunner<ldtprunner XML>
   Example
       ldtprunner test-runner.xml

呼叫python指令碼
    $ python<script file name.py>
   Example
      python gedit.py

相關文章