基於HTMLTestRunner的定制版本非常多,我這幾天手動定制了一款,除了有不錯的顏值,還提供了一些非常實用的功能。

安裝
github:
https://github.com/SeldomQA/HTMLTestRunner
> git clone https://github.com/SeldomQA/HTMLTestRunner
> cd HTMLTestRunner/
> python setup.py install
基本使用
基本用法與大多數定制版的報告一樣。
import unittest
from TestRunner import HTMLTestRunner
class TestDemo(unittest.TestCase):
"""測試用例說明"""
def test_success(self):
"""執行成功"""
self.assertEqual(2 + 3, 5)
if __name__ == '__main__':
suit = unittest.TestSuite()
suit.addTest(TestDemo("test_success"))
report = "./result.html"
with(open(report, 'wb')) as fp:
runner = HTMLTestRunner(
stream=fp,
title='<project name>test report',
description='describe: ... ')
runner.run(suit)
HTMLTestRunner類說明:
- stream : 指定報告的路徑
- title : 報告的標題
- description : 報告的描述
run()方法說明:
- suit : 運行的測試套件
用例失敗重跑
報告提供了用例錯誤/失敗重跑功能。
import unittest
from TestRunner import HTMLTestRunner
class TestDemo(unittest.TestCase):
"""測試用例說明"""
def test_success(self):
"""執行成功"""
self.assertEqual(2 + 3, 5)
def test_fail(self):
self.assertEqual(5, 6)
def test_error(self):
self.assertEqual(a, 6)
if __name__ == '__main__':
suit = unittest.TestSuite()
suit.addTest(TestDemo("test_success"))
suit.addTest(TestDemo("test_fail"))
suit.addTest(TestDemo("test_error"))
report = "./result.html"
with(open(report, 'wb')) as fp:
runner = HTMLTestRunner(stream=fp)
runner.run(suit, rerun=2, save_last_run=False)
run()方法說明:
- suit : 運行的測試套件
- rerun :重跑次數,設置為2,會在用例失敗/錯誤后進行兩次重試。
- save_last_run :是否保存最后一個結果

集成發郵件功能
如果你想用例運行完成之后發郵件,只需要填寫郵箱信息即可。
import unittest
from TestRunner import HTMLTestRunner
from TestRunner import SMTP
# ...
if __name__ == '__main__':
suit = unittest.TestSuite()
# ...
report = "./result.html"
with(open(report, 'wb')) as fp:
runner = HTMLTestRunner(stream=fp)
runner.run(suit)
# 發郵件功能
smtp = SMTP(user="user@126.com", password="123", host="smtp.126.com")
smtp.sender(to="user@126.com", attachments=report)
SMTP類說明:
- user 發送者郵箱帳號
- password 發送者郵箱密碼
- host 郵箱服務器地址
sender()方法說明:
- to 接收者郵箱
- attachments 附件

用例運行失敗自動截圖
如果你運行的是selenium/appium,那么當用例運行失敗將會自動截圖。
import unittest
from time import sleep
from TestRunner import HTMLTestRunner
from selenium import webdriver
class YouTest(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.driver = webdriver.Chrome()
cls.base_url = "https://www.baidu.com"
@classmethod
def tearDownClass(cls) -> None:
cls.driver.quit()
def test_success(self):
"""測試百度搜索:HTMLTestRunner """
self.driver.get(self.base_url)
self.driver.find_element_by_id("kw").send_keys("HTMLTestRunner")
self.driver.find_element_by_id("su").click()
sleep(2)
def test_error(self):
"""測試百度搜索,定位失敗 """
self.driver.get(self.base_url)
self.driver.find_element_by_id("kw").send_keys("python")
self.driver.find_element_by_id("su22").click()
sleep(2)
def test_fail(self):
"""測試百度搜索,斷言失敗 """
self.driver.get(self.base_url)
self.driver.find_element_by_id("kw").send_keys("unittest")
self.driver.find_element_by_id("su").click()
sleep(2)
self.assertEqual(self.driver.title, "unittest")
if __name__ == '__main__':
suit = unittest.TestSuite()
suit.addTest(YouTest("test_success"))
suit.addTest(YouTest("test_error"))
suit.addTest(YouTest("test_fail"))
report = "./selenium_result.html"
with(open(report, 'wb')) as fp:
runner = HTMLTestRunner(
stream=fp,
title='Seldom自動化測試報告',
description='瀏覽器chrome,平台windows'
)
runner.run(suit)
報告中不需要實現任何截圖的操作,會自動幫你生成截圖並嵌入到HTML報告中。

其他
- 基於jinja2開發,將要HTML代碼與python代碼分離。
- 引用了bootstrap4的模板樣式庫。
- 只支持python3.x,沒有在python2下面做過測試。
- 其他細節優化:
4.1. 增加了Chart環狀圖展示。
4.2. 增加跳過用例統計
4.3. 增加單個用例的運行時間統計。
