Robot Framework - 入門與操作(2)
阿新 • • 發佈:2018-11-23
04- 建立測試庫--基礎概念
Robot Framework 實際的測試能力是由測試庫提供的。***** 支援的程式語言
- Robot Framework 自身是用 Python 編寫的,能使用 Python 擴充套件測試庫。
- 如果在 Jython 執行Robot Framework 的話,那麼測試庫也可以用 Java 來實現。
- 也可以通過 Python C API 使用 C 語言來實現測試庫。
***** 不同的測試庫 API
Robot Framework 有三種不同的測試庫 API: --- 靜態API05- 建立測試庫Class或者Module
***** 測試庫名稱
測試庫以.py為字尾名,檔名與實現該測試庫的模組名或者類名相同。 Python 類總是被寫在一個模組中的。- 如果實現一個庫的類的名稱跟它所在的模組同名,則 Robot Framework允許引入它的時候去掉模組名。
- 如果模組名和類名不同,使用測試庫要同時使用模組名和類名。
- 如果測試庫名稱真的太長了,推薦通過 WITH NAME語法給測試庫新增一個簡短的別名。
***** 提供引數給測試庫
所有實現測試庫的類都可以帶引數。但是,如果庫是用模組來實現的,則不能帶任何引數。 測試庫需要的引數個數跟它的構造器接收的引數個數相同。預設值和可變個數引數也能工作。 引數被傳遞給測試庫時,可以通過變數。***** 測試庫的範圍
Robot Framework預設地為每個測試用例建立測試庫的新例項,讓測試用例之間保持獨立。 屬性 ROBOT_LIBRARY_SCOPE,測試庫可以控制新的庫什麼時候被建立。 這個屬性必須是字串,並且它只有以下三個值:- TEST CASE ---- 為每個測試用例建立一個新的例項。
- TEST SUITE ---- 為每個測試集建立一個新的例項。
- GLOBAL ---- 在整個測試執行過程中,只有 1 個例項被建立,被所有測試用例和測試集共享。
***** 宣告測試庫的版本
屬性 ROBOT_LIBRARY_VERSION,宣告測試庫的版本。 如果 ROBOT_LIBRARY_VERSION 不存在,就嘗試讀取__version__屬性。 這些屬性必須是類或者模組的屬性。示例: LibraryExampleA.py
# -*- coding: utf-8 -*- ###建立測試庫Class或者Module class LibraryExampleA(): ROBOT_LIBRARY_SCOPE = 'TEST SUITE' #測試庫的範圍 __version__ = '0.1' #宣告測試庫的版本 def __init__(self): self._counter = 0 def count(self): self._counter += 1 print self._counter def clear_counter(self): self._counter = 0 ## def keyword(self): ## pass
06- 建立測試庫--建立靜態關鍵字
***** 關鍵字名稱
在測試資料中使用的關鍵字名稱不區分方法名的大小寫,空格和下劃線也會被忽略。***** 關鍵字引數
在靜態和混合庫 API 中,一個關鍵字需要多少引數,取決於實現它的方法。 最通用也是最簡單的情況是,當一個關鍵字需要的引數是固定個數的。***** 帶有預設值的引數
在 Python 中,帶有預設值的引數可以宣告在方法簽名中。***** 可變數量的引數
Robot Framework支援帶有可變數量引數的關鍵字。 Python 支援方法接收可變數量的引數。同樣的語法也可以在測試庫中使用。***** 引數的型別
通常情況下,關鍵字引數是作為字串傳給 Robot Framework 的。 如果關鍵字需要其他型別的引數,要麼就使用變數,要麼利用內建關鍵字將字串轉換成需要的型別。 引數的數量正確,呼叫關鍵字時將會成功;引數型別不匹配,執行關鍵字時失敗。 在 Python 中,可以很簡單的將引數轉換為合適的型別,例如:port = int(PortNumber)。示例: LibraryExampleB.py
# -*- coding: utf-8 -*- ###建立靜態關鍵字 class LibraryExampleB(): #關鍵字名稱 def hello(self,name): print "Hello, %s!" % name def do_nothing(self): pass #關鍵字引數 def no_arguments(self): print "Keyword got no arguments." def one_argument(self,arg): print "Keyword got one argument '%s'." % arg def multiple_arguments(self,a1, a2, a3): print "Keyword got three arguments '%s', '%s' and '%s'." % (a1, a2, a3) #帶有預設值的引數 def one_default(self,arg='default'): print "Argument has value %s" % arg def multiple_defaults(self,arg1, arg2='default 1', arg3='default 2'): print "Got arguments %s, %s and %s" % (arg1, arg2, arg3) #可變數量的引數 def any_arguments(self,*args): print "Got arguments:" for arg in args: print arg def one_required(self,required, *others): print "Required: %s\nOthers:" % required for arg in others: print arg def also_defaults(self,req, def1="default 1", def2="default 2", *rest): print req, def1, def2, rest #引數的型別 def connect_to_host(self,address, port=25): port = int(port) print address, port
07- 建立測試庫--與RobotFramework通訊
***** 報告關鍵字的狀態
如果一個被執行的方法丟擲一個異常,該關鍵字的狀態就是 FAIL,如果它正常返回了,則狀態為 PASS。 錯誤資訊包含了異常的型別和資訊,它被顯示在日誌、報告和控制檯中。 異常的跟蹤可以通過 DEBUG 日誌級別來輸出日誌。這些資訊在日誌檔案中預設是不可見的。***** 停止測試執行
可以通過讓一個測試用例失敗來停止整個測試執行。 屬性ROBOT_EXIT_ON_FAILURE (值為 True)設定到關鍵字丟擲的異常中,就能達到這種目的。***** 不管失敗繼續執行
可以讓整個測試執行在出現了 failure 的時候繼續執行。 屬性ROBOT_CONTINUE_ON_FAILURE (值為 True)設定到關鍵字丟擲的異常中,就能達到這種目的。***** 輸出日誌資訊
預設地,一個方法寫入標準輸出的一切資訊都會被當作 INFO 級別輸出到日誌檔案中。 要使用其他的日誌級別(非 INFO)或者建立一些資訊,可以通過將級別繫結到資訊中。 格式: *LEVEL*Actual log message *LEVEL*必須位於資訊的頭部,並且 LEVEL 的值必須是 TRACE、 DEBUG、 INFO、 WARN 、HTML 其中之一。***** 警告
警告(WARN)級別的資訊會自動被寫入控制檯和日誌檔案中單獨的測試執行錯誤那一節。 使用警告來報告一下重要而不危險的問題給使用者。***** 輸出 HTML 格式的日誌
如果測試庫想要使用格式、超連結、圖片等等,它們可以使用特殊的日誌級別 HTML。***** 日誌級別
大多數情況下, INFO 級別已經足夠。 DEBUG 和 TRACE,可以很容易的除錯測試庫自身可能存在的問題。 WARN 級別可以讓資訊更加可見,HTML 級別對於需要其他格式時很有用。***** 返回值
返回值可以賦給測試資料中的變數,然後這個變數又作為其他關鍵字的輸入。 返回值在 Python中採用 return 語句。 一般地,一個值被賦給一個標量變數。 關鍵字能通過多個標量變數或者構成一個列表變數返回多個值。 對於Python, 返回值必須是列表或者元組。示例: LibraryExampleC.py
# -*- coding: utf-8 -*- ###與RobotFramework通訊 import base64 class LibraryExampleC(): #返回值 def return_string(self): return 'Hello, world!' def return_object(self,info): return base64.b64encode(info) def return_two_values(self): return 'first value', 'second value' def return_multiple_values(self): return ['a', 'list', 'of', 'strings'] #日誌例子 def log_example(self): 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 href="http://robotframework.org">Robot Framework</a>'