之前對於用例的失敗重試,和用例的歷史測試記錄儲存展示做了很多的描述呢,但是都是基於各個專案呢,不方便使用,為了更好的使用,我們對這裡進行抽離,抽離出來一個單獨的模組,整合到BSTestRunner中,以後我們使用BSTestRunner直接就可以使用裡面的失敗重試和展示歷史記錄了。

首先呢,我們對於失敗重試做了一個簡單的調整。

在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

歡迎關注我的個人公眾號