自動化測試 RobotFramework-ride使用相關總結

授客發表於2024-09-18

開發環境

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. 方法1:編輯%PYTHON_HOME%\Lib\site-packages\pywin32.pth,在檔案末尾新增類庫模組所在目錄路徑(例中為D:\PyProjects\CustomLibrary),儲存即可(不需要重啟RIDE)。注意,pywin32這個檔案中不能有中文,否則會導致python無法正常執行
  2. 方法2:編輯系統環境變數,新建PYTHONPATH環境變數,設定變數值為類庫模組所在目錄路徑,儲存即可(需要重啟RIDE)。
  3. 方法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

注意:

  1. 本例已將MyTestLib.py所在目錄路徑新增到pywin32.pth
  2. 當類和模組名稱不一致時,必須透過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

相關文章