机器人框架:访问同一个库的多个资源文件

时间:2018-01-30 14:52:57

标签: robotframework

Hello for all RobotFramework用户

问题

我们在不同的抽象层次上有很多关键字,并且正在寻找一种简单的方法来导入它们,同时在IDE中保持对自动完成等的支持。

继承可能如下所示:

   /---------------------> basic_keywords.robot <---\
  /                             ^                    \
 /                              |                    |
 |  advanced_keywords_1.robot --/            advanced_keywords_2.robot
 |            ^
 |            |
more_advanced_keywords_1.robot

提案1:导入all_keywords.robot

中的所有关键字

all_keywords.robot

*** Settings ***
Library     SomeLibrary.py
Resource    basic_keywords.robot
Resource    advanced_keywords_1.robot
Resource    more_advanced_keywords_1.robot
Resource    advanced_keywords_2.robot

more_advanced_keywords_1.robot

# No Import of basic_keywords.robot here!!!
*** Keywords ***
My More Advanced Keyword
    Advanced Keyword   # from advanced_keywords.robot
    Basic Keyword      # from basic_keywords.robot

在测试套件中导入:

*** Settings ***
Resource   all_keywords.robot

优点:

  • 这适用于执行。
  • 在任何测试套件中都有相同的行,我们可以访问所有关键字。
  • 我们不需要在每个高级关键字文件中导入必要的关键字,这会导致双重导入。

缺点:

  • 不支持自动填充等,因为advanced_keywords.robot不了解basic_keywords.robot
  • 在测试套件中导入许多(通常不使用)关键字,会降低性能(?)

提案2:在basic_keywords

中引用advanced_keywords ...

@Todor提议

advanced_keywords.robot

*** Settings ***
Resource    basic_keywords.robot
*** Keywords ***
Advanced Keyword
    Basic Keyword      # from basic_keywords.robot

more_advanced_keywords_1.robot

Resource    advanced_keywords.robot
# basic_keywords is imported here by advanced_keywords.robot
*** Keywords ***
My More Advanced Keyword
    Advanced Keyword   # from advanced_keywords.robot
    Basic Keyword      # from basic_keywords.robot

双重导入由Robot Framework处理。

在测试套件中导入:

*** Settings ***
Resource   more_advanced_keywords_1.robot
Resource   advanced_keywords_2.robot

优点:

  • 这适用于执行
  • 支持自动完成等,因为IDE知道Advaned Keyword的定义位置
  • 更好地控制哪些关键字可用,更快

缺点:

  • 您必须明确决定/导入您在测试套件中使用的advanced_keywords

ROBOT_LIBRARY_SCOPE = 'GLOBAL'中的SomeLibrary.py可以阻止图书馆的双重实例化,请参阅Robot Framework makes two instances from the class instead of oneRobot Framework User Guide

其他提案?

两个提案都有利有弊。有什么建议?你会提出什么样的结构?

2 个答案:

答案 0 :(得分:0)

这是与PyCharm IDE相关的问题,我用RED Robot Editor做了一个例子,它正确处理了继承的资源:

project structure:
  res/basic.robot contains basic kw
  res/advanced.robot imports basic.robot -> all kws from basic are avaliable and validated
  res/even_more_adv.robot imports advanced.robot -> all kw from advanced + all kw from basic
  main_testsuite.robot imports res/even_more_adv.robot -> all kw from even_more + advanced + basic resources are visible

我很确定RIDE也会处理这种情况,尽管我没有安装它。

答案 1 :(得分:0)

解决方法在什么级别不起作用?

从常识(以及与PyCharm的个人经验)来看,在仅导入basic.robot的套件中,来自more_advanced_keywords_1.robot 的关键字将可解析 - 它们通过以下方式间接导入basic,因此在当前背景下。

编辑more_advanced_keywords_1时,我认为没有一个IDE会解析advanced_keywords_1basic中的关键字。原因是当前文件无法单独访问它们。

在一个使用情境(套件A)中,消费者可能已导入此文件(more_advanced_keywords_1)和另一个(advanced_keywords_1)并可访问后者的关键字;但在另一个背景下(套件B),消费者可能只导入了more_advanced_keywords_1 那么,如果more_advanced_keywords_1引用advanced_keywords_1中的关键字,那么B中会有什么?它会在运行时失败,因为此时关键字未定义(可访问) 这与IDE在编辑advanced_keywords_1时无法解析basicmore_advanced_keywords_1中定义的关键字的原因相同 - 它在当前上下文中无法访问它们。

您有两种选择:

  • 咬紧牙关,没有IDE解析更深层次的关键字文件;它仍然适用于套房,所以这是可以忍受的。
  • 使用双重导入 - basic导入advanced_keywords_1advanced_keywords_1导入basic;它可能听起来很可怕或错误,但机器人框架(实际上是py)管理它就好了。即使是循环导入也不会导致问题(导入b,b导入a)。

过去我有一个像你一样的结构 - 一个主关键字文件,导入20多个二级资源文件,其中一些导入第三级。我使用了双重导入并没有遇到问题(唯一的请求 - 没有关键字名称冲突) 从那时起,我转向更破碎的结构 - 没有主文件,套件只导入他们需要的资源。原因 - 更轻和更快的初始加载,主要是 - 我厌倦了在当前命名空间中始终可用的1000多个关键字 - 例如出现在自我暗示中:)