• RobotFramework二次开发之--输出Message Log


    起因

    因为自己用的是RED这个编辑器,发现每次跑完case之后,编辑器中Message Log一栏展示的log很赞,所以就想保存下来。
    (不了解RED的,可以戳官网http://nokia.github.io/RED/help/了解,可以理解成RIDE的升级版,官方已经抛弃了RIDE的更新,使用了全新的RED作为替代)
    而我平常运行自动化测试case呢,是通过命令行的形式运行,并集成到Jenkins中,自动运行,不走RED,所以也不会看到这一栏啦。
    于是就开始探索这部分log的来源。搜索了无数资料,发现一个有用的:
    https://blog.csdn.net/wyb199026/article/details/78730097
    只是作者用的是RIDE,虽然原理上差不多,但是作为没有仔细研究过RF源码的我来说,还是花了点功夫的。
    那么结合查找资料和自己的经验心得,我对log的理解如下:

    1. 运行时Console展示的日志。如果通过命令行运行,你可以在窗口看到这些日志。如果通过Jenkins启动任务,你可以在[Console Output]中看到这部分日志。如果和我一样用RED编辑器,你会在Console窗口看到这部分日志
    2. 执行后得到的log.html文件,这个会自动输出文件的。
    3. RED编辑器的Message Log窗口展示的日志。如图所示。
      messageLog.jpg

    查找log来源

    接下来看看这部分log是从哪儿得到的,查看Console窗口可以发现,RED也是通过命令行的方式来调用case的,以下是RED执行case时的命令:
    Command: /usr/local/Cellar/python/3.6.4_3/bin/python -m robot.run --listener /var/folders/5y/4z20xf291sbf7l782tdtfnzc0000gn/T/RobotTempDir5265117293107482497/TestRunnerAgent.py:52030 --argumentfile /var/folders/5y/4z20xf291sbf7l782tdtfnzc0000gn/T/RobotTempDir5265117293107482497/args_9cf946db.arg /Users/yunduanapi_test
    发现这里用了一个--listener参数,后面还带了一个TestRunnerAgent.py文件和相应的端口号。
    使用netstat -an | grep 52030发现,当运行case的时候,这个端口是打开的
    tcp4 0 0 127.0.0.1.52030 127.0.0.1.52035 ESTABLISHED
    tcp4 0 0 127.0.0.1.52035 127.0.0.1.52030 ESTABLISHED
    tcp4 0 0 127.0.0.1.52030 . LISTEN
    说明存在socket通讯。
    再去查看TestRunnerAgent.py文件,注释就写的很清楚了:

    A Robot Framework listener that sends information to a socket
    

    重写监听类

    于是接下来参考前面提到的博文,以及官网对listener参数的说明:
    http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#listener-interface
    新建RobotListener.py,重写监听类:

       class RobotListener(object):
           ROBOT_LISTENER_API_VERSION = 2
    
        def start_suite(self, name, args):
            print "Starting Suite : " + name + "  " + args['source']
    
        def start_test(self, name, args):
            print "Starting test : " + name
            if args['template']:
                print 'Template is : ' + args['template']
    
        def end_test(self, name, args):
            print "Ending test:  " + args['longname']
            print "Test Result is : " + args['status']
            print "Test Time is: " + str(args['elapsedtime'])
    
        def log_message(self, message):
            print message['timestamp'] + " :   " + message['level'] + " : " + message['message']
    

    OK,然后自己在命令行调用的时候,参数中带上这个类就可以啦!

    使用自己的监听类,运行case

    如:{WORKSPACE}是项目所在目录,刚才的监听类保存在{WORKSPACE}/RobotListener.py,要运行的case保存在{WORKSPACE}TestCase下
    就像这样,进入项目所在目录,根据你自己的项目路径,对下面的命令稍作修改,即可执行:

    cd {WORKSPACE}
    /usr/local/Cellar/python/3.6.4_3/bin/python -m robot.run  
    --listener RobotListener.py  
    --pythonpath {YOUR_PYTHON_PATH}   
    {WORKSPACE}TestCase
    

    结果如下图所示:
    test_log.jpg

    可以看到,这样在Console窗口就出现了我们想要的log了,和命令行日志一起展现出来。
    下面还可以保存到文件,进行二次处理等,就不是什么难事了。

  • 相关阅读:
    取石子(斐波那契博弈)
    Kindergarten(网络流解法)
    最大团的一些定理
    Escape(多记一个方向状态的BFS)迷宫逃脱
    网络流的一些定理
    线段树维护动态连续子段HDU1540
    最大流Dinic(模板)
    MCMF最大流最小割(模板)Dijkstra负权优化
    Exchanging Gifts--2019CCPC哈尔滨 E题
    A<=B的前提下全排列A使答案尽量大
  • 原文地址:https://www.cnblogs.com/cynthiaw/p/9392015.html
Copyright © 2020-2023  润新知