起因
因为自己用的是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的理解如下:
- 运行时Console展示的日志。如果通过命令行运行,你可以在窗口看到这些日志。如果通过Jenkins启动任务,你可以在[Console Output]中看到这部分日志。如果和我一样用RED编辑器,你会在Console窗口看到这部分日志
- 执行后得到的log.html文件,这个会自动输出文件的。
- RED编辑器的Message Log窗口展示的日志。如图所示。
查找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
结果如下图所示:
可以看到,这样在Console窗口就出现了我们想要的log了,和命令行日志一起展现出来。
下面还可以保存到文件,进行二次处理等,就不是什么难事了。