如何使用python在机器人框架中导入和使用用户定义的枚举类

问题描述 投票:0回答:3

我目前正在机器人框架中实现一些测试用例。断言检查整数是否有效。我想将其更改为枚举值。这是我的基本要求。

这是我正在使用的机器人文件(

TestCase.robot
)

*** Settings ***
Library           Wrapper.py

*** Test Cases ***
TC_01
    ${rv}    Set Variable    ${0}    #${}
    Should Be Equal As Integers    ${rv}    0

Should Be Equal As Integers    ${rv}    0
行中,我想将该整数转换为某个枚举值,而不是这个整数值
0
断言。

类似这样的事情。

Should Be Equal As Integers    ${rv}    Status.OK

其中

Status
是在
Wrapper.py
中定义的枚举类。此
Wrapper.py
包含在
TestCase.robot
中,作为此
robot
文件中的 Library。我可以在此处粘贴该枚举的内容

class Status(Enum):
    OK = 0
    NOT_OK = 1

这样我们就可以使其更具可读性,而不是整数。当我这样给出时,我收到错误如下

'(Status.OK)' cannot be converted to an integer: ValueError: invalid literal for int() with base 10: '(status.ok)'

你们能帮忙解决这个问题吗?

python enums robotframework
3个回答
6
投票

有几件事 - 首先也是最重要的,您想要比较值,即

Enum.member_name.value
属性,正如已经指出的那样。
其他事情 - python Enum 有点特殊,它没有实例化 - 这会阻止您导入具有相同名称的类的模块(直接引用它) - Robot Framework 在这些导入中创建该类的实例。因此无法直接访问该值。

不过,有一个解决方案 - 创建一个包装器(函数,在我的示例中,但可以是同级类的方法),它将返回目标值。示例Python:

def return_enum_value(member):
    return Status[member].value


class Status(Enum):
    OK = 0
    NOT_OK = 1

射频的使用:

${the value}=    Return Enum Value  OK
Should Be Equal As Integers         0    ${the value}

1
投票

我不认为有一个完全符合你想要的解决方案——那就是能够写

${Status.OK}
。至少我在花了一段时间搞砸之后没有让它发挥作用。如果确实有解决办法,请在评论区告诉我。

另外,如果我只写:

from enum import Enum


class StatusEnum(Enum):
    OK = 0
    NOT_OK = 1


print(StatusEnum.OK)

它将打印出

StatusEnum.OK
,而不是您可能期望的
0
。您需要写
Status.OK.value
才能得到
0
。有关更多信息,请参见 docs

所以,我能做到的最接近的是:

状态.py

from enum import Enum
from robot.api.deco import library, keyword


class StatusEnum(Enum):
    OK = 0
    NOT_OK = 1


@library
class Status:

    @keyword
    def status_ok(self):
        return StatusEnum.OK.value

    @keyword
    def status_not_ok(self):
        return StatusEnum.NOT_OK.value

在射频中:

*** Settings *** 
Library    Status.py

*** Test Cases ***
Check OK And NOT OK
    ${OK}=    Status Ok
    ${NOT_OK}=    Status Not Ok
    Should Be Equal As Integers    ${OK}    0
    Should Be Equal As Integers    ${NOT_OK}    1

但是老实说,当我可以这样做时,感觉太麻烦了:

*** Variables ***
${OK}=    0
${NOT_OK}=    1

*** Test Cases ***
Check OK And NOT OK  
    Should Be Equal As Integers    ${OK}    0
    Should Be Equal As Integers    ${NOT_OK}    1

0
投票

不知道这是否与某人相关,但我能够以这种方式使用枚举:

my_enum.py:

from enum import Enum

class MyEnum(Enum):
    FOO = 1
    BAR = 2

enum_suit.robot:

*** Settings ***
Variables    my_enum.py

*** Test Cases ***
My Test
    Check Enum

*** Keywords ***
Check Enum
    Log To Console    ${MyEnum.FOO.value}  =>  1
© www.soinside.com 2019 - 2024. All rights reserved.