BSTestRunner增加历史执行记录展示和重试功能
之前对于用例的失败重试,和用例的历史测试记录存储展示做了很多的描述呢,但是都是基于各个项目呢,不方便使用,为了更好的使用,我们对这里进行抽离,抽离出来一个单独的模块,集成到BSTestRunner中,以后我们使用BSTestRunner直接就可以使用里面的失败重试和展示历史记录了。
首先呢,我们对于失败重试做了一个简单的调整。
在BSTestRunner 增加之前的重试代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | 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文档中。我们看下存储和读取的方法。
1 2 3 4 | 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
欢迎关注我的个人公众号
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
2017-08-07 python 数据驱动(ddt)