十拟杉、Robot Framework--擴展Robot Framework

聲明:本文搬運自官方操作文檔,僅用作學習量承,有錯誤的地方歡迎指正搬设。
官方文檔鏈接:RobotFramework--擴展Robot Framework

4 擴展Robot Framework

4.1 創(chuàng)建測試庫

4.1.1 介紹

支持的編程語言

Robot Framework本身是用Python編寫的,測試庫自然可以使用Python實現(xiàn)擴展撕捍。在Jython上運行時拿穴,庫也可以用Java執(zhí)行。純 Python 代碼在 Python 和 Jython 上都有效忧风, 但是如果不使用Jython的語法和模塊就不能運行在Jython上默色。使用 Python 時,使用Python C API也能用 C 實現(xiàn)庫狮腿,但是使用ctypes模塊通常更容易與 Python 庫的 C 代碼交互腿宰。

使用這些本機支持的語言執(zhí)行的庫也可以充當使用其他編程語言實現(xiàn)的功能的包裝器呕诉。這種方法的一個很好的例子是Remote庫,另一個廣泛使用的方法是運行外部腳本或工具作為單獨的進程酗失。

提示
RobotFramework測試庫開發(fā)人員的 Python 教程涵蓋了足夠的 Python 語言义钉, 開始使用它編寫測試庫。還包含一個簡單的示例庫和測試案例规肴,可以在計算機上執(zhí)行和以其他方式進行研究捶闸。

不同的測試庫API

Robot Framework有三種不同的測試庫 API。

靜態(tài)API
最簡單的方法是有一個模塊(在Python)或一個類(在Python或Java)拖刃,其方法直接映射到關(guān)鍵字名稱删壮。關(guān)鍵字也采用與執(zhí)行它們的方法相同的參數(shù)。關(guān)鍵字報告故障時通過編寫到標準輸出進行日志記錄兑牡,并且可以使用return語句返回值央碟。
動態(tài)API
動態(tài)庫是實現(xiàn)獲取其執(zhí)行的關(guān)鍵字名稱的方法的類,以及執(zhí)行帶有給定參數(shù)的指定關(guān)鍵字的另一種方法均函。要執(zhí)行的關(guān)鍵字的名稱以及執(zhí)行方式可以在運行時動態(tài)確定亿虽,但報告狀態(tài)、記錄和返回值的工作與靜態(tài) API 類似苞也。
混合API
這是靜態(tài)和動態(tài) API 之間的混合體洛勉。庫是帶有說明其執(zhí)行的關(guān)鍵字的方法的類,但這些關(guān)鍵字必須直接可用如迟。除了發(fā)現(xiàn)實現(xiàn)哪些關(guān)鍵字之外收毫,其他一切都與靜態(tài) API 中類似。

所有這些 API 都在此章節(jié)中進行了描述殷勘。一切都基于靜態(tài) API 的工作原理此再,因此首先討論其功能。動態(tài)庫 API和混合庫 API與它有什么不同玲销,然后在他們自己的部分討論输拇。

本章中的例子主要是關(guān)于使用 Python 的,但對于Java開發(fā)人員來說也很容易理解痒玩。在少數(shù) API 有差異的情況下淳附,這兩種用法都用充分的例子來解釋。

4.1.2創(chuàng)建測試庫類或模塊

測試庫可以作為 Python 模塊和 Python 或 Java 類執(zhí)行蠢古。

測試庫名稱

導(dǎo)入庫時使用的測試庫的名稱與執(zhí)行該庫的模塊或類的名稱相同奴曙。例如,如果你有一個Python模塊MyLibrary(即文件*MyLibrary.py)草讶,它將創(chuàng)建一個庫的名字MyLibrary洽糟。同樣,Java 類YourLibrary,當它不在任何包中時坤溃,創(chuàng)建一個完全具有該名稱的庫拍霜。

