gpt4 book ai didi

python - 如何在 Python 和 RobotFramework 之间传递在 Python 函数中创建的变量

转载 作者:行者123 更新时间:2023-11-28 21:35:09 25 4
gpt4 key购买 nike

我试图弄清楚如何在(两个方向)python文件和RobotFramework之间传递变量。我的目标是在 python 中有一个函数收集值(文件夹名称)并将它们存储在一个变量中,然后由另一个函数使用,然后该函数将连续测试每个文件夹名称。我的目标是利用 RF 的测试报告功能来生成通过/失败的文件夹通过/失败报告。

(文件夹名称/位置会改变,这就是为什么我不想对它们进行硬编码,而是选择使用一些代码通过文件选择器菜单收集文件夹名称 - 但是一旦我得到这些更多基本问题已解决:))

我发现这个例子是关于从 python 文件中获取一个变量并让 RF 识别它并用它做一些事情——在这种情况下是 Log To Console。 how to pass values from python code to variable of robot framework

我已经尝试了链接中的示例,它确实有效。我遇到的第一个麻烦是将变量放入函数中时。

所以我的 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

我希望“创建事物”会运行,这将使变量成为“a”。然后我会认为变量'a'将被传递回RF(如链接示例中所示),然后将其记录到控制台。

我不知道如何在两个测试用例之间传递变量“a”。也许设置全局变量关键字?

相反,我看到“未找到变量 ${a}”作为第一个测试的错误,而“NameError: global name 'a' is not defined”作为第二个测试的错误。

我知道测试 2 失败了,因为在第一次测试中该变量从未传回 RF,但是有没有办法让测试作为关键字运行,然后返回一个以后可以在其他测试中使用的变量?

添加一个新部分以显示我如何使用 Todor 回答表单来解决我的问题,因为评论不接受代码。

修复了 Python 文件:
    def create_the_thing():
a = 'Testing'
return a

def do_the_thing(thing):
print(thing)

固定射频文件:
    *** 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 中变量作用域的内容——这里也有一些 technical explanation ,语言的FAQ 中的相关条目和 something lighter .

本质上,如果你在函数内部定义一个变量,它就会绑定(bind)到它,并且它的作用域仅限于函数(例如,它的生命周期仅在函数执行期间)。当执行点离开函数时,该变量不再存在。
当您想到它时,这非常有意义 - 您不希望您的全局命名空间被您使用的所有中间变量污染,而且这会导致很多冲突和意想不到的副作用。

这就是您的代码发生的情况 - 函数 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 中的用法 - 与您的示例相同。

还有其他方法——比如使用 RF 的 Set Global/Suite/Test Variable , 在 python 代码中或在 RF 关键字中;它归结为设计选择。

关于python - 如何在 Python 和 RobotFramework 之间传递在 Python 函数中创建的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52547101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com