大廠測試筆記——HTMLTestRunner.py測試報告生成

2022-01-31 測試新青年

來源:https://www.cnblogs.com/camilla/p/7243044.html


HTMLTestRunner.py python 2版本


下載地址:http://tungwaiyip.info/software/HTMLTestRunner.html使用時,先建立一個」PyDev Package「,將下載下來的HTMLTestRunner.py文件拷貝在該目錄下。

例子:

testcase5_dynamic.py


import unittest
from dev.widget import Widget

class WidgetTestCase(unittest.TestCase):
    def setUp(self):
        self.widget=Widget()
        
    def tearDown(self):
        self.widget.dispose()
        self.widget=None
        
    def testSize(self):
        self.assertEqual(self.widget.getSize(), (40,40), "Wrong")
        
    def testResize(self):
        self.widget.resize(100, 100)
        self.assertEqual(self.widget.getSize(), (100,100), "Wrong")


html_report.py:


#coding:utf-8

from lib import HTMLTestRunner
import unittest
from testcase5_dynamic import WidgetTestCase

if __name__=='__main__':
    suite=unittest.makeSuite(WidgetTestCase)
    filename='D:\\myreport.html'
    fp=file(filename,'wb')
    runner=HTMLTestRunner.HTMLTestRunner(fp,title=u'my unit test',description=u'This is a report test')
    runner.run(suite)

Run的時候,需要使用Python Run,使用Python unit-test跑測試生成不了myreport.html,目前還不知道為什麼。有時候,不會立即生成D:\\myreport.html,我們可以自己先建立一個空的myreport.html,這樣再運行之後打開就會看到報告內容。


HTMLTestRunner.py 的python3 版本

由於 HTMLTestRunner.py 原本就是python2版本,目前還沒找到python3版本,所以需要我們自己修改 HTMLTestRunner.py 文件。1. 修改的地方問題一:No module named StringIO原因:python 3 中 沒有 StringIO 這個模塊。這裡我們需要使用io 這個模塊來代替。第94行引入的名稱要改,從 import StringIO 改成import io。相應的,539行 self.outputBuffer = StringIO.StringIO() 要改成self.outputBuffer = io.BytesIO()
問題二:AttributeError: 'dict' object has no attribute 'has_key'原因:python 3 字典類型的object 已經不支持 has_key函數,我們需要使用in 來進行遍歷。定位到642行,if not rmap.has_key(cls): 需要換成 if not cls in rmap:
問題三:'str' object has no attribute 'decode'原因:python3 裡面對字符的操作中,decode已經拿掉了。定位到772行,把 ue = e.decode('latin-1') 直接改成 ue = e 。另外766還有類似的uo = o.decode('latin-1'),改成 uo=o ;
問題四 :TypeError: can't concat bytes to str原因:定位一下,報在了778行的內容escape(uo+ue) 。這是因為我們上面給uo賦值的時候,走的是else流程,uo被賦值的是bytes類型的值。而bytes類型不能直接轉化為str類型。所以我們需要在前面給uo賦值的時候先將bytes類型轉換為 str類型。修改768行的 uo = o ,直接改成 uo = o.decode('utf-8') 。另外 774還有類似的  ue = e, 改成 ue = e.decode('utf-8')。問題五:TypeError: unsupported operand type(s) for >>: 'builtin_function_or_method' and 'RPCProxy'原因:python3  不支持 print >> sys.stderr 這種寫法,這裡定義輸出流的話,採用print("This is print str",file=sys.stderr) 這種方式。定位到631行,把print的語句修改掉,原來是print >>sys.stderr, '\nTime Elapsed: %s' % (self.stopTime-self.startTime), 可改成 print('\nTime Elapsed: %s' % (self.stopTime-self.startTime),file=sys.stderr)問題六:TypeError: 'str' does not support the buffer interface原因:定位一下,問題出在118行,這裡s是str類型,我們需要把傳過來的s轉化為bytes類型。定位到118行,把 self.fp.write(s) 修改為 self.fp.write(bytes(s,'UTF-8')) 即可。2. 保存修改後對HTMLTestRunner.py 保存一下。3. 調用語句更改python3 裡面打開文件使用 open,不要再去用file了。即 fp = file(filename,'wb')替換成 fp = open(filename,'wb');
1. 問題:執行測試用例的過程中,不會列印任何東西,導致上個廁所或第二天回來時,根本不知道執行到哪了,或者執行多少測試用例了。解決思路:每次執行一個測試用例時,就列印該測試用例的名稱。解決方案:調用HTMLTestRunner時,定義 verbosity 為大於1的整數,比如說 2:runner=HTMLTestRunner.HTMLTestRunner(fp,title="xxxx",description="xxx",verbosity=2)

在控制臺console 就可以看到每執行一條用例,就會有如下輸出:

E  test (testcases.login.testcase1.MyTest)
ok  test (testcases.login.testcase2.MyTest)
F  test (testcases.login.testcase3.MyTest)


class OutputRedirector(object)
# 將輸出進行重定向

