如何在robotframework中从python类中获取self对象

如何在robotframework中从python类中获取self对象,python,oop,robotframework,Python,Oop,Robotframework,Engine.py将导入几个类作为自对象 Engine.py from api import api from cloud import cloud class Engine(object): def __init__(self, env): session = dict() self.api = api.API(session) self.cloud= cloud.CLOUD(session) class API(object):

Engine.py将导入几个类作为自对象

Engine.py

from api import api
from cloud import cloud
class Engine(object):
    def __init__(self, env):
        session = dict()
        self.api = api.API(session)
        self.cloud= cloud.CLOUD(session)
class API(object):
    def __init__(self, session):
        self.session = session

    def api_keyword(self):
        return SOMETHING
api.py

from api import api
from cloud import cloud
class Engine(object):
    def __init__(self, env):
        session = dict()
        self.api = api.API(session)
        self.cloud= cloud.CLOUD(session)
class API(object):
    def __init__(self, session):
        self.session = session

    def api_keyword(self):
        return SOMETHING
我的问题是:

如何使用api.py和cloud.py下的关键字并仅将Engine.py导入robot文件

test.robot

*** Settings ***
Library         Engine.py  ${env}


*** Test Cases ***
python class test
    [Tags]    class
    Engine.api.api_keyword
我收到了错误信息:


未找到名为“Engine.api.api_keyword”的关键字。

Robot框架仅将类方法映射到关键字;您的类
引擎
不公开
api
中的任何方法-它可能在内部使用它们,但不将任何方法定义为自己的方法。
因此,这里是您的第一个解决方案-为案例中需要的所有内容创建包装器方法:

def an_api_method(self):
    self.api.something()
现在,您可以在案例中使用
API方法
关键字


解决方案二-使您的类继承其他两个:

class Engine(api, cloud):
,您的案例将可以访问所有其公共方法。
这是一个更复杂的问题-您必须调用它们的构造函数(使用
super()
),如果您在类中维护一个状态,您必须适应它。也就是说,需要更剧烈的代码更改


第三种解决方案不需要对
Enhine
代码进行任何更改,但是,免责声明:我不知道它是否有效:)(我不在电脑旁)。
它由两个调用组成-首先使用
Get Library Instance
获取导入库的对象(从内置库),然后使用-
Call方法

${ref}=     Get Library Instance    Engine
Call Method     $ref.api    api_keyword

在机器人测试级别,您可以做的事情不多。你能改变Engine.py吗?@BryanOakley是的,我能改变Engine.py。我需要让API和XCLOUD共享self.session