我们在执行测试的时候,肯定都会遇到错误,但是有时候的错误或者失败呢,不是因为我们自身的代码有问题,可能是因为环境 因素导致的我们出现失败的原因,为了降低这些失败,我们想要增加重试的功能。如何实现呢,本文带你解密
正文
在之前的文章unittest系统(八)一文搞定unittest重试功能,我们有分享过,这次呢,我们还是基于当时的代码进行改造。
首先我们在common创建一个trytest.py,代码如下
import unittest
import sys,copy
from io import StringIO as StringIO
TestResult = unittest.TestResult
class MyResult(TestResult):
def __init__(self, verbosity=1, trynum=0):
#默认次数是0
TestResult.__init__(self)
self.outputBuffer = StringIO()
self.stdout0 = None
self.stderr0 = None
self.success_count = 0
self.failure_count = 0
self.error_count = 0
self.verbosity = verbosity
self.trynnum = trynum
self.result = []
self.trys=0#
self.istry=False
def startTest(self, test):
TestResult.startTest(self, test)
self.stdout0 = sys.stdout
self.stderr0 = sys.stderr
def complete_output(self):
if self.stdout0:
sys.stdout = self.stdout0
sys.stderr = self.stderr0
self.stdout0 = None
self.stderr0 = None
return self.outputBuffer.getvalue()
def stopTest(self, test):
#判断是否要重试
if self.istry is True :
#如果执行的次数小于重试的次数 就重试
if self.trys < self.trynnum :
#删除最后一个结果
reslut = self.result.pop(-1)
#判断结果,如果是错误就把错误的个数减掉
#如果是失败,就把失败的次数减掉
if reslut[0] == 1:
self.failure_count -= 1
else:
self.error_count -= 1
sys.stderr.write('{}:用例正在重试中。。。' .format(test.id())+ '\n')
#深copy用例
test = copy.copy(test)
#重试次数增加+1
self.trys += 1
#测试
test(self)
else:
self.istry=False
self.trys =0
self.complete_output()
def addSuccess(self, test):
#成功就不要重试
self.istry = False
self.success_count += 1
TestResult.addSuccess(self, test)
output = self.complete_output()
self.result.append((0, test, output, ''))
if self.verbosity > 1:
sys.stderr.write('ok ')
sys.stderr.write(str(test))
sys.stderr.write('\n')
else:
sys.stderr.write('.')
def addError(self, test, err):
#重试+1,错误次数+1
self.istry = True
self.error_count += 1
TestResult.addError(self, test, err)
_, _exc_str = self.errors[-1]
output = self.complete_output()
self.result.append((2, test, output, _exc_str))
if self.verbosity > 1:
sys.stderr.write('E ')
sys.stderr.write(str(test))
sys.stderr.write('\n')
else:
sys.stderr.write('E')
def addFailure(self, test, err):
self.istry = True
TestResult.startTestRun(self)
self.failure_count += 1
TestResult.addFailure(self, test, err)
_, _exc_str = self.failures[-1]
output = self.complete_output()
self.result.append((1, test, output, _exc_str))
if self.verbosity > 1:
sys.stderr.write('F ')
sys.stderr.write(str(test))
sys.stderr.write('\n')
else:
sys.stderr.write('F')
def stop(self) -> None:
pass
那么我们去改造我们的代码。在run.py中改造。
首先引入我们的模块
from common. trytestnum import *
接下来就是改造runnerCaseApp。
def runnerCaseApp(devices):
'''利用unittest的testsuite来组织测试用例'''
newtry = MyResult(trynum=3)
test_suit = unittest.TestSuite()
test_suit.addTest(Parmer.parametrize(testcase_klass=testCase, parame=devices)) # 扩展的其他的测试用例均这样添加
test_suit.run(newtry)
然后就可以执行了。
所有的代码放在了下面的链接
https://gitee.com/liwanlei/appiumdemo
有问题欢迎找我私聊。大家一起学习,一起进步。