Python 類始終在模塊內(nèi)。如果執(zhí)行庫的類的名稱與模塊的名稱相同薪介,則Robot Framework允許在導(dǎo)入庫時刪除模塊名稱祠饺。例如,MyLib.py文件中的MyLib類可以用作具有*MyLib*名稱的庫汁政。如果模塊名稱和類名稱不同道偷,則必須使用模塊和類名稱(如mymodule.MyLibrary

必須使用非默認包中的 Java 類记劈,并使用全名勺鸦。例如com.mycompany.myproject包中的MyLib類必須輸入名稱*com.mycompany.myproject.MyLib*

提示
如果庫名真的很長目木,例如當 Java 包名稱很長時换途,建議使用WITH NAME 語法給庫提供更簡單的別名。

規(guī)定測試庫參數(shù)

作為類執(zhí)行的所有測試庫都可以攜帶參數(shù)刽射。這些參數(shù)在庫名之后的"設(shè)置"表中指定军拟,當Robot Framework創(chuàng)建導(dǎo)入庫的實例時,它將它們傳遞給其構(gòu)造者誓禁。作為模塊實現(xiàn)的庫不能接受任何參數(shù)吻谋,如果使用會報錯。

庫所需的參數(shù)數(shù)與庫的構(gòu)造者接受的參數(shù)數(shù)相同现横。默認值和可變參數(shù)數(shù)與關(guān)鍵字參數(shù)類似,但 Java 庫沒有可變參數(shù)支持阁最。傳遞給庫的參數(shù)以及庫名稱本身可以使用變量進行指定戒祠,因此可以從命令行中更改。

導(dǎo)入帶參數(shù)的測試庫

image.png

示例實現(xiàn)速种,第一個是 Python姜盈,第二個是 Java :

from example import Connection

class MyLibrary:

    def __init__(self, host, port=80):
        self._conn = Connection(host, int(port))

    def send_message(self, message):
        self._conn.send(message)
public class AnotherLib {

    private String setting = null;

    public AnotherLib(String setting) {
        setting = setting;
    }

    public void doSomething() {
        if setting.equals("42") {
            // do something ...
        }
    }
}

測試庫作用域

作為類執(zhí)行的庫可以具有內(nèi)部狀態(tài),可以通過關(guān)鍵字和與庫構(gòu)造者進行參數(shù)更改配阵。由于狀態(tài)會影響關(guān)鍵字的實際行為方式馏颂,因此確保一個測試案例的變化不會影響其他測試案例就非常重要。此類依賴項可能會產(chǎn)生難以驗證的問題棋傍,例如救拉,當添加新的測試案例且它們使用庫不一致時。

Robot Framework試圖使測試案例彼此獨立:默認情況下瘫拣,它為每個測試案例創(chuàng)建新的測試庫實例亿絮。然而,這種行為并不總是可取,因為有時測試案例應(yīng)該能夠共享一個共同的狀態(tài)派昧。此外黔姜,所有庫都沒有狀態(tài),根本不需要創(chuàng)建新的實例蒂萎。

測試庫可以控制何時創(chuàng)建帶有類屬性ROBOT_LIBRARY_SCOPE的新庫秆吵。此屬性必須是一個字符串,它可以具有以下三個值:

TEST CASE
為每個測試案例創(chuàng)建一個新實例五慈∧杉牛可能的套件設(shè)置和套件拆解共享另一個實例。這是默認值豺撑。
TEST SUITE
為每個測試套件創(chuàng)建一個新實例烈疚。最低級別的測試套件由測試案例文件創(chuàng)建,包含測試案例聪轿,具有自己的實例爷肝,而高級套件都擁有自己的實例,用于可能的設(shè)置和拆解陆错。
GLOBAL
在整個測試執(zhí)行過程中只創(chuàng)建了一個實例灯抛,所有測試案例和測試套件都共享該實例。從模塊創(chuàng)建的庫始終是全局性的音瓷。

當TEST SUITE或GLOBAL與具有狀態(tài)的測試庫一起使用時对嚼,建議庫具有一些用于清理狀態(tài)的特殊關(guān)鍵字。然后绳慎,此關(guān)鍵字可用于套件設(shè)置或拆解中纵竖,以確保下一個測試套件中的測試案例可以從已知狀態(tài)開始。例如杏愤,SeleniumLibrary*使用GLOBAL在不同的測試情況下啟用同一瀏覽器靡砌,而無需重新打開它,并且它還具有*Close All Browsers*關(guān)鍵字珊楼,可輕松關(guān)閉所有打開的瀏覽器通殃。

使用TEST SUITE示例的 Python 庫示例:

class ExampleLibrary:

    ROBOT_LIBRARY_SCOPE = 'TEST SUITE'

    def __init__(self):
        self._counter = 0

    def count(self):
        self._counter += 1
        print self._counter

    def clear_counter(self):
        self._counter = 0

使用GLOBAL范圍的示例Java庫:

public class ExampleLibrary {

    public static final String ROBOT_LIBRARY_SCOPE = "GLOBAL";

    private int counter = 0;

    public void count() {
        counter += 1;
        System.out.println(counter);
    }

    public void clearCounter() {
        counter = 0;
    }
}

指定庫版本

當測試庫投入使用時,Robot Framework會嘗試確定其版本厕宗。然后將此信息寫入系統(tǒng)以提供調(diào)試信息画舌。庫文檔工具libdoc還將此信息編寫到它生成的關(guān)鍵字文檔中。

版本信息是從屬性ROBOT_LIBRARY_VERSION讀取的已慢,就像測試庫范圍從ROBOT_LIBRARY_SCOPE讀取一樣曲聂。如果ROBOT_LIBRARY_VERSION不存在,則嘗試從__version__屬性讀取信息佑惠。這些屬性是類屬性還是模塊屬性句葵,具體取決于庫是作為類還是模塊實現(xiàn)的厕鹃。對于 Java 庫,版本屬性必須聲明為static final乍丈。

使用__version__的 Python 模塊示例:

__version__ = '0.1'

def keyword():
    pass

使用ROBOT_LIBRARY_VERSION的Java類:

public class VersionExample {

    public static final String ROBOT_LIBRARY_VERSION = "1.0.2";

    public void keyword() {
    }
}

4.1.3 創(chuàng)建靜態(tài)關(guān)鍵字

哪些方法被視為關(guān)鍵字

使用靜態(tài)庫 API 時剂碴,Robot Framework使用反射來找出庫類或模塊執(zhí)行的公共方法。它將排除所有從下劃線開始的方法轻专,Java庫也排除了僅在java.lang.Object中執(zhí)行的方法忆矛。所有未被忽略的方法都被視為關(guān)鍵字。例如请垛,下面的 Python 和 Java 庫實現(xiàn)單個關(guān)鍵字My Keyword催训。

class MyLibrary:

    def my_keyword(self, arg):
        return self._helper_method(arg)

    def _helper_method(self, arg):
        return arg.upper()
public class MyLibrary {

    public String myKeyword(String arg) {
        return helperMethod(arg);
    }

    private String helperMethod(String arg) {
        return arg.toUpperCase();
    }
}

當庫作為 Python 模塊實現(xiàn)時,還可以通過使用 Python 的__all__屬性來限制關(guān)鍵字的方法宗收。如果使用__all__漫拭,則其中列出的方法只能是關(guān)鍵字。例如下面的庫實現(xiàn)關(guān)鍵字Example KeywordSecond Example混稽。如果沒有__all__采驻,它還將實現(xiàn)關(guān)鍵字Not Exposed As KeywordCurrent Thread__all__最重要的用途是確保導(dǎo)入的幫助方法(如下面示例中的current_thread)不會意外暴露為關(guān)鍵字匈勋。

from threading import current_thread

__all__ = ['example_keyword', 'second_example']

def example_keyword():
    if current_thread().name == 'MainThread':
        print 'Running in main thread'

def second_example():
    pass

def not_exposed_as_keyword():
    pass

注意
從RobotFramework 2.5.5 開始支持__all__屬性礼旅。

關(guān)鍵字名稱

將測試數(shù)據(jù)中使用的關(guān)鍵字名稱與方法名稱進行比較以查找實現(xiàn)這些關(guān)鍵字的方法。名稱比對不區(qū)分大小寫洽洁,空格和下劃線也被忽略痘系。例如,方法hello映射的關(guān)鍵字名稱Hello, hello 甚至h e l l o同樣饿自,do_nothingdoNothing 的方法都可以用作測試數(shù)據(jù)中Do Nothing的關(guān)鍵字汰翠。

示例 Python 庫作為MyLibrary.py文件中的模塊實現(xiàn):

<pre class="cm-s-default" style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">def hello(name): print "Hello, %s!" % name def do_nothing(): pass</pre>

示例 Java 庫在MyLibrary .java文件中作為一個類實現(xiàn):

def hello(name):
    print "Hello, %s!" % name

def do_nothing():
    pass

下面的示例說明了如何使用上述示例庫。如果您想自己嘗試昭雌,請確保庫位于庫搜索路徑中奴璃。


image.png

關(guān)鍵字參數(shù)

使用靜態(tài)和混合 API,關(guān)鍵字需要多少參數(shù)的信息直接來自實現(xiàn)它的方法城豁。使用動態(tài)庫 API的庫具有共享此信息的其他方法,因此此部分與它們無關(guān)抄课。

最常見也是最簡單的情況是關(guān)鍵字需要準確數(shù)量的參數(shù)。在這種情況下,Python 和 Java 方法都只考慮這些論點埠胖。例如族购,執(zhí)行無參數(shù)關(guān)鍵字的方法也不需要參數(shù),使用一個參數(shù)實現(xiàn)關(guān)鍵字的方法也需要一個參數(shù)抵拘,等等哎榴。

示例 Python 關(guān)鍵字采取不同數(shù)量的參數(shù):

def no_arguments():
    print "Keyword got no arguments"

def one_argument(arg):
    print "Keyword got one argument '%s'" % arg

def multiple_arguments(a1, a2, a3):
    print "Keyword got three arguments '%s', '%s' and '%s'" % (a1, a2, a3)

關(guān)鍵字默認值

關(guān)鍵字使用帶默認值的參數(shù)通常是有用的。Python 和 Java 處理默認值的語法不同,在為Robot Framework創(chuàng)建測試庫時可以使用這些語言的自然語法尚蝌。

Python默認值

在 Python 中方法始終具有一個實現(xiàn)迎变,并且方法簽名中指定了可能的默認值。所有 Python 程序員都熟悉的語法如下:

def one_default(arg='default'):
    print "Argument has value '%s'" % arg

def multiple_defaults(arg1, arg2='default 1', arg3='default 2'):
    print "Got arguments %s, %s and %s" % (arg1, arg2, arg3)

上面的第一個示例關(guān)鍵字可以使用零或一個參數(shù)飘言。如果沒有參數(shù)衣形,arg將獲得值默認值。如果有一個參數(shù)姿鸿,arg將獲得該值谆吴,并且用多個參數(shù)調(diào)用關(guān)鍵字失敗。在第二個示例中苛预,始終需要一個參數(shù)句狼,但第二個和第三個參數(shù)具有默認值,因此可以使用關(guān)鍵字和一到三個參數(shù)热某。

image.png

Java默認值

在 Java 中腻菇,一種方法可以有幾個具有不同簽名的實現(xiàn)。Robot Framework將所有這些實現(xiàn)視為一個關(guān)鍵字苫拍,可用于不同的參數(shù)芜繁。因此,此語法可用于支持默認值绒极。下面的示例說明了這一點骏令,該示例在功能上與之前的 Python 示例相同:

public void oneDefault(String arg) {
    System.out.println("Argument has value '" + arg "'");
}

public void oneDefault() {
    oneDefault("default");
}

public void multipleDefaults(String arg1, String arg2, String arg3) {
    System.out.println("Got arguments " + arg1 + ", " + arg2 + " and " + arg3);
}

public void multipleDefaults(String arg1, String arg2) {
    multipleDefaults(arg1, arg2, "default 2");
}

public void multipleDefaults(String arg1) {
    multipleDefaults(arg1, "default 1");
}

參數(shù)的變量數(shù)量

Robot Framework還支持需要任意數(shù)量的參數(shù)的關(guān)鍵字。與默認值類似垄提,Python 和 Java 中用于測試庫的實際語法也不同榔袋。

Python參數(shù)的變量數(shù)量

Python 支持接受任意數(shù)量的參數(shù)的方法。同樣的語法在庫中起作用铡俐,正如下面的例子所示凰兑,它也可以與其他指定參數(shù)的方法相結(jié)合:

def any_arguments(*args):
    print "Got arguments:"
    for arg in args:
        print arg

def one_required(required, *others):
    print "Required: %s\nOthers:" % required
    for arg in others:
        print arg

def also_defaults(req, def1="default 1", def2="default 2", *rest):
    print req, def1, def2, rest

使用帶有參數(shù)變量數(shù)量的關(guān)鍵字

Test Case Action Argument Argument Argument
Varargs Any Arguments
Any Arguments argument
Any Arguments arg 1 arg 2 arg 2
... arg 4 arg 5
One Required required arg
One Required required arg another arg yet another
Also Defaults required
Also Defaults required these two have defaults
Also Defaults 1 2 3
... 4 5 6

Java參數(shù)的變量數(shù)量

Robot支持Java可變參數(shù)語法來定義參數(shù)的變量數(shù)。Robot還將將數(shù)組翻譯為關(guān)鍵字簽名中的最后一個參數(shù)审丘,作為參數(shù)的變量數(shù)列表吏够。在這種情況下,關(guān)鍵字的所有剩余參數(shù)都打包到列表中滩报。如果使用的關(guān)鍵字與一個參數(shù)少于簽名中的實際參數(shù)數(shù)锅知,這也有效——在這種情況下,末端的陣列將是空的脓钾。

Robot對 Java 參數(shù)的變量數(shù)的支持有一個限制:它僅在方法只有一個簽名時才有效售睹。因此,不可能有具有默認值和參數(shù)變量的 Java 關(guān)鍵字可训。當然昌妹,仍有可能需要的參數(shù)捶枢,如下示例所示:

public void anyNumberOfArguments(String... varargs) {
    System.out.println("Got arguments:");
    for (String arg: varargs) {
        System.out.println(arg);
    }
}

public void oneArgumentRequired(String required, String... others) {
    System.out.println("Required: " + required + "\nOthers:");
    for (String arg: others) {
        System.out.println(arg);
    }
}

public void usingAnArray(String[] args) {
    System.out.println("Got arguments:");
    for (String arg: args) {
        System.out.println(arg);
    }
}

參數(shù)類型

通常關(guān)鍵字參數(shù)以字符串的身份出現(xiàn)在Robot Framework中。如果關(guān)鍵字需要其他類型飞崖,則可以使用變量或?qū)⒆址D(zhuǎn)換為關(guān)鍵字內(nèi)所需的類型烂叔。Java關(guān)鍵字基本類型也自動強制的。

