1

在我的一个项目中,我们在使用各种 ECU 和 PC 的复杂测试环境中使用带有自定义关键字库的 Robot Framework。一个关键字库必须由 python 远程服务器通过 XML-RPC 控制,因为它必须在另一台 PC 上。

现在,来自robot.api.logger 调用的所有重要消息,例如logger.debug()oder logger.console(),都被XML-RPC 吞没了。这是一个已知问题,在docs中也有明确说明。

在大多数情况下,这些 API 的工作方式与正常使用 Robot Framework 时完全一样。主要限制是目前不支持使用robot.api.logger 或Python 的日志模块进行日志记录。

可以为 编写一个瘦包装器或装饰器robot.api.logger,以便将所有调试消息重定向到一个简单的 txt 文件,例如:

DEBUG HH:MM:SS > Message
WARN  HH:MM:SS > Message

如果出现问题,这将非常有帮助。

当然,使用内置的 python 日志记录模块很容易,但我正在寻找一个解决方案,改变现有代码的最少数量,并且我还希望将结果写入文本文件,而不是正常robots.api.logging 到机器人报告,因为我们以本地和远程方式使用相同的库。

所以基本上我需要找到一种方法来扩展/重定向robot.api.logger调用,首先使用普通的 python 日志记录模块,然后使用普通的robot.api.logger.

4

1 回答 1

2

您可以修补 的写入功能,robot.api.logger以便它也可以写入日志文件。这个补丁可以由库参数触发。这将要求您仅修改库的构造函数。

远程库.py

import sys

from robot.api import logger
from robot.output import librarylogger

from robotremoteserver import RobotRemoteServer
   
def write(msg, level='INFO', html=False):
    librarylogger.write(msg, level, html)
    with open('log.txt', 'a') as f:
        print(f'{level}\tHH:MM:SS > {msg}', file=f)
    

class RemoteLib():
    ROBOT_LIBRARY_SCOPE = 'GLOBAL'
    ROBOT_LIBRARY_VERSION = 0.1
    
    def __init__(self, to_file=True):
        if to_file:
            logger.write = write
        
    def log_something(self, msg):
        logger.info(msg)
        logger.debug(msg)
        logger.warn(msg)
        logger.trace(msg)
        logger.error(msg)
        logger.console(msg)
        
if __name__ == '__main__':
    RobotRemoteServer(RemoteLib(), *sys.argv[1:])

local_run.robot

*** Settings ***
Library    RemoteLib    to_file=False

*** Test Cases ***
Test
    Log Something    something    

远程运行机器人

*** Settings ***
Library       Remote    http://127.0.0.1:8270

*** Test Cases ***
Test
    Log Something    something    

您也可以在补丁中使用 Python 日志记录模块,write就像它在机器人框架本身中使用的一样,如果机器人未运行,则将 robot.api.logger 重定向到 python 日志记录

于 2020-09-27T10:21:00.247 回答