【问题标题】:implementation issue in the run_keyword method in robot framework custom keyword using dynamic library使用动态库的机器人框架自定义关键字中的run_keyword方法中的实现问题
【发布时间】:2019-08-10 01:40:29
【问题描述】:

我正在使用python学习机器人框架中的动态库实现。在这个过程中,我使用this链接中解释的动态库创建了一个新关键字。

源码如下

import logging


class libdynamicsampl1:
    def get_keyword_names(self):
        return ["methOne", "methTwo"]

    def methOne(self):
        logging.info("called the methone")

    def methTwo(self, name):
        logging.info("called the methtwo with the arg as" + name)

    def run_keyword(self, name, args):
        print "Running keyword '%s' with arguments %s." % (name, args)
        methArgs = (self,) + (args)
        return getattr(self, name, methArgs)()

当我从机器人文件中运行这个关键字时,就像下面给出的代码,

*** Test Cases ***
Log Dynamic Test Library
    Invoke dyn tests no arg
    Invoke dyn tests with arg

*** Keywords ***
Invoke dyn tests no arg
    meth one

Invoke dyn tests with arg
    meth two    "welcome to awesome robot framework"

有如下错误,推断是methTwo取“self”和“name”,但使用getattr(...)只传递了我猜的名字。

TypeError: methTwo() 只需要 2 个参数(给定 1 个)

请帮助解决此问题或就如何根据输入参数调用方法提出最佳实践/实施建议。没有来自机器人框架站点的示例,因此任何修复都会非常有帮助。

run_keyword 方法中的以下实现工作正常,但我觉得它不是在生产就绪代码库中实现的最佳实践。

def run_keyword(self, name, args):
    print "Running keyword '%s' with arguments %s." % (name, args)
    if name == "methOne":
        return self.methOne()
    if name == "methTwo":
        return self.methTwo(args[0])

【问题讨论】:

  • 你想完成什么?你想要“meth one”(有一个空格)调用methOne 方法吗?您发布的代码没有给出您所说的错误。它会给出错误No keyword with name 'meth one' found.
  • 在您的链接中,您可以参考 Robot Framework 2.8.7 的文档。这是故意的,还是偶然的?在当前版本的 Robot Framework 中,Dynamic Library 上的文档包含更多示例。
  • @BryanOakley,我在上面提到的机器人文件中调用并测试了libdynamicsampl1.py。我不确定如何使用 run_keyword 实现。虽然文档给出了打印出正在调用的方法名称的示例,但没有提及如何实时调用该方法,这意味着我们应该调用该方法,因为机器人框架无法识别哪个我们实际调用的方法。应该如何实现以便调用方法。文档缺少机器人文件消耗和实时示例
  • @A.Kootstra,文档非常好,但是当我们无法组合并制作完整示例时,有一些 sn-ps 的代码没有真正的用处。如果文档涵盖了单个代码库中的各种主题,并最终制作了可用作参考的完整功能流程或测试,那将非常有帮助。
  • 是的,这就是文档声称我们可以通过大小写字符或“_”调用方法的内容,所以我想尝试一下。

标签: python robotframework


【解决方案1】:

使用 getattr(...) 只传递我猜的名称。

这取决于您如何定义“仅名称”。 getattr 将返回函数,它对函数参数一无所知。但是,它返回的函数将是对象上的一个方法,因此您不必担心传递self 参数。

考虑这段代码:

return getattr(self, name, methArgs)()

和这段代码一样(假设name是一个有效的方法名)

func = getattr(self, name, methArgs)
func()

暂时假设getAttr返回self.methTwo,上面的代码与此相同:

self.methTwo()

请注意,在上面的代码中,您的代码没有传递任何参数。在getattr 中使用时,该变量不代表参数,它代表默认方法名称,以防所请求的方法不存在。换句话说,当name 有效时,getattr 将简单地忽略methArgs

由于您的一个方法需要一个参数 (name ),您将收到一个错误,即它没有收到它预期的所有参数。显然,这正是发生的事情。

您的示例还有其他问题,因此我无法确定确切的解决方案。不清楚您是否希望测试中的meth one 调用methOne,或者meth onemethOne 是否是一个错字。

假设你在两个地方都使用了正确的名字,你可以直接用getattr把名字转换成方法,和你现在做的差不多。区别只是您需要将参数传递给函数而不是getattr

例如,给定这个机器人代码sn-p:

Invoke dyn tests with arg
    methTwo    "welcome to awesome robot framework"

为了让机器人代码运行,您将如何实现 run_keyword

def run_keyword(self, name, args):
    print "Running keyword '%s' with arguments %s." % (name, args)
    func = getattr(self, name)
    return func(*args)

【讨论】:

  • 在上述方法中使用func(*args) 效果很好。非常感谢您的澄清。
猜你喜欢
  • 1970-01-01
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-21
  • 2018-06-27
  • 1970-01-01
  • 2018-08-01
  • 2017-11-27
相关资源
最近更新 更多