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了,和命令行日志一起展现出来。
下面还可以保存到文件,进行二次处理等,就不是什么难事了。