unittestreport-自动化测试报告生成

前言

对于自动化测试来说,如何能把测试结果更直观更有效的展示出来一直是测试人员的一块心病。目前主流的有很多生成测试报告的第三方库,例如,HTMLTestRunnerBeautifulReportAllure,等等。不过这些库使用起来各有利弊,总之没有一个库能既满足实用又满足美观。

最近看到一个unittest框架配套的测试报告生成插件,可以做到与unittest框架无缝衔接,并且支持多种格式的自动化测试报告。

什么是unittestreport?

unittestreport是基于unittest开发的一个功能扩展库,开发之初,开发人员只是计划开发一个unittest生成html测试报告的模块,因此命名为unittestreport(听起来很接地气,有没有...😌)。目前已经迭代了数个版本,其提供的功能也越来越丰富。目前已经支持的功能有:

  • HTML测试报告生成
  • unittest数据驱动
  • 失败用例rerun
  • 多线程并发
  • 测试结果推送(邮箱、钉钉、企业微信)

安装

pip install unittestreport

pip install pytest-testreport   # 支持pytest生成报告

生成测试报告

unittestreport中封装了一个TestRunner类,可以用来代替unittest中的TextTestRunner来执行测试用例,执行完测试用例后会自动生成测试报告。并且支持各种测试报告的风格。

❕❕不过实际测试发现,PyCharm中执行的用例不会生成测试报告,只有在终端执行的测试用例会生成测试报告。

import unittest
from unittestreport import TestRunner

class MyTestCase(unittest.TestCase):

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

    def tearDown(self):
        """恢复用例执行环境"""

    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类创建测试报告时,可以通过指定测试参数生成自定义的测试报告。

  • suites:测试用例套,测试集

  • filename:测试报告文件名

  • report_dir:测试报告存放路径

  • title:测试报告的标题名称

  • templates:指定生成测试报告的模板类型(etc: 1、2、3)

    • 测试报告类型1
测试报告模板类型1.png
  • 测试报告类型2
测试报告模板类型2.png
  • 测试报告类型3
测试报告模板类型3.png
  • tester: 测试人员名称
suite = unittest.defaultTestLoader.discover(r'C:\project\open_class\Py0507\testcase')

# 2、创建一个用例运行程序
runner = unittestreport.TestRunner(suite,
                                   tester='测试人员—小柠檬',
                                   filename="test",
                                   report_dir=".",
                                   title='这里设置报告标题',
                                   desc='项目测试生成的报告描述',
                                   templates=2
                                   )

# 3、运行测试用例
runner.run()

失败用例rerun

新的unittestreport中对rerun方法进行了优化,测试时指定countinterval即可将执行失败的用例多次执行。

  • count:指定用例失败后重新运行的次数
  • interval:指定每次重新执行用例的时间间隔
runner = TestRunner(suite=suite)
runner.run(count=3, interval=2)

测试报告发送邮件

目前邮件接口只支持46525两个端口

数据驱动

数据驱动的目的是将测试数据和用例逻辑进行分离,提高代码的重用率,以及用例的维护.

使用方法

from unittestreport import ddt, list_data,json_data,yaml_data

关于数据驱动本,unittestreport.dataDriver模块中实现了三个使用方法,支持使用列表(可迭代对象)、json文件、yaml文件来生成测试用例.

  • 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
    
  • Json_data:用例数据保存在json文件中时使用

    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:用例数据保存在json文件中时使用

    from unittestreport import ddt,yaml_data
    
    @ddt
    class TestClass(unittest.TestCase):
        @yaml_data("C:/xxxx/xxx/cases.yaml")
        def test_case(self, data):
            pass
    
注意点:
  • 关于使用ddt的时候进行数据驱动,指定测试报告中的用例描述:
  • 测试报告中的用例描述默认使用的是用例方法的文档字符串注释,
  • 如果要给每一条用例添加用例描述,需要在用例数据中添加title或者desc字段,字段对应的数据会自动设置为测试报告中用例的描述

并发执行用例

unittestreport中同样提供了对并发执行用例的支持,使用TestRunner.run()方法执行测试用例时,加上thread_count参数即可执行运行用例时开启的线程数量。

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

:warning: 使用并发方式执行用例时,需要考虑以下几个问题

  • 用例执行之间是否有依赖关系
  • 用例之间是否会有修改公共资源(全局变量)的情况
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,677评论 6 524
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,772评论 3 408
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 173,108评论 0 370
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,378评论 1 303
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,394评论 6 403
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,807评论 1 315
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,127评论 3 432
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 41,136评论 0 281
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,693评论 1 328
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,703评论 3 349
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,810评论 1 357
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,400评论 5 352
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,130评论 3 341
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,532评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,707评论 1 278
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,412评论 3 383
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,892评论 2 368

推荐阅读更多精彩内容