class Template_mixin(object)
# 定義生成HTML結果文件所需要的模板。
# 如果我們想改變HTML的格式等待,可以在這裡進行改動

class _TestResult(TestResult)
# 定義繼承自 unittest.TestResult 的 類。
# 這裡重寫了 unittest.TestResult 的多個方法,比如 startTest(self, test) 等等

class HTMLTestRunner(Template_mixin)
# 這裡可以說是使用 HTMLTestRunner.py 的入口。定義了多個我們可以看到的方法,比如 run(self, test)

class TestProgram(unittest.TestProgram)
# 這裡繼承自 unittest.TestProgram 類,重寫了 runTests 方法。
# 用於命令行執行測試

3. 缺點:使用HTMLTestRunner的執行測試用例的過程中,如果中間中斷執行,則已經執行完的用例結果也不會列印到html文件。目前我這邊是自己編寫腳本生成html來代替使用 HTMLTestRunner ,感覺 HTMLTestRunner 應該沒有每執行一條用例就講結果寫入到html結果文件的方法。測試案例:
1.登錄百度雲
2.進入「立即註冊百度帳號」網頁
3.進入」會員中心」網頁
4.生成測試報告的文件名為:2015-01-02result.html。

測試腳本:


#coding=utf-8 #防止中文亂碼
from selenium import webdriver
from selenium.webdriver.common.by import By
#加載鍵盤使用的模塊
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException

#加載unittest模塊
import unittest
import time
import re
#加載HTMLTestRunner,用於生成HTMLreuslt
import HTMLTestRunner

class BaiduYun(unittest.TestCase):
    def setUp(self):
        self.browser=webdriver.Chrome()
        self.browser.implicitly_wait(30)
        self.base_url="http://yun.baidu.com"
        self.verficationErrors=[]
        self.accept_next_alert=True
    def Login(self):
        browser=self.browser
        browser.get(self.base_url+'/')
        u"""百度雲登錄"""
        browser.find_element_by_name("userName").clear()
        username=browser.find_element_by_name("userName")
        username.send_keys("alu***")
        username.send_keys(Keys.TAB)
        time.sleep(2)
        password=browser.find_element_by_name("password")
        password.send_keys("***")
        password.send_keys(Keys.ENTER)
        time.sleep(3)
        browser.close()
    def Register(self):
        browser=self.browser
        browser.get(self.base_url+'/')
        u"""立即註冊百度帳號"""
        browser.find_element_by_class_name("link-create").click()
        time.sleep(2)
        browser.close()
    def Link(self):
        browser=self.browser
        browser.get(self.base_url+'/')
        u"""會員中心"""
        browser.find_element_by_link_text("會員中心").click()
        time.sleep(2)
        browser.close()
    def tearDown(self):
        self.browser.quit()
        self.assertEqual([],self.verficationErrors)
if __name__=="__main__":
    #unittest.main()
    testunit=unittest.TestSuite()
    #將測試用例加入到測試容器中
    testunit.addTest(BaiduYun("Login"))
    testunit.addTest(BaiduYun("Register"))
    testunit.addTest(BaiduYun("Link"))
    #獲取當前時間,這樣便於下面的使用。
    now = time.strftime("%Y-%m-%M-%H_%M_%S",time.localtime(time.time()))
    #打開一個文件,將result寫入此file中
    fp=open("result"+now+".html",'wb')
    runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title='test result',description=u'result:')
    runner.run(testunit)
    fp.close()
F5,運行,就這樣得到了test result