Python的參數(shù)類型

由于 Python 中的參數(shù)沒有任何類型信息蚜厉,因此在使用 Python 庫時长已,不可能自動將字符串轉(zhuǎn)換為其他類型。調(diào)用 Python 方法以使用正確數(shù)量的參數(shù)實現(xiàn)關(guān)鍵字總是成功的昼牛,但如果參數(shù)不兼容术瓮,則以后執(zhí)行將失敗。幸運的是贰健,Python 將參數(shù)轉(zhuǎn)換為關(guān)鍵字內(nèi)的合適類型非常簡單:

def connect_to_host(address, port=25):
    port = int(port)
    # ...

Java的參數(shù)類型

對 Java 方法的參數(shù)具有類型胞四,并且所有基本類型都自動處理。這意味著測試數(shù)據(jù)中正常字符串的參數(shù)被強制在運行時更正類型伶椿」嘉埃可以強制的類型是:

  • 整數(shù)類型(byte, short, int, long)
  • 浮點類型(floatdouble)
  • 布爾類型(boolean
  • 上述類型的對象版本,例如java.lang.Integer

強制是針對關(guān)鍵字方法的所有簽名具有相同或兼容類型的參數(shù)進行的脊另。在以下示例中导狡,可對關(guān)鍵字doubleArgumentcompatibleTypes進行轉(zhuǎn)換,但不能用于conflictingTypes偎痛。

public void doubleArgument(double arg) {}

public void compatibleTypes(String arg1, Integer arg2) {}
public void compatibleTypes(String arg2, Integer arg2, Boolean arg3) {}

public void conflictingTypes(String arg1, int arg2) {}
public void conflictingTypes(int arg1, String arg2) {}

如果測試數(shù)據(jù)包含包含數(shù)字的字符串旱捧,則強制與數(shù)字類型配合使用,并且與布爾類型一起踩麦,數(shù)據(jù)必須包含真或假字符串枚赡。只有在原始值是來自測試數(shù)據(jù)的字符串時才進行強制,但當然仍可能使用包含 這些關(guān)鍵字正確類型的變量谓谦。如果關(guān)鍵字的簽名相互沖突贫橙,則使用變量是唯一的選項。

Test Case Action Argument Argument Argument
Coercion Double Argument 3.14
Double Argument 2e16 # scientific notation
Compatible Types Hello, world! 1234
Compatible Types Hi again! -10 true
No Coercion Double Argument ${3.14}
Conflicting Types 1 ${2} # must use variables
Conflicting Types ${1} 2

4.1.4 Robot Framework通信

在調(diào)用執(zhí)行關(guān)鍵字的方法后反粥,它可以使用任何機制與受測試的系統(tǒng)進行通信卢肃。然后,它還可以向Robot Framework的日志文件發(fā)送消息才顿,將可以保存到變量的信息返回莫湘,最重要的是,如果關(guān)鍵字是否通過娜膘,則報告。

報告關(guān)鍵字狀態(tài)

報告關(guān)鍵字狀態(tài)可以簡單使用異常來完成优质。如果執(zhí)行的方法拋了一個異常竣贪,關(guān)鍵字狀態(tài)是FAIL军洼,如果它返回正常,狀態(tài)是PASS演怎。

日志匕争、報告和控制臺中顯示的錯誤消息是從異常類型及其消息創(chuàng)建的。除一般異常(例如AssertionError, Exception, 和 RuntimeError)外爷耀,僅使用異常消息甘桑,而與其他例外消息一起,創(chuàng)建的消息格式為ExceptionType: Actual message歹叮。在這兩種情況下跑杭,對于用戶來說,異常信息盡可能詳細是最重要的咆耿。

如果錯誤消息長于 40 行德谅,則會自動從中間剪切,以防止報告過長且難以讀取萨螺。完整的錯誤消息始終顯示在失敗關(guān)鍵字的日志消息中窄做。

還使用DEBUG 日志級別記錄異常的跟蹤。默認情況下慰技,這些消息在日志文件中不可見椭盏,因為它們對普通用戶來說用處不大。在開發(fā)庫時吻商,通常建議使用DEBUG日志級運行測試掏颊。

停止測試執(zhí)行

從Robot Framework 2.5 開始,測試案例可能會失敗手报,從而停止整個測試執(zhí)行蚯舱。這僅僅是通過在關(guān)鍵字中提出的異常值上設(shè)置具有真實值的特殊ROBOT_EXIT_ON_FAILURE屬性來完成的。下面的例子說明了這一點掩蛤。

Python:

class MyFatalError(RuntimeError):
    ROBOT_EXIT_ON_FAILURE = True

Java:

public class MyFatalError extends RuntimeException {
    public static final boolean ROBOT_EXIT_ON_FAILURE = true;
}

失敗后繼續(xù)測試執(zhí)行

從Robot Framework 2.5 開始枉昏,即使出現(xiàn)故障也可以繼續(xù)測試執(zhí)行。從測試庫發(fā)出此信號的方法是向用于傳達故障的異常添加具有真實值的特殊ROBOT_CONTINUE_ON_FAILURE屬性揍鸟。以下示例就證明了這一點兄裂。

Python:

class MyContinuableError(RuntimeError):
    ROBOT_CONTINUE_ON_FAILURE = True

Java:

public class MyContinuableError extends RuntimeException {
    public static final boolean ROBOT_CONTINUE_ON_FAILURE = true;
}

日志信息

異常消息不是向用戶提供信息的唯一方法。除了它們阳藻,方法還可以通過編寫到標準輸出流(Stdout)或標準錯誤流(stderr)來發(fā)送消息到日志文件晰奖,甚至可以使用不同的日志級別。另一種腥泥,而且通常更好是使用程序化日志API記錄日志匾南。

默認情況下,通過方法寫入標準輸出的所有內(nèi)容都寫入日志文件蛔外,每條日志級別都是INFO蛆楞。寫入標準錯誤的消息處理方式類似溯乒,但在關(guān)鍵字執(zhí)行完成后,會回應(yīng)到原始的 stderr豹爹。因此裆悄,如果您需要一些消息在執(zhí)行測試的控制臺上可見,則可以使用 stderr臂聋。

使用日志級別

要使用INFO以外的其他日志級別光稼,或創(chuàng)建多個消息,通過在格式*LEVEL* Actual log message中嵌入級別來明確指定日志級別孩等,其中*LEVEL*必須在行的開頭艾君,LEVELTRACEDEBUG瞎访、INFO腻贰、WARNHTML

警告

帶有WARN級別的消息會自動寫入控制臺扒秸,并寫入日志文件中的單獨測試執(zhí)行錯誤部分播演。這使得警告比其他消息更明顯,并允許使用它們向用戶報告重要但非關(guān)鍵問題伴奥。

記錄HTML

庫通常記錄的所有內(nèi)容都將轉(zhuǎn)換為可以安全地表示為 HTML 的格式写烤。例如,<b>foo</b>在日志中將顯示與之完全相同的foo拾徙。 如果庫想要使用格式洲炊、鏈接、顯示圖像等尼啡,他們可以使用特殊的偽日志級別HTML暂衡。Robot Framework將直接將這些消息與INFO級別一起寫入日志,以便他們可以使用他們想要的任何HTML語法崖瞭。注意此功能需要小心使用狂巢,例如,放置不當?shù)?</table>表標簽可能會嚴重破壞日志文件书聚。

