• 扩展RF,实现失败用例自动再执行


    今天看到了一个扩展RF的知识,自己收藏一下,以防忘记。

    扩展RF,实现失败用例自动再执行

    通过改写RobotFramework源代码增加--retry选项,实现test级别的失败用例自动再执行:失败用例会重跑N次,直至成功or 耗尽重试次数,生成的日志和报告文件中只会体现最后一次执行的结果。打个比方,用例A第一次执行失败了,立刻再重跑,再失败,立刻再重跑,成功了,那么,最后在生成的日志里面看到的就是最后那一次的运行数据,之前两次被完全过滤掉,只有在控制台中才可以看到它们的痕迹。
    eg:pybot.bat --retry 3 e: obot est
    retry设置为3,用例执行失败后会再次执行,每条用例最大执行次数为3成功后不会再执行。
    修改代码如下:
    1、robot/run.py
    修改USAGE字符串,增加-X --retry retry xxxxxxx这一段

    Options

    =======

     -X --retry retry         xxxxxxx

     -N --name name           Set the name of the top level test suite. Underscores

                              in the name are converted to spaces. Default name is

                              created from the name of the executed data source.

     -D --doc documentation   Set the documentation of the top level test suite.

                              Underscores in the documentation are converted to

                              spaces and it may also contain simple HTML formatting

                              (e.g. *bold* andhttp://url/).[/code]
         增加导入模块
     

    reload(sys)

    sys.setdefaultencoding('UTF-8')

    from xml.dom import minidom

     
        RobotFramework类增加make方法
     

    def make(self,outxml):

            xmldoc = minidom.parse(outxml)

            suiteElementList = xmldoc.getElementsByTagName('suite')

            mySuite = []

            for suiteElement in suiteElementList:

                if suiteElement.childNodes is not None:

                    for element in suiteElement.childNodes:

                        if element.nodeName == 'test':

                            mySuite.append(suiteElement)

                            break

            for suite in mySuite:

                testElements = {}

                for element in suite.childNodes:

                    if element.nodeName == 'test':

                        name = element.getAttribute('name')

                        if testElements.get(name) == None:

                            testElements.update({name:[element]})

                        else:

                            testElements.get(name).append(element)

                for n,el in testElements.iteritems():

                    for i in el[0:-1]:

                        textElement = i.nextSibling

                        suite.removeChild(i)

                        suite.removeChild(textElement)

            savefile = open(outxml,'w')

            root = xmldoc.documentElement

            root.writexml(savefile)

            savefile.close()

     
        修改RobotFramework类的main方法,插入self.make(settings.output)这段
     

    def main(self, datasources, **options):

            settings = RobotSettings(options)

            LOGGER.register_console_logger(width=settings['MonitorWidth'],

                                           colors=settings['MonitorColors'],

                                           markers=settings['MonitorMarkers'],

                                           stdout=settings['StdOut'],

                                           stderr=settings['StdErr'])

            LOGGER.info('Settings: %s' % unicode(settings))

            suite = TestSuiteBuilder(settings['SuiteNames'],

                                     settings['WarnOnSkipped'],

                                     settings['RunEmptySuite']).build(*datasources)

            suite.configure(**settings.suite_config)

            result = suite.run(settings)

            LOGGER.info("Tests execution ended. Statistics: %s"

                        % result.suite.stat_message)

            self.make(settings.output)

            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

     
    2、robot/conf/settings.py
         修改_cli_opts字典,增加 'Retry':('retry',1)
     

    'MonitorColors'    : ('monitorcolors', 'AUTO'),

                     'StdOut'           : ('stdout', None),

                     'StdErr'           : ('stderr', None),

                     'XUnitSkipNonCritical' : ('xunitskipnoncritical', False),

                      'Retry':('retry',1)}

     
    3、robot/model/itemlist.py
         修改visit方法如下
     

    def visit(self, visitor):

            for item in self:

                if self.__module__ == 'robot.model.testcase' and hasattr(visitor,"_context"):

                    testStatus = ''

                    for i in range(0,int(visitor._settings._opts['Retry'])):

                        if testStatus != 'PASS':

                            if item.name in visitor._executed_tests:

                                visitor._executed_tests.pop(item.name)

                            item.visit(visitor)

                            testStatus = visitor._context.variables['${PREV_TEST_STATUS}']

                        else:

                            break

                else:

                    item.visit(visitor)

     
    4、robotidecontrib estrunner
        修改USAGE字符串,增加-X --retry retry xxxxxxx这一段
     

    Options

    =======

     -X --retry retry         xxxxxxx

     -N --name name           Set the name of the top level test suite. Underscores

                              in the name are converted to spaces. Default name is

                              created from the name of the executed data source.

     -D --doc documentation   Set the documentation of the top level test suite.

                              Underscores in the documentation are converted to

                              spaces and it may also contain simple HTML formatting

                              (e.g. *bold* andhttp://url/).[/code]

                                      

            

     

    原贴网址:http://www.aichengxu.com/other/2240654.htm

     

                     

  • 相关阅读:
    Delphi XE10编写的《海康摄像机SDK测试DEMO》
    Delphi XE10编写的《开放式公路收费系统》
    Delphi XE7 用indy开发微信公众平台所有功能,可刷阅读,可刷赞,可加推广(除微支付)
    Delphi XE7 用indy开发微信公众平台(9)- 高级群发接口
    Delphi XE7 用indy开发微信公众平台(8)- 自定义菜单
    Delphi XE7 用indy开发微信公众平台(7)- 用户管理
    Delphi XE7 用indy开发微信公众平台(6)- 被动回复用户消息
    Delphi XE7 用indy开发微信公众平台(5)- 接收事件推送
    Delphi XE7 用indy开发微信公众平台(4)- 接收普通消息
    Delphi XE7 用indy开发微信公众平台(3)- 验证消息真实性
  • 原文地址:https://www.cnblogs.com/maxiaotu/p/8656497.html
Copyright © 2020-2023  润新知