如何在Robot Framework中调用内部对象的方法?
问题
我有一个Inner类,包含get_value、set_value两个方法以及具有默认含义的value属性。另有一个Outer类,会创建Inner等类的实例并将其作为自身属性:
class Outer: def __init__(self, configuration: int): if configuration == 1: self.inner = Inner("Some data") self.other = Other("Some data") elif ... else: self.inner = Inner("Some data") self.other = Other("Some data")
(Outer类始终会有inner、other属性)我想在Robot Framework测试中使用Outer.inner.Get Value和Outer.inner.Set Value ${3}这样的调用方式,该如何实现?
我尝试了“扩展变量语法”方案:
- 给
Outer类添加get_inner方法,返回self.inner; - 在RF中将inner对象赋值给变量
${MyVar}; - 使用
${MyVar.get_value()}调用方法。
但该方式无法直接调用无返回值的方法(如setter):
*** Settings *** Library Path.To.Outer ${1} WITH NAME Out *** Test Cases *** Check setting current ${MyVar} Out.Get Inner ${Initial Value} Set Variable ${MyVar.get_value()} ${New Value} Evaluate ${Initial Value}+${1} ${PS.set_current(3)} # 此处无法运行
get_value可以正常工作,但第四行报错“Keyword name cannot be empty.”。我的目标是用${New Value}替代硬编码值,比如${PS.set_current(${New Value})},请问该如何修正代码?
解决方案
方法一:用Evaluate关键字执行无返回值方法
RF中单独写${变量.方法()}会被识别为空关键字,必须用Evaluate来执行Python表达式,不管方法是否有返回值都能正常运行:
*** Test Cases *** Check setting current ${MyVar} Out.Get Inner ${Initial Value} Set Variable ${MyVar.get_value()} ${New Value} Evaluate ${Initial Value}+${1} # 正确调用set_value方法 Evaluate ${MyVar}.set_value(${New Value})
方法二:给Outer类添加代理方法
如果想要更贴合RF的关键字调用风格,可以在Outer类中新增代理方法,直接转发对Inner对象的调用:
class Outer: # 保留原有__init__逻辑 def get_inner_value(self): return self.inner.get_value() def set_inner_value(self, value): self.inner.set_value(value)
之后在RF中直接调用这些代理关键字:
*** Test Cases *** Check setting current ${Initial Value} Out.Get Inner Value ${New Value} Evaluate ${Initial Value}+${1} Out.Set Inner Value ${New Value}
这种方式可读性更强,符合RF的使用习惯。
方法三:通过Run Keyword配合扩展变量语法
如果一定要用扩展变量语法调用无返回值方法,也可以结合Run Keyword:
Run Keyword Evaluate ${MyVar}.set_value(${New Value})
但这种写法比直接用Evaluate更繁琐,一般不推荐。
内容的提问来源于stack exchange,提问作者Piotr Wasilewicz
相关产品推荐
相关产品推荐