使用公共記錄 API時唧领,各種記錄方法具有可選的html屬性,可設(shè)置為True雌续,以便以 HTML 格式進行記錄斩个。

時間戳

默認情況下,通過標準輸出或錯誤流記錄的消息在執(zhí)行關(guān)鍵字結(jié)束時會獲取其時間戳驯杜。這意味著時間戳不準確受啥,調(diào)試問題特別是運行時間較長的關(guān)鍵字可能會有問題。

從Robot Framework 2.6 關(guān)鍵字開始,如果需要滚局,可以向其記錄的消息添加準確的時間戳叁温。時間戳單位是毫秒且必須在日志界別之后,以冒號分隔:

*INFO:1308435758660* Message with timestamp
*HTML:1308435758661* <b>HTML</b> message with timestamp

如下所示核畴,使用 Python 和 Java 都很容易添加時間戳。Python使用程序化日志API更容易獲得準確的時間戳冲九。明確添加時間戳的一大好處是適用于遠程庫界面

Python:

import time

def example_keyword():
    print '*INFO:%d* Message with timestamp' % (time.time()*1000)

Java:

public void exampleKeyword() {
    System.out.println("*INFO:" + System.currentTimeMillis() + "* Message with timestamp");
}
控制臺輸出日志

如果庫需要向控制臺寫東西谤草,他們有幾個選項。正如已經(jīng)討論過的那樣莺奸,寫入標準錯誤流的警告和所有消息都寫入日志文件和控制臺丑孩。這兩個選項都有一個限制,即消息僅在當前執(zhí)行的關(guān)鍵字完成后才結(jié)束到主機灭贷。一個好處是温学,這些方法都適用于Python和Java庫。

