簡體   English   中英

如何在Python和RobotFramework之間傳遞在Python函數內部創建的變量

[英]How to pass variables between Python and RobotFramework which are created inside Python functions

我試圖弄清楚如何在(雙向)python文件和RobotFramework之間傳遞變量。 我的目標是在python中有一個函數來收集值(文件夾名稱)並將它們存儲在變量中,然后供另一個函數使用,該函數隨后將連續測試每個文件夾名稱。 我的目標是利用RF的測試報告功能生成有關哪個文件夾通過/失敗的通過/失敗報告。

(文件夾名稱/位置將發生變化,這就是為什么我不想對它們進行硬編碼,而是選擇使用一些代碼通過文件選擇器菜單來收集文件夾名稱的原因-但是一旦獲得更多信息,它的實現就會實現解決了基本問題:))

我已經找到了有關從python文件獲取變量並讓RF識別並對其進行處理的示例,在本例中為Log To Console。 如何將值從python代碼傳遞到機器人框架的變量

我已經嘗試了鏈接中的示例,它確實可以工作。 我遇到的第一個麻煩是將變量放入函數中。

所以我的Python文件(test.py)看起來像這樣:

    def create_the_thing():
        a = 'Testing'

    def do_the_thing():
        print(a)

我的RF文件(test.robot)如下所示:

    *** Settings ***
    Variables    C:/.../Desktop/test/test.py
    Library      C:/.../Desktop/test/test.py

    *** Test Cases ***
    Make Something
        Create The Thing
        Log To Console    ${a}

    Do Something
        Do The Thing

我希望'Create The Thing'將運行,這將使變量'a'。 然后,我認為變量“ a”將被傳遞回RF(如鏈接示例中所示),然后將其記錄到控制台。

我不知道如何在兩個測試用例之間傳遞變量“ a”。 也許設置全局變量關鍵字?

相反,我將“找不到變量$ {a}”作為第一個測試的錯誤,將“ NameError:全局名稱'a'未定義”作為第二個測試的錯誤。

我知道測試2失敗了,因為該變量從未在第一個測試中傳遞回RF,但是沒有辦法讓測試作為關鍵字運行,然后返回一個可以在以后在其他測試中使用的變量嗎?


添加新的部分以顯示我如何使用Todor回答表格來解決我的問題,因為注釋不接受代碼。

固定的Python文件:

    def create_the_thing():
        a = 'Testing'
        return a

    def do_the_thing(thing):
        print(thing)

固定的RF文件:

    *** Settings ***
    Variables    [path_to_py_file]
    Library    [path_to_py_file]

   *** Test Cases ***

   Make Something
       ${thingy}    Create The Thing
       Set Global Variable    ${thingy}

   Do Something
       Do The Thing    ${thingy}

現在看看我是否可以將所有這些與Sikuli的RF實現一起使用:)

也許您應該閱讀有關python中變量作用域的更多信息-這有點技術性的解釋 ,該語言的FAQ中的相關條目以及更淺的內容

本質上,如果您在函數內部定義變量,則該變量將綁定到該變量,並且其范圍僅限於該函數(例如,其生存期僅在函數執行期間)。 當執行點離開函數時,該變量將不再存在。
當您想到它時,這是很有意義的-您不希望全局名稱空間被使用的所有中間變量污染,而且這會導致很多沖突和意外的副作用。

這就是您的代碼所發生的-函數create_the_thing()定義了一個變量-該變量對它而言是本地的,並且對於同一模塊中的任何其他函數都不可見/不存在。
我確定您給出的代碼在通過python解釋器運行時會拋出相同的NameError異常,而不會涉及Robotframework。

您的問題有不同的解決方案,這里有幾個。

使用返回的值和參數傳遞。

這是最干凈的一種-生成某些內容的函數(在您的情況下為文件列表)在執行結束時將其返回; 使用生成的內容(相同文件列表)的函數將其接受為調用參數。 因此,您具有隔離性-他們每個人都有一個(不同的)目的,並且彼此之間沒有硬性依賴。 在python中說:

def create_the_thing():
    a = 'Testing'
    return a

def do_the_thing(thing):
    print(thing)

the_thing = create_the_thing()
do_the_thing(the_thing)

在射頻中的用法:

${thingy}=    Create The Thing
Do The Thing    ${thingy}

使用全局變量。

全局變量是在模塊作用域級別定義的變量,可用於其所有功能。 始終可用,您必須謹慎使用它們(它們是共享狀態,具有所有后果),但是非常方便。 因此在python中:

a = 'I am global!'

def create_the_thing():
    global a
    a = 'Testing'

def do_the_thing():
    print(a)

do_the_thing()
# you get "I am global!"

create_the_thing()
do_the_thing()
# and now - "Testing"

如您所見,更改是通過使用global關鍵字定義變量的,因此指示解釋器所有更改都是針對全局變量“ a”的,而不是針對限於函數范圍的一個。

Robotframework中的用法-與您的示例相同。


還有其他方法-例如在python代碼內部或在RF關鍵字中使用RF的Set Global/Suite/Test Variable 歸結為設計選擇。

如果要從python函數獲取Varialbe a ,則應在RF中創建一個變量以從python函數接收值,然后可以執行以下代碼

${a}=   Create The Thing
Set Global Variable     ${a}
Log To Console    ${a}

並且您的python代碼應使用return作為返回值

def create_the_thing():
        a = 'Testing'
        return a

從Python文件傳遞變量到機器人框架變量的鏈接在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM