unittestreport-自動(dòng)化測(cè)試報(bào)告生成

前言

對(duì)于自動(dòng)化測(cè)試來說,如何能把測(cè)試結(jié)果更直觀更有效的展示出來一直是測(cè)試人員的一塊心病。目前主流的有很多生成測(cè)試報(bào)告的第三方庫,例如,HTMLTestRunner、BeautifulReport、Allure,等等。不過這些庫使用起來各有利弊,總之沒有一個(gè)庫能既滿足實(shí)用又滿足美觀。

最近看到一個(gè)unittest框架配套的測(cè)試報(bào)告生成插件,可以做到與unittest框架無縫銜接,并且支持多種格式的自動(dòng)化測(cè)試報(bào)告。

什么是unittestreport?

unittestreport是基于unittest開發(fā)的一個(gè)功能擴(kuò)展庫,開發(fā)之初,開發(fā)人員只是計(jì)劃開發(fā)一個(gè)unittest生成html測(cè)試報(bào)告的模塊,因此命名為unittestreport(聽起來很接地氣,有沒有...??)。目前已經(jīng)迭代了數(shù)個(gè)版本,其提供的功能也越來越豐富。目前已經(jīng)支持的功能有:

  • HTML測(cè)試報(bào)告生成
  • unittest數(shù)據(jù)驅(qū)動(dòng)
  • 失敗用例rerun
  • 多線程并發(fā)
  • 測(cè)試結(jié)果推送(郵箱、釘釘、企業(yè)微信)

安裝

pip install unittestreport

pip install pytest-testreport   # 支持pytest生成報(bào)告

生成測(cè)試報(bào)告

unittestreport中封裝了一個(gè)TestRunner類,可以用來代替unittest中的TextTestRunner來執(zhí)行測(cè)試用例,執(zhí)行完測(cè)試用例后會(huì)自動(dòng)生成測(cè)試報(bào)告。并且支持各種測(cè)試報(bào)告的風(fēng)格。

??不過實(shí)際測(cè)試發(fā)現(xiàn),PyCharm中執(zhí)行的用例不會(huì)生成測(cè)試報(bào)告,只有在終端執(zhí)行的測(cè)試用例會(huì)生成測(cè)試報(bào)告。

import unittest
from unittestreport import TestRunner

class MyTestCase(unittest.TestCase):

    def setUp(self):
        """用例初始化等操作"""
        self.num1 = 24
        self.num2 = 2

    def tearDown(self):
        """恢復(fù)用例執(zhí)行環(huán)境"""

    def test_div(self):
        self.assertEqual(self.num1 / self.num2, 12)

    def test_add(self):
        self.assertEqual(self.num1 + self.num2, 22)

    def test_any(self):
        self.assertEqual(self.num1 % self.num2, 5)


if __name__ == '__main__':
    case = unittest.defaultTestLoader.discover("./")
    runner = TestRunner(case)
    runner.run()

TestRunner類創(chuàng)建測(cè)試報(bào)告時(shí),可以通過指定測(cè)試參數(shù)生成自定義的測(cè)試報(bào)告。

  • suites:測(cè)試用例套,測(cè)試集

  • filename:測(cè)試報(bào)告文件名

  • report_dir:測(cè)試報(bào)告存放路徑

  • title:測(cè)試報(bào)告的標(biāo)題名稱

  • templates:指定生成測(cè)試報(bào)告的模板類型(etc: 1、2、3)

    • 測(cè)試報(bào)告類型1
測(cè)試報(bào)告模板類型1.png
  • 測(cè)試報(bào)告類型2
測(cè)試報(bào)告模板類型2.png
  • 測(cè)試報(bào)告類型3
測(cè)試報(bào)告模板類型3.png
  • tester: 測(cè)試人員名稱
suite = unittest.defaultTestLoader.discover(r'C:\project\open_class\Py0507\testcase')