另一種選擇甚疟,即僅適用于 Python仗岖,是向sys.__stdout__sys.__stderr__發(fā)送消息。使用此方法時览妖,消息會立即寫入控制臺轧拄,且不寫入日志文件:

import sys

def my_keyword(arg):
   sys.__stdout__.write('Got arg %s\n' % arg)

最后一種選擇是使用程序化日志API:

from robot.api import logger

def log_to_console(arg):
   logger.console('Got arg %s' % arg)

def log_to_console_and_log_file(arg)
   logger.info('Got arg %s' % arg, also_console=True)
記錄示例

大多數(shù)情況INFO級別是足夠的。更低級別的DEBUGTRACE是用來記錄調(diào)試信息讽膏。這些消息通常不顯示檩电,但它們可以協(xié)助調(diào)試庫本身中可能出現(xiàn)的問題。WARN級別可用于使消息更加可見府树,如果需要任何格式俐末,則 HTML更好。

以下示例闡明了不同級別日志工作原理奄侠。Java 程序員應(yīng)將代碼print 'message'改為System.out.println("message")卓箫。

print 'Hello from a library.'
print '*WARN* Warning from a library.'
print '*INFO* Hello again!'
print 'This will be part of the previous message.'
print '*INFO* This is a new message.'
print '*INFO* This is <b>normal text</b>.'
print '*HTML* This is <b>bold</b>.'
print '*HTML* <a >Robot Framework</a>'
16:18:42.123    信息  你好,從圖書館遭铺。
16:18:42.123    警告  來自庫的警告丽柿。
16:18:42.123    信息  您好!
這將是上一條消息的一部分魂挂。
16:18:42.123    信息  這是一條新消息甫题。
16:18:42.123    信息  這是 [lt; b] 正常文本。
16:18:42.123    信息  這是大膽的涂召。
16:18:42.123    信息  機器人框架

程序化日志API

程序化 API 提供比使用標準輸出和錯誤流更清潔的方式來記錄信息坠非。目前,這些接口僅適用于 Python 基礎(chǔ)測試庫果正。

公共日志API

Robot Framework 2.6有基于 Python 的新型日志API炎码,用于向日志文件和控制臺發(fā)送消息盟迟。測試庫可以使用此 API(如logger.info('My message')),而不是通過print '*INFO* My message'等標準輸出進行記錄潦闲。除了編程界面更加簡潔以外攒菠,這個API有一個好處就是日志消息有準確的時間戳。缺點是歉闰,日志API 的測試庫要依賴Robot Framework辖众。

公共日志API 作為 API 文檔的一部分進行記錄,下面是一個簡單的使用示例:

from robot.api import logger

def my_keyword(arg):
    logger.debug('Got argument %s' % arg)
    do_something()
    logger.info('<i>This</i> is a boring example', html=True)
    logger.console('Hello, console!')
使用Python標準logging模塊

除了新的公共日志API和敬,Robot Framework2.6還增加了一個內(nèi)置的支持Python的標準日志模塊凹炸。這樣,模塊的根記錄器接收到的所有消息都會自動傳播到Robot Framework的日志文件中昼弟。此外啤它,此 API 會生成具有準確時間戳的日志消息,但不支持記錄 HTML 消息或向控制臺發(fā)送消息舱痘。好處是此日志 API 不依賴Robot Framework变骡,以下示例也說明了這一點。

import logging

def my_keyword(arg):
    logging.debug('Got argument %s' % arg)
    do_something()
    logging.info('This is a boring example')

logging模塊的日志級別與Robot Framework略有不同芭逝。其級別DEBUG和INFO直接映射到匹配的Robot Framework日志級別和警告锣光,上面的所有內(nèi)容都映射到WARN。DEBUG級別以下的自定義級別映射到DEBUG铝耻,DEBUG和WARNING之間的一切都映射到INFO誊爹。

庫初始化期間的日志

庫還可以在測試庫導(dǎo)入和初始化期間進行日志記錄。這些消息不像正常日志一樣顯示在日志文件中瓢捉,而是被寫入syslog频丘。這允許記錄庫初始化相關(guān)的所有有用的調(diào)試信息。使用WARN級別記錄的消息也可見于日志文件中的測試執(zhí)行錯誤部分泡态。

在導(dǎo)入和初始化過程中進行登錄既可使用標準輸出流和錯誤流搂漠,也可使用程序日志 ABI。這兩個都如下所示某弦。

Java庫在初始化過程中借助標準輸出進行記錄:

public class LoggingDuringInitialization {

    public LoggingDuringInitialization() {
        System.out.println("*INFO* Initializing library");
    }

    public void keyword() {
        // ...
    }
}

Python 庫在導(dǎo)入期間使用日志 API 進行記錄:

from robot.api import logger

logger.debug("Importing library")

def keyword():
    # ...

注意
如果您在初始化過程中記錄某些信息桐汤,即在 Python init或 Java 構(gòu)造器中,則消息可能會根據(jù)測試庫范圍多次記錄靶壮。

在庫初始化期間將日志消息編寫到 syslog 的支持是Robot Framework 2.6 中的一個新功能怔毛。

返回值

關(guān)鍵字通信回核心框架的最后方式是返回從受測試的系統(tǒng)中檢索或通過其他方式生成的信息。返回的值可以分配給測試數(shù)據(jù)中的變量腾降,然后用作其他關(guān)鍵字的輸入拣度,甚至來自不同的測試庫。

