扩展Robot Framework,实现失败用例自动再执行(失败重跑)
2015-12-28 23:34
477 查看
使用自动化脚本进行测试,经常受环境影响等各方面导致本能成功的脚本失败,下面介绍了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.这一段
增加导入模块
RobotFramework类增加make方法
修改RobotFramework类的main方法,插入self.make(settings.output)这段(被我编辑了一下,关键字没高亮了,不过没关系)
2、robot/conf/settings.py
修改_cli_opts字典,增加 'Retry':('retry',1)
3、robot/model/itemlist.py
修改visit方法如下
4、robotide\contrib\testrunner\usages.py
修改USAGE字符串,增加 -X --retry retry Set the retry times if test failed.这一段
如果重跑次数达到设置上限,仍然失败,则报告显示为最后一次失败数据(结果):
是不是很完美!尤其在UI自动化上非常有用,强烈推荐!
注:本文教程部分转载至:http://www.cnblogs.com/njdoit/p/4287009.html,并适度修正。
通过改写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/).
如果重跑次数达到设置上限,仍然失败,则报告显示为最后一次失败数据(结果):
是不是很完美!尤其在UI自动化上非常有用,强烈推荐!
注:本文教程部分转载至:http://www.cnblogs.com/njdoit/p/4287009.html,并适度修正。
相关文章推荐
- C++模板元编程(一)
- Linux下安装Source Navigator
- 案例丨详解当当网的分布式作业框架elastic-job
- Android Studio中导入Eclipse项目
- while(*i++=*t++)都做了些什么。
- mysql-5.7配置教程及首次启动服务失败解决办法
- Android 优化性能之 如何避免--过度绘制
- DG 主库和备库日志大小不一样,无法实时同步数据
- android绘制view的过程之一---------计算view大小(measure)
- C#实现对本地文件的访问,获取本地文件的地址
- win7下修改无线网卡MAC地址
- 关于Android的R文件丢失和Error executing aapt: Return code -1073741819解决方案
- 跳转远程服务器命令
- 正则表达式
- (转)MySQL数据表中带LIKE的字符匹配查询
- maven的基本用法
- STL算法库-排序和相关操作(二)
- 5.视图
- Android ViewPager实现左右滑动翻页
- linux YouCompleteMe 安装和使用笔记