1. 程式人生 > >Robot Framework - 入門與操作(3)

Robot Framework - 入門與操作(3)

活動 == 一個 情況下 簡要概述 動態測試 錯誤 們的 mod

08- 創建測試庫--發布測試庫

***** 測試庫文檔

為了便於維護,測試庫文檔應該從源代碼中生成。 Robot Framework 有自己的文檔工具 libdoc.py生成 API 文檔。 一個關鍵字文檔的第一行通常應該包括該關鍵字的簡要概述。 這行內容會被 libdoc.py 當作關鍵字的 tool tip,也會被顯示到測試日誌中。 Robot Framework User Guide : Library documentation tool (libdoc) 舉例: python -m robot.libdoc LibraryExampleD LibraryExampleD.html

***** 對測試庫進行測試

單元測試方法:Python 有很好的單元測試工具(unittest /…),非常適合用來驗證測試庫。 驗收測試方法:使用 Robot Framework 本身來驗證測試庫。 BuiltIn 測試庫中有很多有用的關鍵字可以達到這個目的。 一個特別值得註意的是 Run Keyword And Expect Error 關鍵字,它能夠驗證關鍵字是否如預期地報告了錯誤。 使用單元測試方法還是驗收測試方法取決與具體情況。

***** 打包測試庫

簡單的庫(只有一個文件),讓用戶拷貝到任意位置,並設置到測試庫搜索路徑就可以了。 較為復雜的庫則應該打包,以使安裝更加容易。 對於 Python 來說,打包工具就是 Python 標準庫中的 distutils,或者新的 setuptools。 打包工具的好處是測試庫會被自動的安裝到測試庫搜索路徑中。

***** 不推薦的關鍵字

將*DEPRECATED*添加到關鍵字文檔的開始處,該關鍵字就變成不推薦的(deprecated)。 當這種關鍵字被執行的時候,警告信息將會輸出到控制臺和單獨的測試日誌文件中。

示例: LibraryExampleD.py

# -*- coding: utf-8 -*-
###發布測試庫
class LibraryExampleD():
#測試庫文檔
    """This is an example library with some documentation."""
    def keyword_with_short_documentation(self, argument):
        """This keyword has only a short documentation"""
        pass
    def keyword_with_longer_documentation(self):
        """First line of the documentation is here.
        Longer documentation continues here and it can contain
        multiple lines or paragraphs.
        """
        pass
#不推薦的關鍵字
    def example_keyword(argument):
        """*DEPRECATED* Use keyword `Other Keyword` instead.
        This keyword does something to given `argument` and returns the result.
        """

09- Robot Framework 的測試庫 API

Robot Framework 有三種不同的測試庫 API: --- 靜態API 這是最簡單的方法。 采用一個 Python 的 module 或者 Class,提供一系列的關鍵字。 module 或 class 的方法名和關鍵字相匹配,關鍵字和方法具有同樣的參數。 這些關鍵字可以通報異常,輸出日誌,返回需要的值等等。 --- 動態 API 作為動態API的 Class,要實現兩個方法: 一個用來獲取它們自己實現了的關鍵字的名字,另外一個用來執行這些關鍵字。 關鍵字具體實現及運行,是在運行期決定的。 這些關鍵字可以通報異常,輸出日誌,返回需要的值。 --- 混合API 相比靜態API,作為混合API的Class ,多了一個方法用來發現實現了哪些關鍵字,這些關鍵字可以直接使用。 其他的一切都跟靜態 API 一模一樣。

10- 創建測試庫-- 動態測試庫

動態測試庫與靜態之間不同: 關鍵字的實現,關鍵字參數和文檔的實現,以及關鍵字實際執行的方式 每個動態庫必須同時具有 get_keyword_names 和 run_keyword 方法,其他方法都是可選的。

***** 獲取關鍵字的名稱

get_keyword_names 方法來發現實現了什麽關鍵字。 這個方法不需要任何參數,必須返回一個字符串的列表(在 Python 中)。 返回值中包含了測試庫實現的所有關鍵字的名稱。 動態庫必須要有這個方法。如果沒有,或者因為某種原因調用該方法失敗,這個測試庫就會被視為靜態庫。

***** 運行關鍵字

run_keyword方法來運行它們的關鍵字。 這個方法帶有 2 個參數: 第一個參數是需要運行的關鍵字名稱,其格式必須與 get_keyword_names 中返回的值相同 第二個參數是將要傳到該關鍵字的參數列表

***** 獲取關鍵字的參數

get_keyword_arguments 方法獲取實際需要什麽參數,並告訴 Robot Framework。 這個方法將關鍵字的名稱作為一個參數,並返回一個包含了該關鍵字接受的參數的字符串列表。 動態關鍵字可以要求任何數量的參數,也可以帶具有默認值的參數,可以接受可變數量的參數。

***** 獲取關鍵字的文檔

get_keyword_documentation方法取得關鍵字的文檔,並放入用libdoc生成的庫文檔中。 這個方法帶有一個參數,該參數是關鍵字的名稱,並以字符串形式返回它的文檔。

