從零學習基於Python的RobotFramework自動化
從零學習基於Python的RobotFramework自動化
一、 Python基礎
1) 版本差異
版本 |
編碼 |
語法 |
其他 |
2.X |
ASCII |
try: raise TypeError, 型別錯誤" except TypeError, err: print err.message |
…… |
3.X |
UTF-8 |
try: raise TypeError("型別錯誤") except TypeError as err: print(err) |
去除不等於<> 去除long型別 新增bytes型別 |
2) 輸入輸出
text = input('Enter any content : ') #輸入 print("Your input content is : %s" % text) #輸出
=============== C:\Python37\python.exe E: /TestScript.py ====================== Enter any content : who am I. Your input content is : who am I.
____________________________________________________________________________________________
3) 分支迴圈
for i in range(10): #range(start, stop[, step]) if i % 2 == 0: print(i, end=' ')
=============== C:\Python37\python.exe E: /TestScript.py ====================== 0 2 4 6 8
____________________________________________________________________________________________
4) 資料型別
a = 123 #整型 int() b = '123' #字串 str() c = [1, 2, 3] #列表 list() d = (1, 2, 3) #元組 tuple() e = {1, 2, 3} #集合 set() f = {'aa': 1, 'bb': 2} #字典 dict()
注意:
- 字串、列表、元組均可以通過索引獲取值,以及擷取部分。例如:a[0] >>> 1,b[1:-]>>> '2'。
- 整型、字串、元組資料不可變; 集合是無序唯一的; 字典中key必須唯一且與value成對。
____________________________________________________________________________________________
5) 函式方法
class Operation(): #類定義 def add(self, a, b): #方法定義 return a + b #返回結果 opt = Operation() #例項化類 print(opt.add(3, 5)) #呼叫類方法 =============== C:\Python37\python.exe E: /TestScript.py ====================== 8
____________________________________________________________________________________________
6) 模組匯入
from robot.api import logger import configparser
____________________________________________________________________________________________
7) 異常報錯
² KeyboardInterrupt Ctrl+C被按下
² AttributeError 試圖訪問物件沒有的屬性(比如foo沒有屬性x,卻試圖訪問foo.x)
² IOError 輸入/輸出異常(一般是無法開啟檔案)
² ImportError 無法引入模組或包(一般是名稱或路徑錯誤,或者是無此第三方包)
² IndentationError 語法錯誤(一般是程式碼沒有正確對齊)
² SyntaxError 程式碼非法,程式碼不能編譯(一般是語法錯誤,寫錯了)
² NameError 使用一個還未被賦予物件的變數
² IndexError 下標索引超出序列邊界,(比如f只有3個元素,卻試圖訪問f[5])
² TypeError 傳入物件型別與要求的不符合
² KeyError 試圖訪問字典裡不存在的鍵
² ValueError 傳入一個呼叫者不期望的值
二、 RobotFramework基礎
1) 版本差異
版本 |
安裝 |
支援 |
執行 |
其他 |
1.5.X之前 |
wxPython2.8.x |
Pyhton2.x |
pybat |
…… |
1.7.X之後 |
wxPython4.0.x |
Pyhton2.x |
robot |
新增debug模式 |
2) 輸入輸出
Import Library Dialogs ${username} = Get Value From User Input user name default Log ${username} ======================================================= 20190724 12:37:36.010 : INFO : ${username} = zhangsir 20190724 12:37:36.010 : INFO : zhangsir
_________________________________________________________________________________
3) 分支迴圈
FOR ${i} IN RANGE 5 Run Keyword If ${i}%2==0 Log ${i}
END ======================================================= 20190724 12:51:55.658 : INFO : 0 20190724 12:51:55.658 : INFO : 2 20190724 12:51:55.658 : INFO : 4
________________________________________________________________________________
4) 資料型別
${a}= Set Variable ${123} ${b}= Set Variable 123 @{c}= Create List 1 2 3 &{d}= Create Dictionary aa=1 bb=2 cc=3 ======================================================= 20190724 13:44:11.701 : INFO : ${a} = 123 20190724 13:44:11.717 : INFO : ${b} = 123 20190724 13:44:11.717 : INFO : @{c} = [ 1 | 2 | 3 ] 20190724 13:44:11.717 : INFO : &{d} = { aa=1 | bb=2 | cc=3 } 20190724 13:44:11.717 : INFO : 123 20190724 13:44:11.717 : INFO : 123 20190724 13:44:11.717 : INFO : ['1', '2', '3'] 20190724 13:44:11.717 : INFO : {'aa': '1', 'bb': '2', 'cc': '3'}
________________________________________________________________________________
5) 函式方法
*** Keywords *** Library MyLibrary
*** Keywords *** Query Redis String [Arguments] ${key} ${db}=8 ${conn} Connected To Redis ${db} ${result} Get From Redis ${conn} ${key} [Return] ${result}
________________________________________________________________________________
6) 模組匯入
Import Library MyLibrary Import Resource BasicResource.robot Import Variables ${adultCode}
________________________________________________________________________________
7) 異常報錯
======================================================= 20190724 14:08:07.692 : INFO : 123 20190724 14:08:07.692 : FAIL : Replacing variables from setting 'Variables' failed: Variable '${test}' not found. Did you mean: ${TEST_TAGS} ${TEST_NAME} 20190724 14:08:07.692 : DEBUG : Traceback (most recent call last): None
三、 RobotFramework常用關鍵字
1) Evaluate關鍵字
以Python模式計算指定的表示式並返回結果。
-
- ${random} = Evaluate random.randint(0, sys.maxint) modules=random, sys
2) Should系列關鍵字
用於判斷校驗測試結果。
-
-
Should Be Empty:如果指定物件不為空則失敗(反之Should Not …)。
-
Should Be Equal:如果指定物件不相等則失敗(反之Should Not …)。
-
Should Be True:如果指定條件不成立則失敗(反之Should Not …)。
-
Should Contain:如果指定物件不包含則失敗(反之Should Not …)。
-
……
-
3) Convert系列關鍵字
用於資料的型別轉換。
-
-
Convert To Integer:將指定項轉換為整數。
-
Convert To Number:將指定項轉換為浮點數。
-
Convert To String:將指定項轉換為unicode字串。
-
……
-
4) Run Keyword系列關鍵字
根據判斷條件的真假執行關鍵字
-
-
Run Keyword If:如果條件為真,則使用指定的引數執行指定的關鍵字。
-
Run Keyword Unless:如果條件為假,則使用指定的引數執行指定的關鍵字。
-
Run Keyword:使用指定的引數執行指定的關鍵字。
-
Run Keywords:按順序執行所有指定的關鍵字(使用AND連線)。
- ……
-
5) Get系列關鍵字
根據關鍵字作用獲取值。
-
-
Get Count:返回item1中出現item2的次數。
-
Get Length:返回指定項的長度。
-
Get Time:返回指定格式時間。
-
……
-
6) Set系列關鍵字
設定引數或變數。
-
-
Set Variable:設定變數。
-
Set Variable If:根據指定條件設定變數。
-
Set Log Level:設定日誌登記。
-
……
-
7) 其他關鍵字
-
-
Sleep:強制休眠指定時間(秒)。
-
Catenate:連線多個字串(預設有空格)。
-
Call Method:使用提供的引數呼叫指定物件的方法。
-
Exit For Loop If:如果條件為真,則結束FOR迴圈。
-
四、 RobotFramework安裝
1) 安裝Python3.x
首先執行python-3.7.3-amd64.exe,勾選“Add Path…”,最好選擇自定義安裝在根目錄。
然後開啟DOS命令視窗,分別輸入python --version和pip –version,顯示對應判斷則安裝成功。
2) 安裝相關模組
pip install redis
pip install pysolr
pip install pymysql
pip install robotframework
pip install robotframework-ride
pip install robotframework-requests # 用於介面測試
pip install robotframework-databaselibrary # 用於資料庫測試
3) 自定義庫管理
把自定義檔案包放到Python目錄下Lib/site-packages即可。
4) 常見錯誤處理
- 執行RF3.X報錯,提示資訊“python2.x呼叫失敗”?
這是由於你之前安裝過RF2.X,切換到RF3.X後資料檔案未清除導致。
請在系統盤搜尋librarykeywords.db檔案並刪除(AppData\Roaming\RobotFramework\ride),重啟RIDE。
- 執行RF3.X報錯,提示資訊“找不到pybat”?
這是因為RF3.X去除了pybat模式,合併到了robot模式。請更改執行模式為robot,並更改用例檔案格式為.robot。
五、 日期時間處理
1) 日期格式
l 常見形式: 2019-07-20 18:45:18(格式化"%Y-%m-%d %H:%M:%S")
l Solr庫: 2019-07-20T18:45:18Z(格式化"%Y-%m-%dT%H:%M:%SZ")
l Redis庫: Jul 7, 2019 6:45:18 PM(格式化"%b %d, %Y %I:%M:%S %p")
l MySQL庫: datetime.datetime(2019, 7, 20, 18, 45, 18)
l 含毫秒: 2019-07-20 18:45:18.000(格式化"%Y-%m-%d %H:%M:%S.%f")
l 時間戳: 1564453476000
l 其他: 20190720184518(格式化"%Y%m%d%H%M%S")
2) 處理方法
※ Convert Date:轉換日期格式,可指定輸入輸出格式(epoch表示時間戳)。
引數:
date: 日期字串
result_format: 返回的日期格式,
exclude_millis: 是否捨去毫秒
date_format: 格式化的日期格式
示例:
| Convert Date | 2014-05-28 12:05:03.111 | result_format=epoch | #返回'1401267903.111' |
| Convert Date | Jul 7, 2019 6:45:18 PM | date_format=%b %d, %Y %I:%M:%S %p | #返回'2014-05-28 12:05:03'|
※ Get Current Date:獲取當前日期時間,可指定輸出格式。
引數:
time_zone:獲取此時區的當前時間(目前僅支援本地和UTC)
increment:設定返回日期時間增量,可為負數
result_format:返回日期的格式。
exclude_millis:是否捨去毫秒
示例:
| Get Current Date | result_format=%Y-%m-%d | #返回當天日期 |
六、 JSON處理
1) 標準格式
{
"key1": {
"key2": 123,
"key3": "123",
"key4": [1, 2, 3],
"key5": {"key": "value"}
},
"key6": true,
"key7": null
}
2) 處理方法
※ Get Json Value:獲取JSON中指定目標節點值。
引數:
json_string:JSON文件
json_pointer:JSON節點
示例:
| ${result}= | Get Json Value | {"foo": {"bar": [1,2,3]}} | /foo/bar |
| Should Be Equal | ${result} | [1, 2, 3] |
※ Set Json Value:設定JSON中指定目標節點值。
引數:
json_string:JSON文件
json_pointer:JSON節點
json_value:JSON值
示例:
| ${result}= | Set Json Value | {"foo": {"bar": [1,2,3]}} | /foo | 123 |
| Should Be Equal | ${result} | {"foo": 123} |
七、 Jenkins整合
&n