unittest框架下的HTMLTestRunner報告模塊使用及優化


  引言

  在做接口自動化測試的時候,使用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,關注博客園,微信公眾號,學習你不曾遇到的問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM