前言:
? ? ? ? 近期在用Robot Framework框架實現(xiàn)網(wǎng)站核心用例的UI自動化測試,運行過程中钦铁,自動化測試腳本容易受環(huán)境影響等因素導致腳本運行失敗羡滑,因此需要實現(xiàn)Robot Framework失敗用例自動重跑3次的功能瞳腌,減少腳本運行失敗率;在網(wǎng)上找到了實現(xiàn)該功能的資料很泊,但該資料是基于python2版本的角虫,在實踐過程中發(fā)現(xiàn)python3版本的配置與之存在一些差異,因此記錄一下實踐過程委造,以供參考戳鹅。
正文:
? ? ? ? 修改代碼如下:
1、修改文件?C:\Python36\Lib\site-packages\robot\run.py
?1)在USAGE變量里添加下面紅色內(nèi)容昏兆。
Options
=======? ?
-y --retry retry? Set the retry times if test failed.?
2)增加導入模塊 (python3已經(jīng)默認編碼utf-8枫虏,所以不用重新設(shè)置編碼 )
from xml.dom import minidom
3)RobotFramework類增加make方法
注意事項:#savefile = open(outxml,'w',encoding='UTF-8')? ;open方法需要指定utf-8編碼爬虱,否則在讀取ouput.xml文件生成report.html會報編碼錯誤隶债。
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.items():
? ? ? ? ? ? ? ? for i in el[0:-1]:
? ? ? ? ? ? ? ? ? ? textElement = i.nextSibling
? ? ? ? ? ? ? ? ? ? suite.removeChild(i)
? ? ? ? ? ? ? ? ? ? suite.removeChild(textElement)
? ? ? ? savefile = open(outxml,'w',encoding='UTF-8')
? ? ? ? root = xmldoc.documentElement
? ? ? ? root.writexml(savefile)
? ? ? ? savefile.close()
4)RobotFramework類的main方法
加入紅色內(nèi)容 self._make(settings.output)
2、robot/conf/settings.py
class RobotSettings(_BaseSettings) :修改_cli_opts字典跑筝,增加 'Retry':('retry',3)
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字符串继蜡,增加?-y --retry retry ? ? ? ? Set the retry times if test failed.
5回俐、在命令行或者ride運行校驗失敗的測試用例,正常運行并生成測試報告稀并,則說明配置成功了仅颇。
備注:次數(shù)的配置在settings.py下retry后修改即可。