***** Remote

使用動態 API 最好的例子就是 Robot Framework 的 Remote 庫

示例: LibraryExampleE.py

# -*- coding: utf-8 -*-
 
###動態測試庫
 
class LibraryExampleE():
 
#獲取關鍵字名稱
    def get_keyword_names(self):
        return [‘first keyword‘, ‘second keyword‘]
#運行關鍵字
    def run_keyword(self, name, args):
        print "Running keyword ‘%s‘ with arguments %s." % (name, args)
#獲取關鍵字的參數
    def get_keyword_arguments(self, name):
        return [‘*arguments‘]  
#獲取關鍵字的文檔
    def get_keyword_documentation(self, name):
        return """This is an example Dynamic library with some documentation."""

11- 創建測試庫-- 混合測試庫

混合 API 的庫,介於靜態和動態 API 之間,既能直接實現一些方法,更重要的是,還能夠動態的處理它們。

***** 獲取關鍵字的名稱

get_keyword_names方法來返回一個它所實現的關鍵字的名稱列表,與動態 API 類似。

***** 運行關鍵字

采用反射來發現實現關鍵字的方法,與靜態 API 類似。

***** 獲取關鍵字的參數和文檔

跟靜態 API 的方式一樣,取得這個方法的引用之後,它就從引用中去搜索參數和文檔信息。

***** 小結

混合 API 一個很大的好處就是,它不需要特殊的方法來取得關鍵字的參數和文檔。 真正動態的關鍵字在__getattr__中處理,其他的就直接在主庫類中實現,這在實踐中也經常用到。 當使用 Python 的時候,混合 API 在大多數情況下是更好的選擇。

***** Telent

使用混合 API 的好例子就是 Robot Framework 自帶的 Telnet 庫。

示例: LibraryExampleF.py

# -*- coding: utf-8 -*-
#混合測試庫
 
import LibraryExampleFlib
 
class LibraryExampleF():
    """This is an example Dynamic library with some documentation."""
#獲取關鍵字名稱
    def get_keyword_names(self):
        return [‘my_keyword‘,‘external_keyword‘]
#運行關鍵字
    def my_keyword(self, arg):
        print "My Keyword called with ‘%s‘" % arg
#__getattr__方法
    def __getattr__(self, name):
        if name == ‘external_keyword‘:
            return LibraryExampleFlib.hello
        raise AttributeError("Non-existing attribute ‘%s‘" % name)

LibraryExampleFlib.py
def hello():
    print "Hello, world!"
def Nothing():
    pass

12- 創建測試庫-- 使用 Robot Framework 內部模塊

Python 實現的測試庫可以使用 Robot Framework 的內部模塊。 小心使用! Robot Framework 的API並不是都能從外部調用,而且不同版本之間的API 有些本質上的變化。 最安全的 API 就是實現 BuiltIn 庫中關鍵字的那些方法。 關鍵字的改變要非常謹慎,一般首先就要把以前的老用法廢棄掉。 最有用的方式之一就是 replace_variables,這個方法允許訪問當前可用的變量。

示例: LibraryExampleG.py

# -*- coding: utf-8 -*-
 
###使用RobotFramework內部模塊
 
import os.path
from robot.libraries.BuiltIn import BuiltIn
 
class LibraryExampleG():
 
    def do_something(argument):
        output = ‘do_something_that_creates_a_lot_of_output(argument)‘
        outputdir = BuiltIn().replace_variables(‘${OUTPUTDIR}‘)
        path = os.path.join(outputdir, ‘results.txt‘)
        f = open(path, ‘w‘)
        f.write(output)
        f.close()
        print ‘*HTML* Output written to <a href="results.txt">results.txt</a>‘

13- 創建測試庫-- 擴展已存在的測試庫

添加新的功能給已存在的測試庫,以及怎麽在自己的庫中使用它們。

***** 修改原始代碼

直接修改其源代碼的方式的問題是容易產生混亂,而且也需要額外重新打包。

***** 繼承

使用繼承來擴展一個已存在的庫。 新的測試庫與原始庫的名稱不相同。能夠很容易地識別出正在使用一個定制庫。 問題是新庫將和原始庫擁有同樣的關鍵字,意味著會有沖突。另外一個問題是測試庫不能共享它們的狀態。

***** 直接使用其他測試庫

方法是靜態的,也不依賴測試庫的狀態的時候,可以簡單地引入這個測試庫,並使用它的方法。

***** 從 Robot Framework 中獲取活動的測試庫實例

BuiltIn 關鍵字 Get Library Instance,它被用來從 Robot Framework 自身中獲取當前活動的庫實例。 這個關鍵字返回的庫實例,這個實例能看見當前的庫狀態。

***** 使用動態庫或者混合庫 API 的測試庫

動態或者混合庫 API 的測試庫通常都有一套它們自己的擴展方式。 對於這些測試庫,你需要從庫的開發者,或者參考庫文檔或源代碼中獲取相關指南。

Robot Framework - 入門與操作(3)