引言
在做接口自動化測試的時候,使用python單元測試框架unittest下HTMLTestRunner報告模板,可以很好的展示我們測試結果的數據。
官方的標准版模板地址:http://tungwaiyip.info/software/HTMLTestRunner.html
如圖:
報告模板使用
下載后,把HTMLTestRunner.py 文件復制到Python 安裝路徑下的lib文件夾中即可。 在python3中用HTMLTestRunner.py報importError“:No module named 'StringIO'解決辦法 原因是官網的是python2語法寫的,看官手動把官網的HTMLTestRunner.py改成python3的語法。 修改內容: 第94行,將import StringIO修改成import io 第539行,將self.outputBuffer = StringIO.StringIO()修改成self.outputBuffer = io.StringIO() 第642行,將if not rmap.has_key(cls):修改成if not cls in rmap: 第631行,將print >> sys.stderr, '\nTime Elapsed: %s' % (self.stopTime-self.startTime)修改成print(sys.stderr, '\nTime Elapsed: %s' % (self.stopTime-self.startTime)) 第766行,將uo = o.decode('latin-1')修改成uo = e 第775行,將ue = e.decode('latin-1')修改成ue = e
運行結果
<_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'> Time Elapsed: 0:00:00.040107 .....
查看報告
問題處理
細心的人會發現控制台輸出的信息到底是什么?從哪里輸出的,很多人做自動化測試,可能不太關注,也不怎么明白它的含義。
1、控制台的信息來自哪里?
答:來自HTML報告模塊。
2、為啥會有五個‘.’點?
答:1個點就是一條用例運行的結果,表示:成功,如果失敗了,會顯示F。如果有錯誤,就會顯示E。具體函數是:
def addSuccess(self, test): 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('.')
3、為啥會輸出“<_io.TextIOWrapper name=’’ mode=‘w’ encoding=‘UTF-8’> ”?
答:運行報告的時候,會調run函數,而該函數打印了這些信息。
def run(self, test): "Run the given test case or test suite." result = _TestResult(self.verbosity) test(result) self.stopTime = datetime.datetime.now() self.generateReport(test, result) print(sys.stderr, '\nTime Elapsed: %s' % (self.stopTime-self.startTime)) return result stderr = None # (!) real value is "<_io.TextIOWrapper name='<stderr>' mode='w' encoding='cp1252'>"
如果不想要,可以注釋。
4、報告中case為啥沒有日志信息?
如:
原因很簡單,模板是原生態支持py2的,但是程序是py3跑的,無法正常顯示print信息,需要手動改一下。
刪除這段代碼,加上:uo = o
或者直接將e改成o,不管錯誤還是正確,都會輸出o。
if isinstance(o,str): # TODO: some problem with 'string_escape': it escape \n and mess up formating # uo = unicode(o.encode('string_escape')) uo = o else: uo = o
修改后再運行程序,打開報告查看:
5、用數字表示用例數:
修改代碼:
def addSuccess(self, test): 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('.'+str(self.success_count))
再運行程序:
Time Elapsed: 0:00:00.039104 .1.2.3.4.5
添加餅圖
給報告添加餅圖:
方法我寫在以前的文章中:https://blog.csdn.net/liudinglong1989/article/details/89477054
這是鼠標放到餅圖上的效果:
需要注意一點:
1、HTMLTestRunner模板文件需要放在common文件夾下,common需要建在項目根目錄下。如果餅圖顯示不出來,請查看代碼:
plt.legend() #創建餅圖存放路徑 cur_path = os.path.dirname(os.path.realpath(__file__)) log_path = os.path.join(os.path.dirname(cur_path), 'logs') # 如果不存在這個logs文件夾,就自動創建一個 if not os.path.exists(log_path): os.mkdir(log_path) imgPath = os.path.join(log_path, "pie%s.png"%time.strftime('%Y_%m_%d_%H_%M_%S')) plt.savefig(imgPath)
查看是否存在logs文件夾,並且里面是否生成了餅圖:
PS:不存在的話,證明餅圖生成失敗了。
源碼獲取
以上所有問題及源碼可以加測試開發交流QQ群獲取:696400122,關注博客園,微信公眾號,學習你不曾遇到的問題。