首先呢,我们对于失败重试做了一个简单的调整。
在BSTestRunner 增加之前的重试代码
TestResult = unittest.TestResult class MyResult(TestResult): def __init__(self, verbosity=1, trynum=1): # 默认次数是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
参数默认增加了默认参数。历史数据,我们在代码中,调整中增加了存储功能,我们默认存在txt文档中。我们看下存储和读取的方法。
name=os.path.join(self.filepath,self.stopTime.strftime('%Y_%m_%d_%H_%M_%S')+'.txt') with open(name,'w+') as f: f.write(result.success_count.__str__()+"_"+result.error_count.__str__()+"_"+result.failure_count.__str__()) f.close()
读取历史执行数据源
def _readresult(self): namerun=[] faillist=[] success=[] error=[] for root,dirs,files in os.walk(self.filepath): for file in files: if file.endswith(".txt"): namerun.append(file.split(".")[0].split("/")[-1]) with open(os.path.join(root,file),'r') as f: reslut=f.readline().split('\n')[0].split("_") success.append(reslut[0]) error.append(reslut[1]) faillist.append(reslut[2]) return namerun,faillist,success,error
我们在展示的时候使用了百度的echarts,官网如下。
echarts.apache.org/zh/index.ht…
我们在测试报告中做了展示。(代码太长,我放在github上:BSTestRunner),我们写一段代码演示下。
import unittest,os from BSTestRunner import BSTestRunner BASH_DIR="history" report_path = os.path.join(BASH_DIR,"test.html") openone = open(report_path, 'w+') class Clasee(unittest.TestCase): def setUp(self) -> None: pass def tearDown(self) -> None: pass def testoen(self): self.assertEqual(1,2) if __name__=="__main__": besautiful = BSTestRunner(title="报告", description="测试报告", stream=openone, trynum=2,#重试次数 filepath=BASH_DIR,#根目录 is_show=True)#是否展示。 test_suit = unittest.TestSuite() test_suit.addTests([Clasee("testoen")]) besautiful.run(test_suit)
我们看下结果。
看下测试报告。
完成了我们之前的设想,单独抽离到了git项目中,我贴下仓库的链接。
最后代码放在了github。
https://github.com/liwanlei/BSTestRunner_new 复制代码
如果访问过慢,可以访问码云
https://gitee.com/liwanlei/BSTestRunner_new