我有一个用文件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
我已在Robot Framework中导入如下:
Library MyClass WITH NAME my_component
我还有一个关键字,它调用传递给它的对象的方法:
testing component
[Arguments] ${cmp}
log to console ************* ${cmp}
${result} = ${cmp}.mymethod
我有从类MyClass
实例化的多个对象,并且每个对象都有不同的属性。我想使用testing component
关键字获取其属性,而不管对象本身。
当我致电testing component
时my_component
:
Test Method Call
testing component my_component
我明白了:
No keyword with name '${cmp}.mymethod' found.
如果我在关键字testing component
中以这种方式调用它:
${result} = call method ${cmp} mymethod
我明白了:
Object 'my_component' does not have method 'mymethod'.
我还尝试call method my_component mymethod
进行测试,然后我再次获得Object 'my_component' does not have method 'mymethod'.
。
但是当我使用${result} = my_component.mymethod
时,一切正常。
答案 0 :(得分:5)
关于如何调用python对象方法的问题的字面答案是您可以使用扩展变量语法(例如:${cmp.mymethod()}
或者您可以使用call method
关键字(例如:{ {1}})。
例如,robot中的常规标量变量是python字符串对象。因此,我们可以调用它们上的方法,例如call method ${cmp} mymethod
和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
和my_component
所代表的内容的误解。它们不是不是 python对象。相反,它是机器人框架库的名称。尽管在引擎盖下它可能作为对库中定义的类的实例的引用而存在,但在测试中${cmp}
只是库的名称。
这就是my_component
有效的原因 - my_component.my_method
是库的名称,my_component
是该库中关键字的名称。这是标准的机器人框架语法。请参阅机器人框架用户指南中的Specifying a keyword explicitly。
如果您希望能够像my_method
一样传递my_component
,则可以使用run keyword
来运行该库中实施的关键字。
例如,首先使用以下代码创建MyClass.py
:
class MyClass(object):
def mymethod(self):
return "Hello, world"
如果您将call method
替换为run keyword
:
*** Keywords ***
testing component
[Arguments] ${cmp}
log to console ************* ${cmp}
${result} = run keyword ${cmp}.mymethod
最后,如果你真的想要传递实际的库 object ,你可以使用内置的关键字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}
奇怪的是,扩展变量语法在这种情况下不起作用。我不知道为什么。