HTMLTestRunner是Python標准庫unittest單元測試框架的一個擴展,可以生成易於使用的HTML測試報告,這個擴展很簡單,只有一個HTMLTestRunner.py,下載地址:http://tungwaiyip.info/software/HTMLTestRunner.html。
下載該文件,然后把它放到Python3的lib目錄下,我的為:D:\Python35\Lib。
1.修改HTMLTestRunner
HTMLTestRunner.py是基於Python2開發的,如果是Python3環境,需要修改HTMLTestRunner.py文件。
1 import StringIO修改為import io 2 self.outputBuffer = StringIO.StringIO()修改為self.outputBuffer = io.StringIO() 3 print >>sys.stderr, '\nTime Elapsed: %s' % (self.stopTime-self.startTime)修改為print(sys.stderr, '\nTime Elapsed: %s' % (self.stopTime-self.startTime)) 4 if not rmap.has_key(cls):修改為if not cls in rmap: 5 uo = o.decode('latin-1')修改為uo = e 6 ue = e.decode('latin-1')修改為ue = e
在Python交互模式下引入HTMLTestRunner模塊,沒有報錯,則說明添加成功:
1 C:\Users>python3 2 Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)] on win32 3 Type "help", "copyright", "credits" or "license" for more information. 4 >>> import HTMLTestRunner 5 >>>
2.生成HTML測試報告
1 # coding:utf-8 2 import unittest 3 from selenium import webdriver 4 import time 5 from HTMLTestRunner import HTMLTestRunner 6 7 8 class TestBaidu(unittest.TestCase): 9 10 def setUp(self): 11 self.driver = webdriver.Firefox() 12 self.driver.maximize_window() 13 self.driver.implicitly_wait(10) 14 self.base_url = "http://www.baidu.com" 15 16 def tearDown(self): 17 self.driver.quit() 18 19 def test_baidu(self): 20 driver = self.driver 21 driver.get(self.base_url) 22 driver.find_element_by_id("kw").send_keys("selenium") 23 driver.find_element_by_id("su").click() 24 time.sleep(3) 25 self.assertEqual(driver.title, "selenium_百度搜索") 26 27 28 if __name__ == '__main__': 29 suite = unittest.TestSuite() 30 suite.addTest(TestBaidu("test_baidu")) 31 file = open("./resultReport.html", "wb") 32 runner = HTMLTestRunner(stream=file, title="百度搜索測試報告",description="用例執行情況:") 33 runner.run(suite) 34 file.close()
在當前目錄打開resultReport.html:
3.優化測試報告
HTMLTestRunner可以讀取doc string類型的注釋,因此,只需要在測試類或者測試方法下添加doc string類型的注釋即可顯示測試類和測試方法的注釋。
1 # coding:utf-8 2 import unittest 3 from selenium import webdriver 4 import time 5 from HTMLTestRunner import HTMLTestRunner 6 7 8 class TestBaidu(unittest.TestCase): 9 """測試百度搜索""" 10 def setUp(self): 11 self.driver = webdriver.Firefox() 12 self.driver.maximize_window() 13 self.driver.implicitly_wait(10) 14 self.base_url = "http://www.baidu.com" 15 16 def tearDown(self): 17 self.driver.quit() 18 19 def test_baidu(self): 20 """搜索關鍵詞selenium""" 21 driver = self.driver 22 driver.get(self.base_url) 23 driver.find_element_by_id("kw").send_keys("selenium") 24 driver.find_element_by_id("su").click() 25 time.sleep(3) 26 self.assertEqual(driver.title, "selenium_百度搜索") 27 28 29 if __name__ == '__main__': 30 suite = unittest.TestSuite() 31 suite.addTest(TestBaidu("test_baidu")) 32 file = open("./resultReport.html", "wb") 33 runner = HTMLTestRunner(stream=file, title="百度搜索測試報告",description="用例執行情況:") 34 runner.run(suite) 35 file.close()
運行腳本,然后在當前目錄下打開resultReport.html文件:
4.修改測試報告名稱
在測試之前,如果不修改測試報告文件名,則運行結束后,之前的測試報告會被覆蓋,為了避免這種情況,我們可以在文件命中添加時間。
Python的time模塊為我們提供了很多操作時間的方法:
1 # coding:utf-8 2 import time 3 4 print(time.time()) # 返回當前時間(以秒為單位),自1970-01-01 00:00:00以來的秒數 5 6 print(time.localtime()) # 將1970-01-01 00:00:00以來的秒轉換為本地時間的元組 7 8 print(time.ctime()) # 將1970-01-01 00:00:00以來的以秒為單位的時間轉換為本地時間的字符串 9 10 11 print(time.strftime(("%Y-%m-%d %H_%M_%S"))) # 根據設置的格式將時間元組轉換為字符串 12 """ 13 %Y 帶世紀部分的十進制年份,2019 14 %m 十進制表示的月份, [01,12]. 15 %d 十進制表示每月的第幾天 [01,31]. 16 %H 24小時制十進制的小時 [00,23]. 17 %M 十進制表示的分鍾數 [00,59]. 18 %S 十進制的秒數 19 %z 時區名稱 20 %a 星期的簡稱 ,Sun 21 %A 星期的全稱 ,Sunday 22 %b 月份的簡稱,Mar 23 %B 月份的全稱,March 24 %I 12小時制的小時 [01,12]. 25 %p 本地的AM或PM的等價顯示 26 """
修改測試腳本:
1 if __name__ == '__main__': 2 suite = unittest.TestSuite() 3 suite.addTest(TestBaidu("test_baidu")) 4 now_time = time.strftime("%Y-%m-%d %H_%M_%S") 5 file_name = "./"+now_time+"result.html" 6 file = open(file_name, "wb") 7 runner = HTMLTestRunner(stream=file, title="百度搜索測試報告",description="用例執行情況:") 8 runner.run(suite) 9 file.close()
然后運行測試腳本,即可生成不同名稱的測試報告。
4.輸出項目集成測試報告
修改runnertest.py文件,使其可以生成項目集成測試報告。
1 # coding:utf-8 2 import unittest 3 from HTMLTestRunner import HTMLTestRunner 4 import time 5 6 discover = unittest.defaultTestLoader.discover("./testpro/testcase/", "test*.py") 7 if __name__ == '__main__': 8 9 now_time = time.strftime("%Y-%m-%d %H-%M-%S") 10 file_name = "./testpro/testresult/"+now_time+"result.html" 11 file = open(file_name, "wb") 12 runner = HTMLTestRunner(stream=file, title="測試報告", description="測試用例執行情況") 13 runner.run(discover)
執行測試腳本,查看生成的測試報告: