为Robot框架中的循环导入内部库

2024-04-19 21:45:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为网站的消息传递功能编写一个测试。 在这个测试中,我使用了一个关键字,它应该遍历一个用户列表,找到每个用户的聊天窗口,然后导入一个用Python编写的自定义库,该库保存测试的通过/失败逻辑。自定义库应将消息发送者的订阅类型、接收消息的用户的订阅类型以及初始发送的消息作为参数

测试用例如下所示:

*** Settings ***
Variables   ../resources/usersToMessage.py
Variables  ../resources/messageSenders.py
Resource  ../chatTests/chatTests.resource

*** Test Cases ***

DemoTest
    [Documentation]     send messages to other users
    [tags]  demo
    [Template]  Log in as user and send messages
    FOR     ${user}     IN      @{messageSenders}
            ${user}
    END



*** Keywords ***
Log in as user and send messages
    [Arguments]     ${testcase}
    Send Messages

Send Messages
    ${randomString}=   generate string
    Set Global Variable  ${SENT_MESSAGE}  ${randomString}
    ${arguments}=      Create List     LogMany      conversationBox    ${randomString}
    Locate Conversations  ${arguments}       @{usersToMessage}


Locate Conversations
    [Arguments]   ${arguments}   @{users}
    FOR     ${user}     IN   @{users}
        Log Many      ${user}   @{arguments}
        Log     ${user}[username]
        Import Library     Services.ChatTestCase  BASIC  ${user}[subscription]    ${SENT_MESSAGE}
        ${expected_chat_message}=   expected chat message
        Log Many    the current user subscription is ${user}[subscription]  the expected chat message is ${expected_chat_message}
        Log     /messages/${user}[userid]
        Log    ${HOMEPAGE}${messages}${user}[userid]
        Run Keyword     @{arguments}
    END




Send
    [Arguments]     ${message}
    Log     The random message is ${message}

ChatterStCase库如下所示:

class ChatTestCase:


    ROBOT_LIBRARY_SCOPE = "TEST"

    unlimited_messaging_subscriptions = ("VIP","PREMIUMPLUS","PLATINUM","GOLD")

    def __init__(self, subscription_of_sender, subscription_of_receiver, sent_message):
        self.subscription_of_sender=subscription_of_sender.upper()
        self.subscription_of_receiver=subscription_of_receiver.upper()
        self.sent_message=sent_message
        self.should_deliver_message = True
        self.count = 0


    def expected_chat_message(self):
        self.count+=1
        print(f'no of expected_chat_message method passes is {self.count}')
        #print(f'value of variable should_deliver_message is {self.should_deliver_message}')
        if self.subscription_of_sender == "BASIC" and self.subscription_of_receiver not in self.unlimited_messaging_subscriptions:
            self.should_deliver_message = False
        elif self.subscription_of_receiver == "BASIC" and self.subscription_of_sender not in self.unlimited_messaging_subscriptions:
            self.should_deliver_message = False

        if self.should_deliver_message:
            print(f'value of variable should_deliver_message is {self.should_deliver_message}')
            return self.sent_message
        else:
            print(f'value of variable should_deliver_message is {self.should_deliver_message}')
            self.should_deliver_message = True
            return "CONTACT+"

问题在于,Import Library关键字似乎只在第一次迭代中实例化了chattercase类一次。在Robot框架文档中,它表示如果一个库使用不同的参数多次导入,它将为for循环中的每个迭代实例化该类

Robot Framework log

我尝试用一个虚拟库替换正在导入的自定义库,同样的情况也发生了

有人知道是否有任何方法可以从FOR循环内部动态导入自定义库吗


Tags: ofselflogmessageischatargumentssender
1条回答
网友
1楼 · 发布于 2024-04-19 21:45:48

您确定应该多次实例化它吗?关键字^{}没有提到类似的内容。您已经在library scope下的用户指南中阅读了它,但这并不意味着它甚至适用于关键字

我找到了这个解决方案,我觉得这个解决方案很笨拙,但它的工作原理与您预期的一样,即在运行时在for循环中创建一个库的多个实例

我的示例库:

from robot.api import logger


class TestLibrary(object):
    

    ROBOT_LIBRARY_VERSION = 1.0
    ROBOT_LIBRARY_SCOPE = 'TEST' 

    def __init__(self, num):
        self.count = 0
        self.num = num

    def log_params(self):          
        logger.console('count: {0} - num: {1}'.format(self.count, self.num))
        self.count += 1

测试用例:

*** Test Cases ***
Library Imports
    FOR    ${i}    IN RANGE    1    5     
        ${name}=    Set Variable    Test${i}   
        Import Library    ${CURDIR}/../../Libraries/TestLibrary.py    ${i}    WITH NAME    ${name}          
        Set Library Search Order    ${name}
        Log Params
    END

输出为:

count: 0 - num: 1
count: 0 - num: 2
count: 0 - num: 3
count: 0 - num: 4

这与在for循环的每次迭代中self.count都递增的情况不同

这里的关键是我为每个实例指定不同的名称(${name}),并从上次创建的实例开始搜索关键字Log Params

相关问题 更多 >