Python 中使用 unittestreport 之 生成 HTML 報告、失敗用例重運行、郵件發送測試報告、推送結果到釘釘、企業微信


  關於 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 獲取方式:

  • 百度搜索 “釘釘開放平台”

  

釘釘收到樣式:

  

 

七、推送測試結果到企業微信

  目前也有不少的公司使用企業微信辦公,自動化跑完之后,測試結果需要推送到企業微信群,所以把這個功能做了一下集成(其實大家自己去些也沒多少代碼)。執行完用例之后,調用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/,謝謝!!******* 


免責聲明!

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



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