前言
對(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)告類型2

- 測(cè)試報(bào)告類型3

-
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í)指定count和interval即可將執(zhí)行失敗的用例多次執(zhí)行。
-
count:指定用例失敗后重新運(yùn)行的次數(shù) -
interval:指定每次重新執(zhí)行用例的時(shí)間間隔
runner = TestRunner(suite=suite)
runner.run(count=3, interval=2)
測(cè)試報(bào)告發(fā)送郵件
目前郵件接口只支持465和25兩個(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ì)有修改公共資源(全局變量)的情況