Robot Framework监听日志二次开发,遇到的坑

直接推荐吧,这两篇帖子一篇讲原理,一篇讲应用,仔细看能解决。
http://www.cnblogs.com/kuihua/p/5400152.html
https://blog.csdn.net/wyb199026/article/details/78730097
本篇就分享下使用,以及一个小坑

背景:
python CGI + httpd, 自己写了个调用robot api的class,然后运行 robot Framework的testcase

from robot import run
from Demo.utils.robotframework.robotframeworkmylistener import MyListener //替换成自己的
from Demo.utils.log.fatplogger import *

class RobotRunner:

def runTestcaseAndInsertToMySQL(self, testLogID, jobTestcaseFolderPath, db):
    """method to run test case and insert log to MySQL
    @param (str) test_log_id
    @param (str) jobTestcaseFolderPath
    @return projectID
    """
    try:
           run(jobTestcaseFolderPath, listener=MyListener(testLogID, db), log=None)
    except:
        mylogger.info('Exception: Run testcase failed!')

from Demo.utils.db.dbinit import *
from Demo.utils.log.fatplogger import *

class MyListener(object):
ROBOT_LISTENER_API_VERSION = 2

stepCount = 0
testLogID = None
db = None
ms = None

def __init__(self, testLogID, db):
    self.testLogID = testLogID
    self.db = InitMySql()
    t = time.time()
    self.ms = int(round(t))
    mylogger.info('init robot framework listener...')

def start_suite(self, name, args):
    self.stepCount = self.stepCount + 1
    log =  "Starting Suite : " + name + "  " + args['source']
    self.insert_log(self.testLogID, self.stepCount, log)


def start_test(self, name, args):
    self.stepCount = self.stepCount + 1
    log = "Starting test : " + name
    self.insert_log(self.testLogID, self.stepCount, log)

def end_test(self, name, args):
    self.stepCount = self.stepCount + 1
    log = "Ending Test:  " + args['longname']
    self.insert_log(self.testLogID, self.stepCount, log)

    self.stepCount = self.stepCount + 1
    log = "Test Result is : " + args['status']
    self.insert_log(self.testLogID, self.stepCount, log)
    if('PASS' in log):
        self.tablename = 'testcase_log'
        self.key = 'result_status = 1'
        self.where = {"test_log_id": self.testLogID}
        self.db.update(self.tablename, self.key, self.where)

    self.stepCount = self.stepCount + 1
    log = "Test Time is: " + str(args['elapsedtime'])
    self.insert_log(self.testLogID, self.stepCount, log)

def log_message(self, message):
    mylogger.info(self.stepCount)
    self.stepCount = self.stepCount + 1
    log = message['timestamp'] + " :   " + message['level'] + " : " + message['message']
    self.insert_log(self.testLogID, self.stepCount, log)

def insert_log(self, testLogID, stepCount, log):
    self.tablename = 'testcase_log_detail'
    self.key = 'test_log_id,log_step_number,log_info,createTime'
    log = str(log).replace('\'', '\\\'')
    self.keyValue = "('" + str(testLogID) + "','" + str(stepCount) + "', '"+ log  + "', '"+ str(self.ms) + "')"
    self.db.insert(self.tablename, self.key, self.keyValue)

这里MyListener中,我加入了 DB的操作,获取log后直接存到数据库里面

坑:
本地运行都可以,一上linux 就废了,各种过不了,最后发现是 存储output.xml的那个文件夹没有权限,chmod 就搞定了

debug的经历,
由于要在server 中,python site-packages 里面debug,看看为什么不行,没有什么好办法,只能打log。这里如果哪位大神有好的办法,求介绍

首先,找到robot 的位置,我的是 /usr/lib/python2.7/site-packages/robot


image.png

然后,先在本地debug,看看
run(jobTestcaseFolderPath, listener=MyListener(testLogID, db), log=None)
的大体实现。
直接贴过程:
step 1:
/usr/lib/python2.7/site-packages/robot/run.py

def main(self, datasources, **options):
    settings = RobotSettings(options)
    LOGGER.register_console_logger(**settings.console_output_config)
    LOGGER.info('Settings:\n%s' % unic(settings))
    suite = TestSuiteBuilder(settings['SuiteNames'],
                             settings['WarnOnSkipped'],
                             settings['Extension']).build(*datasources)
    suite.configure(**settings.suite_config)
    if settings.pre_run_modifiers:
        suite.visit(ModelModifier(settings.pre_run_modifiers,
                                  settings.run_empty_suite, LOGGER))
    with pyloggingconf.robot_handler_enabled(settings.log_level):
        result = suite.run(settings)            -------------------这一行运行测试用例
        LOGGER.info("Tests execution ended. Statistics:\n%s"
                    % result.suite.stat_message)
        if settings.log or settings.report or settings.xunit:
            writer = ResultWriter(settings.output if settings.log
                                  else result)
            writer.write_results(settings.get_rebot_settings())
    return result.return_code

step 2:
/usr/lib/python2.7/site-packages/robot/running/model.py

def run(self, settings=None, **options):
    from .namespace import IMPORTER
    from .signalhandler import STOP_SIGNAL_MONITOR
    from .runner import Runner

    with LOGGER:
        if not settings:
            settings = RobotSettings(options)
            LOGGER.register_console_logger(**settings.console_output_config)
        with pyloggingconf.robot_handler_enabled(settings.log_level):
            with STOP_SIGNAL_MONITOR:
                IMPORTER.reset()
                output = Output(settings)     ----------------------进入这一步
                runner = Runner(output, settings)
                self.visit(runner)
            output.close(runner.result)
    return runner.result

step 3:
/usr/lib/python2.7/site-packages/robot/output/output.py

def __init__(self, settings):
    AbstractLogger.__init__(self)
    self._xmllogger = XmlLogger(settings.output, settings.log_level)   ----------------------进入这一步
    self.listeners = Listeners(settings.listeners, settings.log_level)
    self.library_listeners = LibraryListeners(settings.log_level)
    self._register_loggers(DebugFile(settings.debug_file))
    self._settings = settings

step 3:
/usr/lib/python2.7/site-packages/robot/output/xmlogger.py

def __init__(self, path, log_level='TRACE', generator='Robot'):
    self._log_message_is_logged = IsLogged(log_level)
    self._error_message_is_logged = IsLogged('WARN')
    self._writer = self._get_writer(path, generator)
    self._errors = []

打log
def init(self, path, log_level='TRACE', generator='Robot'):
mylogger.info('Debug xmllogger 1')
mylogger.info(path)
mylogger.info('Debug xmllogger 2')
mylogger.info(log_level)
self._log_message_is_logged = IsLogged(log_level)
mylogger.info('Debug xmllogger 3')
self._error_message_is_logged = IsLogged('WARN')
mylogger.info('Debug xmllogger 4')
mylogger.info(generator)
self._writer = self._get_writer(path, generator)
mylogger.info('Debug xmllogger 5')
self._errors = []

image.png

呵呵哒,因为之前,在server 写了个 text 去测试runTestcaseAndInsertToMySQL()这个方法,通过了,

image.png

所有我猜是output 或者是 report 或者是其他有个文件夹需要权限。
到这里,就在server log 中,找到output 创建在webapps下面了,加个权限,server就过了。

总结:

  1. 之前从来没看过 robot Framework的源码,这次对原理有了一点的认识
  2. output/report 的存放路径,默认是 python test.py 程序执行的地址
  3. 初学python, 也不知道怎么在server 上debug python site-packages,楼主是一路sudo vim 加log,才勉强debug,希望有大神可以介绍下,下次遇到问题,可以提高效率,快速定位问题。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容