如何将对象传递给机器人框架中的关键字?

Sar*_*rvi 6 python object method-call robotframework

我有一个MyClass写在文件中的python类MyClass.py:

class MyClass(object):
    def __init__(self):
        self.myvar = list()

    def setvar(self, val):
        self.myvar = val

    def mymethod(self):
        return self.myvar
Run Code Online (Sandbox Code Playgroud)

我在Robot Framework中导入如下:

Library         MyClass    WITH NAME    my_component
Run Code Online (Sandbox Code Playgroud)

我还有一个关键字,它调用传递给它的对象方法:

testing component
    [Arguments]       ${cmp}
    log to console    ************* ${cmp}
    ${result} =       ${cmp}.mymethod
Run Code Online (Sandbox Code Playgroud)

我有几个从类实例化的MyClass对象,每个对象都有不同的属性.testing component无论对象本身如何,我都希望使用关键字获取其属性.

当我打电话testing component传球my_component:

Test Method Call
    testing component    my_component
Run Code Online (Sandbox Code Playgroud)

我明白了:

No keyword with name '${cmp}.mymethod' found.
Run Code Online (Sandbox Code Playgroud)

如果我在关键字中这样调用它testing component:

${result} =    call method     ${cmp}   mymethod
Run Code Online (Sandbox Code Playgroud)

我明白了:

Object 'my_component' does not have method 'mymethod'.
Run Code Online (Sandbox Code Playgroud)

我也尝试call method my_component mymethod过测试,我又来了Object 'my_component' does not have method 'mymethod'..

但是当我使用时${result} = my_component.mymethod,一切正常.

Bry*_*ley 5

关于如何调用python对象的方法的问题的字面上答案是,您可以使用扩展变量语法(例如:;${cmp.mymethod()}或者可以使用call method关键字(例如:)call method ${cmp} mymethod

例如,robot中的普通标量变量是python字符串对象。因此,我们可以在它们上调用诸如lower()和的方法upper()。以下测试案例展示了如何使用我前面提到的两种机制在字符串上调用这些方法:

*** Variables ***
${message}    Hello, world    # a python string object

*** Test cases ***
Example
    # Example using "Call method" keyword
    ${lower}=    call method    ${message}    lower
    should be equal    ${lower}    hello, world

    # Example using extended variable syntax
    ${upper}=    set variable    ${message.upper()}
    should be equal    ${upper}    HELLO, WORLD
Run Code Online (Sandbox Code Playgroud)

代码的问题是您对什么my_component${cmp}代表有误解。它们不是 python对象。而是它是机器人框架库的名称。即使在后台,它也可以作为对库中定义的类的实例的引用而存在,但是从测试内部来看,库my_component名称只是简单的。

这就是my_component.my_method起作用的原因- my_component是库my_method的名称,也是该库中关键字的名称。这是标准的机器人框架语法。请参阅《机器人框架用户指南》中的“ 明确指定关键字”

如果希望my_component像对象一样传递,可以使用run keyword运行在该库中实现的关键字。

例如,首先MyClass.py使用以下代码创建:

class MyClass(object):
    def mymethod(self):
        return "Hello, world"
Run Code Online (Sandbox Code Playgroud)

如果将代码替换为call method,则代码可以正常工作run keyword

*** Keywords ***
testing component
    [Arguments]       ${cmp}
    log to console    ************* ${cmp}
    ${result} =       run keyword   ${cmp}.mymethod
Run Code Online (Sandbox Code Playgroud)

最后,如果您真的想传递实际的库对象,则可以使用内置关键字Get Library Instance来获取实际的库对象,然后可以将其与Call Method一起使用。

*** Keywords ***
testing component
    [Arguments]       ${cmp_name}
    ${cmp}=  Get library instance    ${cmp_name}
    log to console    ************* ${cmp}
    ${result} =       call method    ${cmp}    mymethod
    [return]          ${result}
Run Code Online (Sandbox Code Playgroud)

奇怪的是,扩展变量语法在这种情况下不起作用。我不知道为什么