如何在Robot Framework中保留对象状态

2022-03-15 00:00:00 python robotframework

问题描述

我是Robot Framework的新手,我已经编写了几个关键字,它们调用.py文件中的方法。所有这些Python方法都放在文件llk_machine.py的一个类中。

下面是我的TestCase文件:

    *** Settings ***

Variables         /repo/user/var_attero.py

Library           %{ROBOTREPO}/Lib/LIB_LLK/llk_machine.py    WITH NAME    class1

    *** Keywords ***
CONNECT

        [Documentation]    Connects to Machine.
        ${CONNECT_PASS_or_FAIL}=    class1.llk_Connect
        [Return]    ${CONNECT_PASS_or_FAIL}

CONFIGURE_DELAY

         [Arguments]    ${port_number}=1    ${fixed_delay}=25000
         [Documentation]    Configure impairment in the active testbed.
         ${pass_fail_status}=    class1.llk_Config_Impair_fixed    ${port_number}  ${fixed_delay}
         [Return]    ${pass_fail_status}
llk_Connect和llk_Config_imair_Fixed是Python文件中的两个方法。通过关键字CONNECT,我正在连接到机器。当我执行这个测试用例时,它执行得很好,并且通过了。然后,当我选择第二个测试用例来配置延迟时,我得到一个错误消息"无法连接机器"。但我已通过第一个测试用例连接到计算机,当我进行物理检查时,计算机已连接到我的计算机。

因此,当我选择第二个关键字时,我认为另一个对象正在实例化,并且正在请求到计算机的新套接字连接,这显然是失败的,因为计算机已经在与其他套接字通信,无法接受另一个连接。

当我同时执行这两个测试用例时,它工作得很好。当我逐个分别执行它们时,就会出现问题。

如何防止为每个测试用例创建新对象,并且在整个测试周期中只有一个对象。请帮助我。

谢谢。


解决方案

默认情况下,Robot将为每个测试用例创建一个新的关键字库实例,特别是这样测试用例就不会继承其他测试用例的状态。

您可以通过在实现关键字的python文件或类中添加特殊变量来更改此行为。此变量名为ROBOT_LIBRARY_SCOPE。您可以将其设置为以下文字字符串之一:

  • "TEST CASE"-为每个测试用例创建一个新实例。可能的套间设置和套间拆卸共享另一个实例。这是默认值。

    /li>
  • "TEST SUITE"-为每个测试套件创建一个新实例。最低级别的测试套件由测试用例文件创建并包含测试用例,它们都有自己的实例,而较高级别的套件都有自己的实例用于可能的设置和拆卸。

  • "GLOBAL"-在整个测试执行过程中只创建一个实例,它由所有测试用例和测试套件共享。从模块创建的库始终是全局的。

注意:以上描述来自robot framework user guide中的Test library scope一节。

例如,要在套件中的所有测试之间共享状态,您的python文件的顶部可能如下所示:

# llk_machine.py
ROBOT_LIBRARY_SCOPE = "TEST SUITE"
...
def llk_Connect(...):
    ...

如果关键字是与文件同名的类上的方法,则应将变量设置为该类的属性

# llk_machine.py
class llk_machine(...):
    ROBOT_LIBRARY_SCOPE = "TEST SUITE"
    ...

在robot framework user guide

的"Test library scope"部分可以找到更完整的示例

相关文章