開發環境
win11 家庭中文版
Python 3.9.13
robotframework6.1.1
說明:為了方便的使用robot命令,安裝好robotframwork後,修改系統環境,新增robot.exe(PYTHON_HOME/Scripts/robot.exe
)所在路徑到系統環境變數path
安裝參考連線:https://github.com/robotframework/robotframework/blob/master/INSTALL.rst
說明:實踐過程中有安裝過更robotframework7.0.1,發現匯入自定義庫候,RIDE執行用例套件時會報類似如下錯誤:
[ ERROR ] Calling method 'log_message' of listener 'D:\Program Files (x86)\Python39\lib\site-packages\robotide\contrib\testrunner\TestRunnerAgent.py' failed: AttributeError: 'Output' object has no attribute '_xmllogger'
docutils-0.21.2-py3-none-any.whl
pip install docutils==0.21.2
robotframework-ride 2.0.8.1
依賴包:
numpy 2.0.0
pillow 10.3.0
Pygments 2.18.0
Pypubsub 4.0.3
pywin32 306
six 1.16.0
wxPython 4.2.1
使用總結
安裝ride
pip install robotframework-ride
執行ride
首次執行,可以透過執行以下命令開啟RIDE GUI
cd %PYTHON_HOME%\Scripts
python ride.py
開啟後,選單 Tools -> Create RIDE Desktop Shortcut
建立桌面快捷方式,下次執行即可透過雙擊中快捷方式啟動RIDE。
新增自定義類庫
新建測試用例集
選單File -> New Project
,建立專案
右鍵上述建立的專案 -> New Suite
建立測試套件
右鍵上述建立的套件 -> New Test Case
建立測試用例
新增自定義類庫
實踐用到的Python專案工程根目錄路徑:D:\PyProjects\CustomLibrary
基於模組
專案工程程式碼組織結構如下:
CustomLibrary
MyTestLib.py
__init__.py
CustomLibrary/MyTestLib.py
程式碼內容如下:
# -*- coding:utf-8 -*-
def example_keyword():
print('example_keyword')
def key_word_func():
print('key word function')
點選專案->Library
-> Browse
,選擇模組指令碼所在路徑
說明:也可以不點選Browse
按鈕,直接在上圖的Name
輸入框直接輸入目標類庫名稱、路徑
注意:實踐時發現,類庫匯入要在測試用例套件節點上設定,否則不起作用。類似的,資源匯入也是如此
最終有效測試套件文字化編輯結果(TestSuite.robot
檔案內容)如下:
*** Settings ***
Library ../CustomLibrary/MyTestLib.py
*** Test Cases ***
測試用例1
example keyword
key word func
問題:上圖的Name
輸入框能不能簡化為直接輸入一個類庫名稱呢?
最終要實現的文字編輯效果如下:
*** Settings ***
Library MyTestLib
答案是:可以的。
具體實現方法有3種:
- 方法1:編輯
%PYTHON_HOME%\Lib\site-packages\pywin32.pth
,在檔案末尾新增類庫模組所在目錄路徑(例中為D:\PyProjects\CustomLibrary
),儲存即可(不需要重啟RIDE)。注意,pywin32這個檔案中不能有中文,否則會導致python無法正常執行 - 方法2:編輯系統環境變數,新建
PYTHONPATH
環境變數,設定變數值為類庫模組所在目錄路徑,儲存即可(需要重啟RIDE)。 - 方法3:
RIDE -> Tools -> Preferences -> Importing
, 設定Pythonpath
輸入框的值為類庫模組所在目錄路徑(不需要重啟RIDE)
基於類
專案工程程式碼組織結構如下:
CustomLibrary
MyTestLib.py
__init__.py
CustomLibrary/MyTestLib.py
程式碼內容如下:
# -*- coding:utf-8 -*-
class MyLib():
def example_keyword(self):
print('example_keyword')
def key_word_func(self):
print('key word function')
最終有效測試套件文字化編輯結果(TestSuite.robot
檔案內容)如下:
*** Settings ***
Library MyTestLib.MyLib
*** Test Cases ***
測試用例1
example keyword
key word func
注意:
- 本例已將
MyTestLib.py
所在目錄路徑新增到pywin32.pth
- 當類和模組名稱不一致時,必須透過
module_name.class_name
的方式指定類庫
修改CustomLibrary/MyTestLib.py
程式碼內容如下:
# -*- coding:utf-8 -*-
class MyTestLib():
ROBOT_LIBRARY_SCOPE = 'GLOBAL' # 設定類庫作用域為全域性--在整個測試執行過程中只建立一個例項,它由所有測試用例和測試套件共享
def example_keyword(self):
print('example_keyword')
def key_word_func(self):
print('key word function')
最終有效測試套件文字化編輯結果(TestSuite.robot
檔案內容)如下:
*** Settings ***
Library MyTestLib
*** Test Cases ***
測試用例1
example keyword
key word func
說明:當類和模組名稱一致時,可以省略類名
透過類繼承實現由多個類組成的類庫
實現方式1
專案工程程式碼組織結構如下:
CustomLibrary
│ MyTestLib.py
│ __init__.py
│
├─host
│ host_operations.py
│ __init__.py
│
├─monitor
│ monitor_operations.py
│ __init__.py
│
└─printer
printer_operations.py
__init__.py
CustomLibrary/host/host_operations.py
程式碼內容如下:
# -*- coding:utf-8 -*-
class HostTestHelper():
cpu_type = 'x86'
def __init__(self):
pass
@classmethod
def set_cpu_type(cls, cpu_type):
print(f'set cpu type {cpu_type}')
cls.cpu_type = cpu_type
CustomLibrary/monitor/monitor_operations.py
程式碼內容如下:
# -*- coding:utf-8 -*-
class MonitorTestHelper():
def __init__(self):
pass
def get_monitor_resolution_ratio(self):
print('get monitor ratio')
return '1600 x 900'
CustomLibrary/printer/printer_operations.py
程式碼內容如下:
# -*- coding:utf-8 -*-
from host.host_operations import HostTestHelper
class PrinterTestHelper():
def __init__(self):
self.driver_type = ''
def set_printer_driver(self):
if HostTestHelper.cpu_type == 'x86':
self.driver_type = 'SANXIN'
elif HostTestHelper.cpu_type == 'x64':
self.driver_type = 'HP'
print(f'set printer driver {self.driver_type}')
def get_printer_driver(self):
print(f'get printer driver')
CustomLibrary/__init__.py
程式碼內容如下:
# -*- coding:utf-8 -*-
# 注意,使用RIDE執行測試套件時,這裡匯入時必須包含專案根目錄包,否則會導致類庫失敗,
# from host.host_operations import HostTestHelper # 會報錯,提示類似錯誤:ModuleNotFoundError: No module named 'host'
from CustomLibrary.host.host_operations import HostTestHelper
from CustomLibrary.monitor.monitor_operations import MonitorTestHelper
from CustomLibrary.printer.printer_operations import PrinterTestHelper
class CustomLibrary(HostTestHelper, MonitorTestHelper, PrinterTestHelper):
ROBOT_LIBRARY_SCOPE = 'GLOBAL'
def __init__(self):
super().__init__()
pywin32.pth
修改成如下配置
# .....
D:\PyProjects\CustomLibrary
D:\PyProjects
注意:檔案如果去掉D:\PyProjects\CustomLibrary
這行內容,會導致上面例中的MyTestLib
類庫匯入失敗,如果去掉 D:\PyProjects
這行內容則會導致CustomLibrary
類庫匯入失敗。
最終測試套件文字化編輯結果如下
*** Settings ***
Library MyTestLib
Library CustomLibrary
*** Test Cases ***
測試用例1
example keyword
key word func
set_cpu_type x64
set_printer_driver
get_printer_driver
get monitor resolution ratio
實現方式2
在場景1的基礎上,做以下修改,其它不變
1、刪除 CustomLibrary/__init__.py
程式碼,即還原__init__.py
為新建狀態
2、修改CustomLibrary/MyTestLib.py
,修改後的程式碼內容如下:
# -*- coding:utf-8 -*-
# from CustomLibrary.host.host_operations import HostTestHelper # 這樣也可以
from host.host_operations import HostTestHelper
from monitor.monitor_operations import MonitorTestHelper
from printer.printer_operations import PrinterTestHelper
class MyTestLib(HostTestHelper, MonitorTestHelper, PrinterTestHelper):
ROBOT_LIBRARY_SCOPE = 'GLOBAL'
def __init__(self):
super().__init__()
最終有效測試套件文字化編輯結果(TestSuite.robot
檔案內容)如下:
*** Settings ***
Library MyTestLib
Library CustomLibrary
*** Test Cases ***
測試用例1
set_cpu_type x64
set_printer_driver
get_printer_driver
get monitor resolution ratio