返回值都是使用 的Python 和 Java 方法的return語句。通常一個值被分配到一個標量變量抗果,如下所示筋帖。此示例還說明,可以返回任何對象并使用擴展變量語法訪問對象的屬性冤馏。

from mymodule import MyObject

def return_string():
    return "Hello, world!"

def return_object(name):
    return MyObject(name)

從關(guān)鍵字返回一個值


image.png

關(guān)鍵字也可以返回值日麸,以便它們可以一次分配到多個標量變量中,放入列表變量逮光,或分配到標量變量和列表變量中赘淮。所有這些用法都要求返回的值是 Python 列表或元組,或在 Java數(shù)組睦霎、列表或迭代器中。

def return_two_values():
    return 'first value', 'second value'

def return_multiple_values():
    return ['a', 'list', 'of', 'strings']

返回多個值


image.png

多線程通信

如果庫使用多線程走诞,則通常只能從主線程與框架通信副女。例如,如果運行的線程要報告失敗或記錄什么蚣旱,則應(yīng)首先將信息傳遞到主線程碑幅,主線程可以使用本節(jié)中解釋的異常或其他機制與框架進行通信塞绿。

當線程在后臺運行沟涨,而其他關(guān)鍵字正在運行時,這一點尤其重要异吻。在這種情況下,與框架通信的結(jié)果未定義诀浪,在工作情況下可能導(dǎo)致崩潰或輸出文件損壞棋返。如果關(guān)鍵字在后臺啟動某些內(nèi)容,則應(yīng)該有另一個關(guān)鍵字來檢查執(zhí)行線程的狀態(tài)雷猪,并相應(yīng)地報告收集的信息睛竣。

注意
使用編程記錄 API的非主線程記錄的消息從RobotFramework 2.6.2 開始被忽略。

4.1.5 分配測試庫

庫文檔

沒有關(guān)于它包含哪些關(guān)鍵字和這些關(guān)鍵字做什么的文檔的測試庫是相當無用的求摇。為了便于維護射沟,我們強烈建議將庫文檔包含在源代碼中并由此生成∮刖常基本上验夯,這意味著要使用Python的docstring和Java的Javadoc,如下示例摔刁。

