使用自动化脚本进行测试,经常受环境影响等各方面导致本能成功的脚本失败,下面介绍了RFS框架下,失败重跑的方法:

通过改写RobotFramework源代码增加--retry选项,实现test级别的失败用例自动再执行:失败用例会重跑N次,直至成功or 耗尽重试次数,生成的日志和报告文件中只会体现最后一次执行的结果。打个比方,用例A第一次执行失败了,立刻再重跑,再失败,立刻再重跑,成功了,那么,最后在生成的日志里面看到的就是最后那一次的运行数据,之前两次被完全过滤掉,只有在控制台中才可以看到它们的痕迹。

eg:pybot.bat --retry 3 e:\robot\test

retry设置为3,用例执行失败后会再次执行,每条用例最大执行次数为3成功后不会再执行。

修改代码如下:

1、robot/run.py

修改USAGE字符串,增加 -X --retry retry         Set the retry times if test failed.这一段

 Options
 =======
  -X --retry retry      Set the retry times if test failed.
  -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* and http://url/).

增加导入模块

 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(**settings.console_output_config)
     LOGGER.info('Settings:\n%s' % unic(settings))
     suite = TestSuiteBuilder(settings['SuiteNames'],
                              settings['WarnOnSkipped']).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)
         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、robotide\contrib\testrunner\usages.py
修改USAGE字符串,增加 -X --retry retry         Set the retry times if test failed.这一段

Options
=======
-X --retry retry      Set the retry times if test failed.
-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* and http://url/).
 

如果重跑次数达到设置上限,仍然失败,则报告显示为最后一次失败数据(结果)

【转载】扩展Robot Framework,实现失败用例自动再执行(失败重跑)的更多相关文章

  1. Robot Framework(十七) 扩展RobotFramework框架——扩展Robot Framework Jar

    4.4扩展Robot Framework Jar 使用标准JDK安装中包含的jar命令,可以非常简单地向Robot Framework jar添加其他测试库或支持代码.Python代码必须放在jar里 ...

  2. Robot Framework测试框架用例脚本设计方法

    Robot Framework介绍 Robot Framework是一个通用的关键字驱动自动化测试框架.测试用例以HTML,纯文本或TSV(制表符分隔的一系列值)文件存储.通过测试库中实现的关键字驱动 ...

  3. 使用远程接口库进一步扩展Robot Framework的测试能力

    引言: Robot Framework的四层结构已经极大的提高了它的扩展性.我们可以使用它丰富的扩展库来完成大部分测试工作.可是碰到下面两种情况,仅靠四层结构就不好使了: 1.有些复杂的测试可能跨越多 ...

  4. [Robot Framework] 如何在Setup中用Run Keywords执行多个带参数的关键字

    参考文档:http://www.howtobuildsoftware.com/index.php/how-do/bZ7q/robotframework-setup-teardown-robot-fra ...

  5. 基于RFS(robot framework selenium)框架模拟POST/GET请求执行自动化接口测试

    打开RIDE添加测试用例 如: Settings         Library Collections       Library RequestsLibrary       Test Cases ...

  6. robot framework 上个用例的输出作为下个用例的输入 (Set Global Variable的用法)

    变量的作用域 通常情况下,每个变量默认都是局部变量. 一个case里的变量,作用域在这个case内部: 一个userkeyword里的变量,作用域在这个userkeyword内部: 一个文件型suit ...

  7. TestNG失败用例自动截图

    参考:https://blog.csdn.net/wangxin1982314/article/details/50247245 1. 首先写一个截屏方法 public class ScreenSho ...

  8. [Robot Framework] Jenkins上调用Rebot命令时执行报错不往下执行其他命令

    在配置jenkins job时,添加构建步骤Execute Windows batch command,输入执行rebot命令 报错信息: Call C:\Python27\Scripts\rebot ...

  9. Robot Framework-失败用例自动重跑

    使用自动化脚本进行测试,经常受环境影响等各方面导致本能成功的脚本失败,下面介绍了RFS框架下,失败重跑的方法: 通过改写RobotFramework源代码增加–retry选项,实现test级别的失败用 ...

随机推荐

  1. webpack+react+redux+es6开发模式---续

    一.前言 之前介绍了webpack+react+redux+es6开发模式 ,这个项目对于一个独立的功能节点来说是没有问题的.假如伴随着源源不断的需求,前段项目会涌现出更多的功能节点,需要独立部署运行 ...

  2. POJ2503(hash)

    Babelfish Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 41263   Accepted: 17561 Descr ...

  3. 安装Hadoop及Spark(Ubuntu 16.04)

    安装Hadoop及Spark(Ubuntu 16.04) 安装JDK 下载jdk(以jdk-8u91-linux-x64.tar.gz为例) 新建文件夹 sudo mkdir /usr/lib/jvm ...

  4. 智能指针shared_ptr

    // 智能指针会自动释放所指向的对象. // shared_ptr的应用场景是:程序需要在多个对象间共享数据 /* 先从应用场景入手吧,说矿工A发现了一个金矿. * 然后矿工A喊来了矿工B,一起开采, ...

  5. 前端总结·基础篇·CSS(一)布局

    目录 这是<前端总结·基础篇·CSS>系列的第一篇,主要总结一下布局的基础知识. 一.显示(display) 1.1 盒模型(box-model) 1.2 行内元素(inline) &am ...

  6. Ioc容器依赖注入-Spring 源码系列(2)

    Ioc容器依赖注入-Spring 源码系列(2) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Ioc容器BeanPostPr ...

  7. 在vim中,使用可视化拷贝(剪切)粘贴文本

    1  定位光标到你想要开始剪切的位置 2 按v选择字符(按V是选择整行) 3 移动光标到你想要结束剪切的位置 4 按d是为了剪切(按y是为了拷贝) 5 移动光标到你想要粘贴的位置 6 按P是在光标之前 ...

  8. load & get 加载方式

    1.Hibernate中get和load有什么不同之处? (1)Hibernate的get方法,会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查询数 ...

  9. python数据结构(一)------序列

    数据结构是通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合:在Python中,最基本的数据结构是序列(sequence),序列中的每个元素被分配一个序列号--即元素的位置,也称为索引. p ...

  10. NSIndexSet 浅析

    Cocoa 中提供了两个用于维护区间集合的类型:NSIndexSet和NSMutableIndexSet . 这两个类型容易其名字一样,其区别就在于是否可以修改.这个区别和NSArray的一样,NSI ...