相關焦點

  • Selenium2+python自動化54-unittest生成測試報告(HTMLTestRunner)
    前言批量執行完用例後,生成的測試報告是文本形式的,不夠直觀,為了更好的展示測試報告,可以生成HTML格式的。
  • 【Pytest篇】Allure生成漂亮的HTML圖形化測試報告(一))
    後面我將用一整篇文章介紹Pytest測試框架。今天我們主要是介紹如何將測試報告生成工具Allure集成到Pytest中。三、安裝allure-pytestpip install allure-pytest四、下載allure-2.7.0https://dl.bintray.com/qameta/generic/io/qameta/allure/allure/2.7.0/allure-2.7.0.
  • Unittest接口測試生成報告和日誌方法
    now = datetime.datetime.now().strftime('%Y-%m-%d_%H_%M_%S') htmlreport = reportpath + "/" + now + r"result.html" print("測試報告生成地址:%s"% htmlreport) fp = open(htmlreport, "wb")
  • Python unittest單元測試框架的使用
    (case_path,pattern="test*.py",top_level_dir=None) print(discover) return discoverif __name__ == "__main__": runner = unittest.TextTestRunner(verbosity=2) runner.run(all_cases())5、生成測試報告
  • Python unittest單元測試框架的使用
    (case_path,pattern="test*.py",top_level_dir=None) print(discover) return discoverif __name__ == "__main__": runner = unittest.TextTestRunner(verbosity=2) runner.run(all_cases())5、生成測試報告
  • Python測試框架:pytest學習筆記
    selenium/appnium等自動化測試、接口自動化測試(pytest+requests)pytest具有很多第三方插件,並且可以自定義擴展,比較好用的如pytest-selenium(集成selenium)、pytest-html(完美html測試報告生成)、pytest-rerunfailures(失敗case重複執行)、pytest-xdist(多CPU分發)等
  • 高效測試必學 | 用pytest生成測試報告!
    pytest藉助pytest-html插件生成測試報告,不用自己編寫生成報告代碼。
  • 軟體測試學習教程:單元測試之UnitTest測試框架
    能夠生成HTML格式的測試報告4.3.定義測試方法:測試方法名稱命名必須以test開頭示例代碼:#test01_add.py文件#需求:定義一個實現加法操作的函數,並對該函數進行測試#實現加法操作defadd
  • unittest測試框架
    指定測試用例的識別規則tests=unittest.defaultTestLoader.discover(「測試模塊所在目錄」,pattern=」test*.py」)識別所有test開頭的py文件為測試用例按模塊名稱順序執行suite.addTests(tests)runner=unittest.TextTestRunner(verbosity
  • Python單元測試框架-UnitTest以及測試報告
    test suite:測試套件,是測試用例、測試套件或者兩者的集合,用來將有關聯的測試項打包。test runner:負責執行測試並將結果展示給用戶,可以展示圖形或文字形式(unittest.TextTestRunner)的結果,或者返回一個錯誤碼標識測試用例的執行結果。
  • Python測試框架Pytest的常用插件測試報告
    一、pytest-html 生成 html 測試報告要求:Python 3.6+安裝:pip install pytest-html文檔:https://github.com/pytest-dev/pytest-html、https://www.cnblogs.com
  • pytest「conftest、pytest參數化、重運行、出測試報告」
    文章總覽圖一、conftest問題整理:1.這個conftest.py分路徑嗎?如果在TestCases下建這個包可以直接用嗎?看目錄結構,conftest.py是頂級目錄的。實際工作過程中,ModeA和ModeB是個獨立的模塊,這個獨立的模塊下有屬於自己的前置後置。如果ModeA和ModeB下面有5個模塊,把5個模塊的前置後置全部放在conftest.py裡面,會覺得太多也太繁瑣了,同樣存在問題。
  • 5分鐘測試:哪個Python熱門單元測試框架適合現在的你?
    UnitTest最早的時候是受到Junit的啟發,UnitTest支持多種自動化測試用例的編寫,以及支持用例前置條件和後置數據清理功能也可以將多個測試用例放在測試集中生成測試報告。Pytest也是基於Python的一個單元測試框架,是基於UnitTest的一個擴展框架,比UnitTest更加簡潔、方便。
  • Jmeter生成壓力測試報告
    Jmeter生成壓力測試報告根據各大招聘網站上的需求來看,熟悉Jmeter做性能測試已經幾乎成為必要條件了。那麼今天在這個給大家安利一波。怎麼使用Jmeter生成壓力測試報告呢?2、輸入jmeter -n -t D:\Jmeter\apache-jmeter-3.2\bin\test.jmx -l result.jtl -e -o D:\Jmeter\apache-jmeter-3.2\bin\WebReportPS:紅框部分的jmx路徑地址以及生成的html測試報告路徑地址必須要正確
  • 如何生成一份完美的測試報告模板
    出品|51Testing軟體測試網儘管自動化測試可以生成簡潔的html測試報告
  • Python 測試框架之 Unittest & Pytest
    中包含了對一些常規的測試用例體系性的支持,主要包括:test fixturetest casetest suitetest runner創建.py文件,並選擇文件類型如下圖所示:點擊OK後默認生成的文件內容如下:
  • 全功能Python測試框架:pytest
    ,並且可以自定義擴展,比較好用的如pytest-selenium(集成selenium)、pytest-html(完美html測試報告生成)、pytest-rerunfailures(失敗case重複執行)、pytest-xdist(多CPU分發)等測試用例的skip和xfail處理可以很好的和jenkins集成report框架----allure 也支持了
  • Python測試框架之pytest(一)
    能夠支持簡單的單元測試和複雜的功能測試,還可以用來做selenium/appium等自動化測試,接口自動化測試(pytest+request)pytest具有很多第三方插件,並且可以自定義擴展,比較好用的如pytest-selenium(集成selenium)、pytest-html(完美html測試報告生成)、pytest-rerunfailures(失敗case重複執行)、pytest-xdist
  • Python測試開發庫及項目(超全面!)
    https://github.com/cobrateam/splinterhttps://github.com/SeleniumHQ/selenium/tree/master/py --推薦 文檔參考:https://china-testing.github.io/selenium_example5.htmlmechanize- Python中有狀態的程序化Web瀏覽
  • selenium+unittest自動化測試實戰項目(一)
    信息            TestReport# 存放測試用例執行完成後生成的測試報告        Test_case# 測試用例信息            Models # 存放一些公共方法                Doconfini.py# 讀配置文件                Doexcel.py# 讀excel文件