關於 unittestreport 最初在開發的時候,最初只是計划開發一個unittest生成html測試報告的模塊,所以起名叫做unittestreport。在開發的過程中結合使用的小伙伴的一些反饋,所以慢慢的擴展了更多的功能進去。之前在寫unittestreport的時候,也陸續寫了幾遍關於unittestreport相關功能的使用,每次都是一個特定的功能,這邊給出一遍系統的使用文檔來給大家介紹一下unittestreport的功能。
關於 unittestreport 是什么? 官方地址:https://pypi.org/project/unittestreport/
- unittestreport是基於unittest開發的的一個功能擴展庫,為unittest提供了一些常用的擴展功能:
- HTML測試報告生成
- 測試用例失敗重運行
- 發送測試結果及報告到郵箱
- unittest數據驅動
- 測試結果釘釘通知
一、安裝 unittestreport (report譯:瑞泡特)
在 https://pypi.org/ 中搜索 unittestreport 就可以查看 官方文檔
使用文檔:https://unittestreport.readthedocs.io/en/latest/
在 cmd 中使用 pip 安裝:
二.使用 TestRunner 模塊生成 HTML 報告
# 加載測試用例的方法:discover(迪斯卡瓦)方法 import unittest from unittestreport import TestRunner # 手機測試用例,使用絕對路徑加載測試用例,使用 r 進行轉碼 one_suite = unittest.defaultTestLoader.discover(r"D:\zj_danyuan\Python_0715_unittest") # 執行用例 # 1.需要創建執行器對象,使用 unittest 當中的 TestRunner(譯:泰斯特.軟那兒) """ :param suites: 測試套件 :param filename: 報告文件名 :param report_dir:報告文件的路徑 :param title:測試套件標題 :param templates: 可以通過參數值1或者2,指定報告的樣式模板,目前只有兩個模板 :param tester:測試者 """ one_runner = TestRunner(one_suite, filename="python.html", report_dir=r"D:\zj_danyuan\Python_0715_unittest\logs", title="演示用例運行產生的測試報告", tester="守護", desc="第一個報告", templates=1 ) # 2.運行套件 one_runner.run()
執行測試用例
使用瀏覽器打開測試報告
三、Unittestreport 之 DataDrivenTest (DDT)中數據驅動使用
關於數據驅動這邊就不給大家做過多的介紹了,數據驅動的目的是將測試數據和用例邏輯進行分離,提高代碼的重用率,以及用例的維護,關於數據驅動本,unittestreport.dataDriver模塊中實現了三個使用方法,支持使用列表(可迭代對象)、json文件、yaml文件來生成測試用例,接來分別給大家介紹一下使用方法:
1、使用介紹
from unittestreport.dataDriver
import ddt, list_data,json_data,yaml_data
-
第一步:使用ddt裝飾測試用例類
-
第二步:根據使用的數據選擇對應的方法進行驅動
2、使用案例
import unittest from unittestreport import ddt, list_data, json_data, yaml_data """ 判斷五組數據是否相等 """ test_cases = [ (11, 11), (11, 12), (14, 14), (17, 17), (19, 19), ] @ddt class TestDome(unittest.TestCase): @list_data(test_cases) def test_demo(self, case): a, b = case self.assertEqual(a, b)
示例1、用例保存在可迭代對象中(如列表):使用LIST_DATA
from unittestreport import ddt, list_data @ddt class TestClass(unittest.TestCase): cases = [{'title': '用例1', 'data': '用例參數', 'expected': '預期結果'}, {'title': '用例2', 'data': '用例參數', 'expected': '預期結果'}, {'title': '用例3', 'data': '用例參數', 'expected': '預期結果'}] @list_data(cases) def test_case(self, data): pass
示例2、用例保存在JSON文件中:使用JSON_DATA
from unittestreport import ddt,json_data @ddt class TestClass(unittest.TestCase): @json_data(apitest) def test_case(self, data): pass
json文件中的數據格式
- cases.json文件
[ { "title": "用例1", "data": "用例參數", "expected": "預期結果" }, { "title": "用例2", "data": "用例參數", "expected": "預期結果" }, { "title": "用例3", "data": "用例參數", "expected": "預期結果" } ]
示例3、用例保存在YAML文件中:使用YAML_DATA
from unittestreport import ddt,yaml_data @ddt class TestClass(unittest.TestCase): @yaml_data("C:/xxxx/xxx/cases.yaml") def test_case(self, data): pass
yaml文件中的數據展示
- cases.yaml文件
- title: 用例1 data: 用例參數 expected: 預期結果 - title: 用例2 data: 用例參數 expected: 預期結果 - title: 用例4 data: 用例參數 expected: 預期結果
2、注意點:
-
關於使用ddt的時候進行數據驅動,指定測試報告中的用例描述:
-
測試報告中的用例描述默認使用的是用例方法的文檔字符串注釋,
-
如果要給每一條用例添加用例描述,需要在用例數據中添加 title 或者 desc 字段,字段對應的數據會自動設置為測試報告中用例的描述
四、測試用例失敗重運行
關於 unittest 重運行機制,unittestreport 中提供了兩種方式
方式一: RERUN 裝飾器
- 使用案例:使用 rerun 裝飾失敗需要重運行的用例,該用例失敗后會自動重運行
from unittestreport import rerun class TestClass(unittest.TestCase): @rerun(count=4, interval=2) def test_case_01(self): a = 100 b = 99 assert a == b
用例運行
runner = TestRunner(test_suite)
runner.run()
參數說明:
- count:用來指定用例失敗重運行的次數
- interval:指定每次重運行的時間間隔,默認三秒
方式二:TESTRUNNER.RERUN方法
-
使用案例:所有的用例失敗,只要有失敗的用例,會自動重運行該用例
- 用例正常編寫即可
- 運行是使用 TestRunner.rerun_run 方法運行
runner = TestRunner(suite=suite)
runner.rerun_run(count=3, interval=2)
參數說明:
- count:用來指定用例失敗重運行的次數
- interval:指定每次重運行的時間間隔
五、Unittestreport 多線程執行測試用例
unittestreport 的 TestRunner 模塊當中的 run 方法
注意:
- 1、確保際個線程任務測試類)在執行的時候不會出現資源競爭(對全局依賴的數據進行修改)
- 2、確保用例類執行沒有先后順序的依賴關系
from unittestreport import TestRunner def run(self, thread_count=1): """ 支持多線程執行 注意點:如果多個測試類共用某一個全局變量,由於資源競爭可能會出現錯誤 :param thread_count:線程數量,默認位1 :return:測試運行結果 """ # 將測試套件按照用例類進行拆分 suites = self.__classification_suite() with ThreadPoolExecutor(max_workers=thread_count) as ts: for i in suites: res = TestResult() self.result.append(res) ts.submit(i.run, result=res).add_done_callback(res.stopTestRun) ts.shutdown(wait=True) res = self.__get_reports() return res
用例示例:
一共有20個測試用例,如果不適用多線程 需要20秒
import unittest import time from unittestreport import ddt, list_data, json_data, yaml_data, rerun @ddt class TestDome(unittest.TestCase): @list_data(range(10)) def test_demo(self, case): print(case) time.sleep(1) @ddt class TestDome1(unittest.TestCase): @list_data(range(10)) def test_demo(self, case): print(case) time.sleep(1)
運行文件:
# 加載測試用例的方法:discover(迪斯卡瓦)方法 import unittest from unittestreport import TestRunner # 收集測試用例,使用絕對路徑加載測試用例,使用 r 進行轉碼 one_suite = unittest.defaultTestLoader.discover(r"D:\zj_danyuan\Python_lianxi\repo1") # 執行用例1.需要創建執行器對象,使用 unittest 當中的 TestRunner(譯:泰斯特.軟那兒) one_runner = TestRunner(one_suite, filename="python.html", report_dir=r"D:\zj_danyuan\Python_lianxi\repo1", title="演示用例運行產生的測試報告", tester="守護", desc="第一個報告", templates=1 ) # 2.多線程運行 one_runner.run(thread_count=2)
使用多線程運行 后為 10秒
六、郵件發送測試報告
unittestreport內部實現了發生測試結果到郵箱的方法,執行完測試用例之后調用發送測試報告的方法即可。發郵件的方法介紹:TestRunner類中實現了send_email方法,可以方便用戶,快速發送郵件。
send_email 方法:
def send_email(self, host, port, user, password, to_addrs, is_file=True): """ 發生報告為附件到郵箱 :param host: str類型,(smtp服務器地址) :param port: int類型,(smtp服務器地址端口) :param user: str類型,(郵箱賬號) :param password: str類型(郵箱密碼) :param to_addrs: str(單個收件人) or list(多個收件人)收件人列表, :return: """ sm = SendEmail(host=host, port=port, user=user, password=password) if is_file: filename = self.email_conent["file"] else: filename = None content = self.email_conent["content"] sm.send_email(subject=self.title, content=content, filename=filename, to_addrs=to_addrs)
使用案例:
runner = TestRunner(suite) runner.run() runner.send_email(host="smtp.qq.com", port=465, user="musen_nmb@qq.com", password="algmmzptupjccbab", to_addrs="3247119728@qq.com")
參數介紹
- host: smtp服務器地址
- port:端口
- user:郵箱賬號
- password:smtp服務授權碼
- to_addrs:收件人郵箱地址(一個收件人傳字符串,多個收件人傳列表)
收到的郵件樣式
六、推送測試結果到釘釘
關於把測試結果推送到釘釘群,unittestreport里面進行了封裝。執行完用例之后,調用TestRunner對象的dingtalk_notice方法即可。
參數介紹:
關於dingtalk_notice這個方法的參數如下,大家可以根據使用需求來進行選擇。
- url: 釘釘機器人的Webhook地址
- key: (非必傳:str類型)如果釘釘機器人安全設置了關鍵字,則需要傳入對應的關鍵字
- secret:(非必傳:str類型)如果釘釘機器人安全設置了簽名,則需要傳入對應的密鑰
- atMobiles: (非必傳,list類型)發送通知釘釘中要@人的手機號列表,如:[137xxx,188xxx]
- isatall: 是否@所有人,默認為False,設為True則會@所有人
- except_info:是否發送未通過用例的詳細信息,默認為False,設為True則會發送失敗用例的詳細信息
案例代碼:
import unittest from unittestreport import TestRunner # 收集用例到套件 suite = unittest.defaultTestLoader.discover(CASE_DIR) runner = TestRunner(suite) # 執行用例 runner.run() url = "https://oapi.dingtalk.com/robot/send?access_token=6e2a63c2b9d870ee878335b5ce6d5d10bb1218b8e64a4e2b55f96a6d116aaf5" # 發送釘釘通知 runner.dingtalk_notice(url=url, key='釘釘安全設置的關鍵字',secret='釘釘安全設置簽名的秘鑰') # 備注:關於釘釘群機器人的創建大家可以去看釘釘開放平台上的教程,關鍵字和秘鑰,
# 根據創建釘釘機器人時設置的去添加,沒有設置就不需要傳這個參數。
url 獲取方式:
- 百度搜索 “釘釘開放平台”
- 找到:服務端API >> 群機器人 >> 自定義機器人接入 >> 自定義機器人接入 ,按照文檔步驟設置
- 鏈接(如果打不開按照上面查找):https://developers.dingtalk.com/document/app/custom-robot-access
釘釘收到樣式:
七、推送測試結果到企業微信
目前也有不少的公司使用企業微信辦公,自動化跑完之后,測試結果需要推送到企業微信群,所以把這個功能做了一下集成(其實大家自己去些也沒多少代碼)。執行完用例之后,調用TestRunner對象的weixin_notice 方法即可將測試結果推送到企業微信群。
參數介紹
- CHATID: 企業微信群ID
- ACCESS_TOKEN:調用企業微信API接口的憑證
- CORPID:企業ID
- CORPSECRET:應用的憑證密鑰
案例代碼
import unittest from tests.test_case import TestClass from unittestreport import TestRunner # 加載用例 suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestClass) runner = TestRunner(suite=suite) # 運行用例 runner.run() # 推送測試結果到企業微信 # 方式一: runner.weixin_notice(chatid="企業微信群id", access_token="調用企業微信API接口的憑證") # 方式二: runner.weixin_notice(chatid="企業微信群id",corpid='企業ID', corpsecret='應用的憑證密鑰')
*******請大家尊重原創,如要轉載,請注明出處:轉載自:https://www.cnblogs.com/shouhu/,謝謝!!*******