Robot Framework(15)- 擴充套件關鍵字

小菠蘿測試筆記發表於2020-05-30

如果你還想從頭學起Robot Framework,可以看看這個系列的文章哦!

https://www.cnblogs.com/poloyy/category/1770899.html

 

前言

  • 什麼是擴充套件關鍵字?就是你自己寫的 Python 檔案,裡面包含了函式或者類
  • 然後 RF 匯入這個 Python 模組,就可以呼叫函式或者類方法,它們就是擴充套件關鍵字

 

Python 模組作為測試庫

模組檔名作為測試庫的名字

比如:Python 模組名叫 MyLibrary,檔名是 MyLibrary.py,那麼測試庫的名字就叫做 MyLibrary

 

Python 模組和 Robot 檔案同目錄下的栗子

這是目錄結構哈

python 模組的程式碼

def returnlist():
    return [i for i in range(10)]


def return_dict():
    return {"a": "hahhahahaahah"}


# 以下劃線開頭的函式不能作為RF關鍵字
def _returnlist2():
    return [1, 2]

robot 程式碼

進入test目錄下,執行以下命令

 robot -P . test.robot 

執行結果

知識點

  • _字首的方法不會作為關鍵字,在Python裡面, _ 開頭的方法是私有方法,RF 不會識別到它
  • Python 方法作為關鍵字也是大小寫不敏感
  • RF 中會把關鍵字的 _ 和單個空格忽略掉,所以 returndict、return dict、return_dict 都是呼叫同一個關鍵字

 

Python 類作為測試庫的栗子

專案目錄

所有 Python 測試程式碼都在 tlib2.py 裡面哦

最終執行是在【15_擴充套件關鍵字】目錄下執行的,命令如下

robot -P . testrf

 

栗子一:類初始化不需要傳參

python 程式碼

class SubLibrary:
    def __init__(self):
        pass

    def returnint(self):
        return 2020

    def _returnint2(self):
        return 4

robot 程式碼

測試結果

知識點

  • 在類裡面, _ 字首的方法不會當做關鍵字
  • 同樣,類中宣告的方法當做關鍵字的話,大小寫不敏感

 

栗子二:類初始化需要傳參

python 程式碼

from robot.api import logger
class SubLibrary2: def __init__(self, host, port, table='test'): self.host = host self.port = port self.table = table def printaddr2(self): logger.console('host:%s,port:%s,table:%s' % (self.host, self.port, self.table))

robot 程式碼

測試結果

知識點

如果類的 __init__ 初始化方法需要傳參,則在匯入庫後面跟對應的引數列表

擴充 Python 知識點:先有類物件,還是先執行類初始化方法?

 __new__ 方法產生物件

 __init__ 物件的初始化方法

先 new 一個物件,再 init 一個物件

 

栗子三:類名和模組名相同

python 程式碼

from robot.api import logger

class tlib2:
    def __init__(self, host, port):
        self.host = host
        self.port = port

    def printaddr(self):
        logger.console('host:%s,port:%s' % (self.host, self.port))

robot 程式碼

測試結果

知識點

如果類名和模組名相同,可以不用匯入類名

 

栗子四:使用路徑法匯入 Python 模組

Python 程式碼用的還是栗子三的

robot 程式碼

測試結果

知識點

如果用路徑法,需要注意匯入 Python 模組需要有檔案字尾哦,且用 / 來表示目錄下

重點:使用路徑法,只能匯入和模組名相同的類名!

 

Python 擴充套件庫的搜尋規則

統一的規則

  • 先根據 robot 檔案自身當前目錄下查詢庫檔案
  • 如果沒有找到則再根據 --pythonpath 和 -P 提供的搜尋路徑進行搜尋
  • 最後找 Python 安裝的路徑

 

Python 庫引入了其他模組

背景

當 robot 檔案匯入的 Python 測試庫引入了其他模組時,應該怎麼寫匯入路徑?

正確寫法

確保匯入的模組路徑和RF匯入的模組起始路徑統一

看栗子

 testother.robot  匯入 test.py 模組, test.py  模組引入了 login.py 模組的方法

目錄結構

login.py 程式碼

from robot.api import logger


def login_test():
    logger.console('test login')

test.py 程式碼

from pylib.login import login_test
# from login import login_test 報錯

def test():
    login_test()

robot 的程式碼

在 othertest 目錄下執行下面命令

robot -P . testother.robot

測試結果

結論

  • 可以看到 robot 檔案引入的路徑是 pylib 開頭, test 模組引入 login 模組的路徑也是 pylib 開頭
  • 如果路徑是 login 開頭匯入,那麼執行robot檔案將會報錯(如下圖,包含了解析錯誤)

 

Python 庫中的 class 存在繼承

背景

當 robot 檔案匯入 Python 測試庫的類繼承了另一個類,應該怎麼寫匯入路徑?

正確寫法

  • 確保匯入的模組路徑和RF匯入的模組起始路徑統一
  • 使用的時候 RF 檔案只需匯入子類即可

看栗子

 test.robot 引入了 other.py  模組下的 Child 類,而 Child 類繼承了 Base.py 模組下的 Father 類

目錄結構

base.py 的程式碼

from robot.libraries.BuiltIn import logger


class Father:
    def __init__(self):
        logger.console('init Father')

    def money(self):
        return '$10000'

other.py 的程式碼

from robot.api import logger
from pylib.Base import Father


class Child(Father):
    def __init__(self):
        Father.__init__(self)
        logger.console('init Child')

    def use_money(self):
        return self.money()

    def make_money(self):
        return '$9999'

robot 的程式碼

在 testClass 目錄下執行下面命令

robot -P . test.robot

測試結果

 

相關文章