class MyLibrary:
    """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
/**
 *  This is an example library with some documentation.
 */
public class MyLibrary {

    /**
     * This keyword has only a short documentation
     */
    public void keywordWithShortDocumentation(String argument) {
    }

    /**
     * First line of the documentation is here.
     *
     * Longer documentation continues here and it can contain
     * multiple lines or paragraphs.
     */
    public void keywordWithLongerDocumentation() {
    }

}

Python 和 Java 都有創(chuàng)建上述文檔的 API 文檔的工具簿姨。但對于某些用戶來說,這些工具的輸出可能略帶技術(shù)性。另一種選擇是使用RobotFramework自己的文檔工具libdoc扁位。此工具可以使用靜態(tài)庫 API(如上面的 API)創(chuàng)建來自 Python 和 Java 庫的庫文檔准潭,但它也使用動態(tài)庫 API和混合庫 API處理庫。

關(guān)鍵字文檔的第一行用于特殊目的域仇,并且應(yīng)包含關(guān)鍵字的簡短整體描述刑然。它被libdoc用作**short documentation,例如作為工具提示暇务,也顯示在測試日志中泼掠。但是,后者不使用靜態(tài) API 與 Java 庫合作垦细,因為它們的文檔在編譯中丟失择镇,在運行時不可用。

注意
如果您想在 Python 庫的文檔中使用非 ASCII 字符括改,則必須使用 UTF-8 編碼腻豌,或?qū)⑽臋n字符串創(chuàng)建為 Unicode。

測試庫

任何重要的測試庫都需要經(jīng)過徹底測試以防止其中出現(xiàn)錯誤嘱能。當然吝梅,此測試應(yīng)實現(xiàn)自動化,以在更改庫時便于重新運行測試惹骂。

Python 和 Java 都擁有出色的單元測試工具苏携,它們非常適合測試庫。與用于其他測試相比对粪,為此目的使用它們沒有重大區(qū)別右冻。熟悉這些工具的開發(fā)人員不需要學習任何新內(nèi)容,不熟悉這些工具的開發(fā)人員無論如何都應(yīng)該學習它們著拭。

也很容易使用RobotFramework本身測試庫国旷,這樣可以為他們進行實際的端到端驗收測試。為此內(nèi)置庫中有很多有用的關(guān)鍵字茫死。特別提及的是***Run Keyword And Expect Error*跪但,這是有用的,為測試關(guān)鍵字報告正確的錯誤峦萎。

是否使用單元級或驗收級測試方法取決于上下文屡久。如果需要模擬正在測試的實際系統(tǒng),則在單元級別上通常更容易爱榔。另一方面被环,驗收測試確保關(guān)鍵字運行在RobotFramework。如果不能決定详幽,也可以同時使用這兩種方法筛欢。

庫打包

庫實施浸锨、記錄和測試后,仍需要分發(fā)給用戶版姑。使用由單個文件組成的簡單庫柱搜,要求用戶在某處復(fù)制該文件并相應(yīng)地設(shè)置庫搜索路徑通常就足夠了。應(yīng)打包更復(fù)雜的庫以便于安裝剥险。

由于庫是正常的編程代碼聪蘸,因此可以使用普通打包工具進行封裝。在Python表制,選擇包括distutils健爬,包括Python的標準庫,和較新的setuptools么介。這些工具的一個好處是將庫模塊安裝到自動在庫搜索路徑中的位置娜遵。

使用 Java 時,自然將庫打包到 JAR 存檔中壤短。JAR 包在運行測試之前必須放入庫搜索路徑中设拟,但也可以很容易創(chuàng)建自動操作的啟動腳本。

棄用關(guān)鍵字

有時需要用新的關(guān)鍵字替換現(xiàn)有關(guān)鍵字或?qū)⑵渫耆珓h除鸽扁。僅僅將更改告知用戶可能不夠,而且在運行時間獲得警告效率更高镶骗。為了支持這一點桶现,RobotFramework提供了標記被棄用的關(guān)鍵字的能力*deprecated*。這使得從測試數(shù)據(jù)中查找舊關(guān)鍵字并刪除或替換它們變得更加容易鼎姊。

關(guān)鍵字被棄用骡和,以*DEPRECATED*開頭他們的文檔。執(zhí)行這些關(guān)鍵字時相寇,包含其余簡短文檔的警告將同時寫入控制臺慰于,并寫入日志文件中的單獨測試執(zhí)行錯誤部分。例如唤衫,如果執(zhí)行以下關(guān)鍵字婆赠,日志文件中將顯示如下警告。

def example_keyword(argument):
    """*DEPRECATED* Use keyword `Other Keyword` instead.

    This keyword does something to given `argument` and returns the result.
    """
    return do_something(argument)
WARN    Keyword 'SomeLibrary.Example Keyword' is deprecated. Use keyword `Other Keyword` instead.

此棄用系統(tǒng)適用于大多數(shù)測試庫和用戶關(guān)鍵字佳励。唯一例外是在Java測試庫中實現(xiàn)的關(guān)鍵字休里,該庫使用靜態(tài)庫接口,因為它們的文檔在運行時間不可用赃承。有了這些關(guān)鍵字妙黍,就可以使用用戶關(guān)鍵字作為裝飾器并棄用它們。

有一個計劃來實現(xiàn)一個工具瞧剖,可以使用棄用信息自動替換廢棄的關(guān)鍵字拭嫁。該工具很可能從文檔中獲取新關(guān)鍵字的名稱可免,以便搜索到引號 (```)中的單詞。因此做粤,它會從前面的例子中找到Other Keyword浇借。請注意,libdoc還使用相同的語法自動創(chuàng)建內(nèi)部鏈接驮宴。

4.1.6 動態(tài)庫API

動態(tài) API 在大多數(shù)方面與靜態(tài) API 相似逮刨。例如,報告關(guān)鍵字狀態(tài)堵泽、日志記錄和返回值的工作方式完全相同修己。最重要的是,與其他庫相比迎罗,導(dǎo)入動態(tài)庫和使用其關(guān)鍵字沒有區(qū)別睬愤,因此您甚至不需要知道庫使用什么 API。

靜態(tài)庫和動態(tài)庫之間的唯一區(qū)別是Robot Framework如何發(fā)現(xiàn)庫實現(xiàn)的關(guān)鍵字纹安、它們具有哪些參數(shù)和文檔以及這些關(guān)鍵字的實際執(zhí)行方式尤辱。使用靜態(tài) API,所有這一切都是使用反射完成的(Java庫的文檔除外)厢岂,但動態(tài)庫具有用于這些用途的特殊方法光督。

動態(tài) API 的優(yōu)點之一是在組織庫方面具有更大的靈活性。對于靜態(tài) API塔粒,所有關(guān)鍵字在類(或模塊)中锐峭,而對于動態(tài) API桐筏,可以將每個關(guān)鍵字作為單獨的類實現(xiàn)冯丙。此使用案例對于 Python 來說不是那么重要酥筝,因為它的動態(tài)功能和多重繼承已經(jīng)提供了足夠的靈活性,混合庫 API通常是一個更好的選擇圃酵。

動態(tài) API 的另一個主要用法是實現(xiàn)庫柳畔,以便它僅是其他計算機或其他 JVM 上實際庫的代理。這種代理庫可能非常小郭赐,并且由于關(guān)鍵字名稱是動態(tài)獲取的薪韩,因此當將新關(guān)鍵字添加到實際庫時,無需更新代理捌锭。

本節(jié)解釋了動態(tài) API 如何在Robot Framework和動態(tài)庫之間工作躬存。Robot Framework實際上如何實現(xiàn)這些庫并不重要(例如,如何將執(zhí)行run_keyword方法映射到正確的關(guān)鍵字)舀锨,并且有許多不同的方法是可能的岭洲。但是,如果您使用 Java坎匿,您可能需要在實施自己的系統(tǒng)之前檢查JavalibCore盾剩。此可重復(fù)使用的工具集合支持創(chuàng)建關(guān)鍵字的幾種方法雷激,而且它很可能已經(jīng)有一個機制來滿足您的需求。

獲取關(guān)鍵字名稱

動態(tài)庫使用get_keyword_names方法了解它們實施的關(guān)鍵字告私。該方法還具有在編寫 Java 時推薦的別名getKeywordNames屎暇。此方法不能攜帶任何參數(shù),并且它必須返回字符串列表(在 Python 中)或包含庫實現(xiàn)的關(guān)鍵字名稱的字符串數(shù)組(在 Java 中)驻粟。

如果返回的關(guān)鍵字名稱包含幾個單詞根悼,則可以用空格或下劃線或駝峰格式將它們分開返回。例如蜀撑,['first keyword', 'second keyword'], ['first_keyword', 'second_keyword']['firstKeyword', 'secondKeyword']都會導(dǎo)致關(guān)鍵字First KeywordSecond Keyword挤巡。

動態(tài)庫必須始終采用此方法。如果缺少它酷麦,或者如果出于某種原因調(diào)用失敗矿卑,則庫將被視為靜態(tài)庫。

執(zhí)行關(guān)鍵字

動態(tài)庫具有執(zhí)行關(guān)鍵字的特殊方法run_keyword(別名runKeyword)沃饶。當測試數(shù)據(jù)中使用動態(tài)庫的關(guān)鍵字時母廷,Robot Framework使用庫的run_keyword方法執(zhí)行。此方法需要兩個參數(shù)糊肤,第一個是包含要執(zhí)行的關(guān)鍵字的名稱的字符串琴昆,其格式與get_keyword_names返回的格式相同,第二個是提供給測試數(shù)據(jù)中關(guān)鍵字的參數(shù)列表(Java 中的對象數(shù)組)馆揉。

庫獲得關(guān)鍵字名稱和參數(shù)后业舍,可以自由執(zhí)行關(guān)鍵字,但必須使用與靜態(tài)庫的框架相同的機制進行通信把介。這意味著使用異常報告關(guān)鍵字狀態(tài)勤讽,通過編寫到標準輸出進行記錄蟋座,并在run_keyword中使用返回語句返回某些內(nèi)容拗踢。

每個動態(tài)庫都必須具有get_keyword_namesrun_keyword方法。動態(tài) API 中的其余方法是可選的向臀,因此下面是一個可用動態(tài)庫巢墅。

class DynamicExample:

    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)

獲取關(guān)鍵字參數(shù)

如果動態(tài)庫僅實現(xiàn)get_keyword_namesrun_keyword方法,則Robot Framework沒有任何有關(guān)已實施關(guān)鍵字所需的參數(shù)的信息券膀。例如君纫,上述示例中的第一個關(guān)鍵字第二個關(guān)鍵字都可用于任意數(shù)量的參數(shù)。這是有問題的芹彬,因為大多數(shù)真正的關(guān)鍵字期望一定數(shù)量的關(guān)鍵字蓄髓,在這種情況下,他們需要檢查參數(shù)計數(shù)本身舒帮。

動態(tài)庫可以使用get_keyword_arguments(別名獲取關(guān)鍵字)方法告訴Robot Framework它實現(xiàn)的關(guān)鍵字實際期望的參數(shù)会喝。此方法以關(guān)鍵字的名稱為參數(shù)陡叠,并返回包含該關(guān)鍵字所接受的參數(shù)的字符串列表(Java 中的字符串陣列)。

與靜態(tài)關(guān)鍵字類似肢执,動態(tài)關(guān)鍵字可能需要任意數(shù)量的參數(shù)枉阵、具有默認值和接受可變數(shù)的參數(shù)。下表解釋了如何表示所有這些不同情況的語法预茄。請注意兴溜,示例使用 Python 字符串列表,但 Java 開發(fā)人員應(yīng)該能夠?qū)⑵浞g為字符串陣列耻陕。

Expected arguments How to represent Examples Min / Max
No arguments Empty list. [] 0/0
One or more argument List of strings containing argument names. ['one_argument'], ['a1', 'a2', 'a3'] 1/1, 3/3
Default values for arguments Default values separated from names with =. Default values are always considered to be strings. ['arg=default value'], ['a', 'b=1', 'c=2'] 0/1, 1/3
Variable number of arguments Last argument has * before its name. ['arguments'], ['a', 'b=42', 'rest'] 0/any, 1/any

當使用get_keyword_arguments時拙徽,Robot Framework會自動計算關(guān)鍵字需要多少參數(shù)。如果使用關(guān)鍵字的參數(shù)數(shù)為無效淮蜈,則會出現(xiàn)錯誤斋攀,并且甚至沒有調(diào)用run_keyword。上表的最后一列顯示了從所示示例中計算的最低和最大參數(shù)計數(shù)梧田。

執(zhí)行測試時淳蔼,實際參數(shù)名稱并不重要,因為Robot Framework只關(guān)注參數(shù)計數(shù)裁眯。另一方面鹉梨,如果libdoc工具用于記錄庫,則文檔中顯示參數(shù)穿稳,在這種情況下存皂,它們需要有有意義的名稱。

獲取關(guān)鍵字文檔

動態(tài)圖書館可以實施的最后一種特殊方法是get_keyword_documentation(別名獲取關(guān)鍵字文件)逢艘。它將關(guān)鍵字名稱作為參數(shù)旦袋,并且,正如方法名稱所暗示的那樣它改,將其文檔返回為字符串疤孕。

返回的文檔同樣用作使用 Python 實現(xiàn)的靜態(tài)庫的關(guān)鍵字文檔字符串。主要用途是將關(guān)鍵字的文檔放入由libdoc生成的庫文檔中央拖。此外祭阀,文檔的第一行(直到第一行\(zhòng)n)顯示在測試日志中。

獲取總庫文檔

get_keyword_documentation方法也可用于指定整體庫文檔鲜戒。執(zhí)行測試時不使用此文檔专控,但它可以使libdoc生成的文檔變得更好。

動態(tài)圖書館可以同時提供與使用圖書館相關(guān)的一般圖書館文檔和文檔遏餐。前者是通過調(diào)用具有特殊價值intro的get_keyword_documentation獲得伦腐,后者是利用價值init。文檔的呈現(xiàn)方式在實踐中最好地通過libdoc進行測試失都。

基于 Python 的動態(tài)庫還可以將代碼中的一般庫文檔直接指定為庫類的文檔或其init方法柏蘑。如果非空文檔直接來自代碼和get_keyword_documentation方法颖系,則后者具有更高的優(yōu)先級。

注意

獲取一般庫文檔支持Robot Framework 2.6.2 和較新的文檔辩越。

總結(jié)

動態(tài) API 中的所有特殊方法都列在下表中嘁扼。方法名稱列在下劃線格式中,但其駱駝箱別名的工作方式完全相同黔攒。

動態(tài) API 中的所有特殊方法

可以按照以下方式在 Java 中編寫正式的界面規(guī)范趁啸。但是,請記住督惰,庫不需要實施任何明確的界面不傅,因為Robot Framework直接檢查與反射,如果庫有所需的get_keyword_names和run_keyword方法赏胚。此外访娶,get_keyword_arguments和get_keyword_documentation是完全可選的。

public interface RobotFrameworkDynamicAPI {

    String[] getKeywordNames();

    Object runKeyword(String name, Object[] arguments);

    String[] getKeywordArguments(String name);

    String getKeywordDocumentation(String name);

}

使用動態(tài)API的一個很好的例子是Robot Framework自己的遠程庫觉阅。

4.1.7 混合庫API

獲取關(guān)鍵字名稱

執(zhí)行關(guān)鍵字

獲取關(guān)鍵字參數(shù)和文檔

總結(jié)

4.1.8 使用RobotFramework的內(nèi)置模塊

可用API

使用Builtln庫

4.1.9 擴展存在的測試庫

修改初始源碼

使用繼承

直接使用其他庫

從Robot Framework獲取有效的庫實例

使用動態(tài)或混合API的庫

4.2 遠程庫接口

4.3 使用監(jiān)聽接口

4.4 擴展Robot Framework Jar

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末崖疤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子典勇,更是在濱河造成了極大的恐慌劫哼,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件割笙,死亡現(xiàn)場離奇詭異权烧,居然都是意外死亡,警方通過查閱死者的電腦和手機伤溉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門般码,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人乱顾,你說我怎么就攤上這事板祝。” “怎么了糯耍?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵扔字,是天一觀的道長囊嘉。 經(jīng)常有香客問我温技,道長,這世上最難降的妖魔是什么扭粱? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任舵鳞,我火速辦了婚禮,結(jié)果婚禮上琢蛤,老公的妹妹穿的比我還像新娘蜓堕。我一直安慰自己抛虏,他們只是感情好,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布套才。 她就那樣靜靜地躺著迂猴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪背伴。 梳的紋絲不亂的頭發(fā)上沸毁,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機與錄音傻寂,去河邊找鬼息尺。 笑死,一個胖子當著我的面吹牛疾掰,可吹牛的內(nèi)容都是我干的搂誉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼静檬,長吁一口氣:“原來是場噩夢啊……” “哼炭懊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拂檩,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤凛虽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后广恢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凯旋,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年钉迷,在試婚紗的時候發(fā)現(xiàn)自己被綠了至非。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡糠聪,死狀恐怖荒椭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情舰蟆,我是刑警寧澤趣惠,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站身害,受9級特大地震影響味悄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜塌鸯,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一侍瑟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦涨颜、人聲如沸费韭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽星持。三九已至,卻和暖如春弹灭,著一層夾襖步出監(jiān)牢的瞬間钉汗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工鲤屡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留损痰,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓酒来,卻偏偏與公主長得像卢未,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子堰汉,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容