# 2、創(chuàng)建一個(gè)用例運(yùn)行程序
runner = unittestreport.TestRunner(suite,
                                   tester='測(cè)試人員—小檸檬',
                                   filename="test",
                                   report_dir=".",
                                   title='這里設(shè)置報(bào)告標(biāo)題',
                                   desc='項(xiàng)目測(cè)試生成的報(bào)告描述',
                                   templates=2
                                   )

# 3、運(yùn)行測(cè)試用例
runner.run()

失敗用例rerun

新的unittestreport中對(duì)rerun方法進(jìn)行了優(yōu)化,測(cè)試時(shí)指定countinterval即可將執(zhí)行失敗的用例多次執(zhí)行。

  • count:指定用例失敗后重新運(yùn)行的次數(shù)
  • interval:指定每次重新執(zhí)行用例的時(shí)間間隔
runner = TestRunner(suite=suite)
runner.run(count=3, interval=2)

測(cè)試報(bào)告發(fā)送郵件

目前郵件接口只支持46525兩個(gè)端口

數(shù)據(jù)驅(qū)動(dòng)

數(shù)據(jù)驅(qū)動(dòng)的目的是將測(cè)試數(shù)據(jù)和用例邏輯進(jìn)行分離,提高代碼的重用率,以及用例的維護(hù).

使用方法

from unittestreport import ddt, list_data,json_data,yaml_data

關(guān)于數(shù)據(jù)驅(qū)動(dòng)本,unittestreport.dataDriver模塊中實(shí)現(xiàn)了三個(gè)使用方法,支持使用列表(可迭代對(duì)象)、json文件、yaml文件來生成測(cè)試用例.

  • List_data:用例數(shù)據(jù)保存在可迭代對(duì)象(列表)中時(shí)使用

    from unittestreport import ddt, list_data
    @ddt
    class TestClass(unittest.TestCase):
        cases = [{'title': '用例1', 'data': '用例參數(shù)', 'expected': '預(yù)期結(jié)果'}, 
                 {'title': '用例2', 'data': '用例參數(shù)', 'expected': '預(yù)期結(jié)果'},
                 {'title': '用例3', 'data': '用例參數(shù)', 'expected': '預(yù)期結(jié)果'}]
        
        @list_data(cases)
        def test_case(self, data):
            pass
    
  • Json_data:用例數(shù)據(jù)保存在json文件中時(shí)使用

    from unittestreport import ddt,json_data
    
    @ddt
    class TestClass(unittest.TestCase):
        @json_data('C:/xxx/xxx.json')
        def test_case(self, data):
            pass
    
  • Yaml_data:用例數(shù)據(jù)保存在json文件中時(shí)使用

    from unittestreport import ddt,yaml_data
    
    @ddt
    class TestClass(unittest.TestCase):
        @yaml_data("C:/xxxx/xxx/cases.yaml")
        def test_case(self, data):
            pass
    
注意點(diǎn):
  • 關(guān)于使用ddt的時(shí)候進(jìn)行數(shù)據(jù)驅(qū)動(dòng),指定測(cè)試報(bào)告中的用例描述:
  • 測(cè)試報(bào)告中的用例描述默認(rèn)使用的是用例方法的文檔字符串注釋,
  • 如果要給每一條用例添加用例描述,需要在用例數(shù)據(jù)中添加title或者desc字段,字段對(duì)應(yīng)的數(shù)據(jù)會(huì)自動(dòng)設(shè)置為測(cè)試報(bào)告中用例的描述

并發(fā)執(zhí)行用例

unittestreport中同樣提供了對(duì)并發(fā)執(zhí)行用例的支持,使用TestRunner.run()方法執(zhí)行測(cè)試用例時(shí),加上thread_count參數(shù)即可執(zhí)行運(yùn)行用例時(shí)開啟的線程數(shù)量。

runner = TestRunner(suite=suite)
runner.run(thread_count=3)

:warning: 使用并發(fā)方式執(zhí)行用例時(shí),需要考慮以下幾個(gè)問題

  • 用例執(zhí)行之間是否有依賴關(guān)系
  • 用例之間是否會(huì)有修改公共資源(全局變量)的情況
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容