UnitTestReport挺好用

1 安装

bash 复制代码
pip install unittestreport -i https://pypi.tuna.tsinghua.edu.cn/simple

2 生成报告

python 复制代码
# test_eip.py
import unittest
from unittestreport import TestRunner


class TestObject1(unittest.TestCase):

    def setUp(self):
        pass
    def tearDown(self):
        pass
    def test_1_login(self):
        print('login')
    def test_2_get_user_info(self):
        print('get user info')

if __name__ == '__main__':
    test_case_list = unittest.TestLoader().loadTestsFromNames(['test_eip.TestObject1'])
    s = unittest.TestSuite()
    s.addTest(test_case_list)
    runner = TestRunner(
        s, # 测试套件 (必传)
        filename='test_unittest', # 制定报告文件名
        report_dir='./reports',  # 制定存放报告路径
        title='测试一下这个插件',  # 指定测试报告标题
        tester='匿名',  # 测试人员的名称
        desc='测试一下unittestreport',  # 测试项目描述
        templates=1 # 测试报告模板风格,目前只有2个 1 or 2
    )
    runner.run()
bash 复制代码
# 执行过程
(venv) PS D:\pro\lucost> python .\test_eip.py
login
test_1_login (test_eip.TestObject1)执行------>【通过】
login
test_1_login (test_eip.TestObject1)执行------>【通过】
test_1_login (test_eip.TestObject1)执行------>【通过】
get user info
test_2_get_user_info (test_eip.TestObject1)执行------>【通过】
所有用例执行完毕,正在生成测试报告中......
测试报告已经生成,报告路径为:./reports\test_unittest.html

在当前目录下生产reports目录,目录下有两个文件

history.json 记录每次的结果,(最好执行前清理一下)

test_unittest.html,风格1的报告

测试报告风格2 科技感满满啊

3 失败重试

python 复制代码
import unittest
from unittestreport import TestRunner, rerun


class TestObject1(unittest.TestCase):

    def setUp(self):
        pass
    
    def tearDown(self):
        pass
    # count 制定用力失败重新运行的次数
    # interval 制定每次重新运行的时间间隔
    @rerun(count=4, interval=2)
    def test_1_login(self):
        '''登录'''
        print('login')
        assert False
if __name__ == '__main__':
    # unittest.main(verbosity=2)
    test_case_list = unittest.TestLoader().loadTestsFromNames(['test_eip.TestObject1'])
    s = unittest.TestSuite()
    s.addTest(test_case_list)
    runner = TestRunner(
        s, # 测试套件 (必传)
        filename='test_unittest', # 制定报告文件名
        report_dir='./reports',  # 制定存放报告路径
        title='测试一下这个插件',  # 指定测试报告标题
        tester='匿名',  # 测试人员的名称
        desc='测试一下unittestreport',  # 测试项目描述
        templates=2 # 测试报告模板风格,目前只有2个 1 or 2
    )
    runner.run()

执行过程

bash 复制代码
(venv) PS D:\pro\lucost> python .\test_eip.py 
login
====用例执行失败===
Traceback (most recent call last):
  File "D:\pro\venv\lib\site-packages\unittestreport\core\reRun.py", line 12, in run_count
    func(*args, **kwargs)
  File "D:\pro\lucost\test_eip.py", line 17, in test_1_login
    assert False
AssertionError
==============开始第0次重运行=============
login
====用例执行失败===
Traceback (most recent call last):
  File "D:\pro\venv\lib\site-packages\unittestreport\core\reRun.py", line 12, in run_count
    func(*args, **kwargs)
  File "D:\pro\lucost\test_eip.py", line 17, in test_1_login
    assert False
AssertionError
==============开始第1次重运行=============
  File "D:\pro\lucost\test_eip.py", line 17, in test_1_login
    assert False
AssertionError
  File "D:\pro\lucost\test_eip.py", line 17, in test_1_login
    assert False
  File "D:\pro\lucost\test_eip.py", line 17, in test_1_login
  File "D:\pro\lucost\test_eip.py", line 17, in test_1_login
    assert False
AssertionError
==============开始第1次重运行=============
login
====用例执行失败===
Traceback (most recent call last):
  File "D:\pro\venv\lib\site-packages\unittestreport\core\reRun.py", line 12, in run_count
    func(*args, **kwargs)
  File "D:\pro\lucost\test_eip.py", line 17, in test_1_login
    assert False
AssertionError
==============开始第2次重运行=============
login
====用例执行失败===
Traceback (most recent call last):
  File "D:\pro\venv\lib\site-packages\unittestreport\core\reRun.py", line 12, in run_count
    func(*args, **kwargs)
  File "D:\pro\lucost\test_eip.py", line 17, in test_1_login
    assert False
AssertionError
test_1_login (test_eip.TestObject1)执行------>【失败】
所有用例执行完毕,正在生成测试报告中......
测试报告已经生成,报告路径为:./reports\test_unittest.html

在当前测试的用例中同时配置。推荐这个方式

python 复制代码
import unittest
from unittestreport import TestRunner, rerun


class TestObject1(unittest.TestCase):

    def setUp(self):
        pass
    
    def tearDown(self):
        pass
    
    def test_1_login(self):
        '''登录'''
        print('login')
        assert False

if __name__ == '__main__':
    # unittest.main(verbosity=2)
    test_case_list = unittest.TestLoader().loadTestsFromNames(['test_eip.TestObject1'])
    s = unittest.TestSuite()
    s.addTest(test_case_list)
    runner = TestRunner(
        s, # 测试套件 (必传)
        filename='test_unittest', # 制定报告文件名
        report_dir='./reports',  # 制定存放报告路径
        title='测试一下这个插件',  # 指定测试报告标题
        tester='匿名',  # 测试人员的名称
        desc='测试一下unittestreport',  # 测试项目描述
        templates=2 # 测试报告模板风格,目前只有2个 1 or 2
    )
    # runner.run()
    runner.rerun_run(count=4, interval=3)

4 发送邮件

python 复制代码
    runner.run()
    runner.send_email(
        host='smtp.163.com',
        port='465',
        user='',  # 发送端邮箱
        password='', # smtp 授权的密码
        to_addrs='' # 目标邮箱
    )

5 数据驱动

案例1

python 复制代码
import unittest
from unittestreport import TestRunner, rerun, ddt, list_data

cases = [
    {'title': '用例1', 'data': '用例参数', 'expected': '预期结果'},
    {'title': '用例2', 'data': '用例参数', 'expected': '预期结果'},
    {'title': '用例3', 'data': '用例参数', 'expected': '预期结果'}
]


@ddt
class TestObject1(unittest.TestCase):

    def setUp(self):
        pass
    
    def tearDown(self):
        pass
    
    @list_data(cases)
    def test_1_login(self, data):
        '''登录'''
        print(data)
        assert True
bash 复制代码
(venv) PS D:\pro\lucost> python .\test_eip.py
{'title': '用例1', 'data': '用例参数', 'expected': '预期结果'}
test_1_login_001 (test_eip.TestObject1)执行------>【通过】
{'title': '用例2', 'data': '用例参数', 'expected': '预期结果'}
test_1_login_002 (test_eip.TestObject1)执行------>【通过】
{'title': '用例3', 'data': '用例参数', 'expected': '预期结果'}
test_1_login_003 (test_eip.TestObject1)执行------>【通过】
所有用例执行完毕,正在生成测试报告中......
测试报告已经生成,报告路径为:./reports\test_unittest.html

案例2

json 复制代码
[
    {"title": "用例4", "data": "用例参数", "expected": "预期结果"},
    {"title": "用例5", "data": "用例参数", "expected": "预期结果"},
    {"title": "用例6", "data": "用例参数", "expected": "预期结果"}
]
python 复制代码
import unittest
from unittestreport import TestRunner, rerun, ddt, json_data

@ddt
class TestObject1(unittest.TestCase):

    def setUp(self):
        pass
    
    def tearDown(self):
        pass
    
    @json_data('./data.json')
    def test_1_login(self, data):
        '''登录'''
        print(data)
        assert True
bash 复制代码
{'title': '用例4', 'data': '用例参数', 'expected': '预期结果'}
test_1_login_001 (test_eip.TestObject1)执行------>【通过】        
{'title': '用例5', 'data': '用例参数', 'expected': '预期结果'}
test_1_login_002 (test_eip.TestObject1)执行------>【通过】        
{'title': '用例6', 'data': '用例参数', 'expected': '预期结果'}
test_1_login_003 (test_eip.TestObject1)执行------>【通过】        
所有用例执行完毕,正在生成测试报告中......
测试报告已经生成,报告路径为:./reports\test_unittest.html

案例三

yaml 复制代码
- title: 用例9
  data: 用例参数
  expected: 预期结果

- title: 用例10
  data: 用例参数
  expected: 预期结果

- title: 用例11
  data: 用例参数
  expected: 预期结果
python 复制代码
import unittest
from unittestreport import TestRunner, rerun, ddt, yaml_data


@ddt
class TestObject1(unittest.TestCase):

    def setUp(self):
        pass
    
    def tearDown(self):
        pass
    
    @yaml_data('./ddd.yaml')
    def test_1_login(self, data):
        '''登录'''
        print(data)
        assert True
bash 复制代码
(venv) PS D:\pro\lucost> python .\test_eip.py 
{'title': '用例9', 'data': '用例参数', 'expected': '预期结果'}
test_1_login_001 (test_eip.TestObject1)执行------>【通过】
{'title': '用例10', 'data': '用例参数', 'expected': '预期结果'}
test_1_login_002 (test_eip.TestObject1)执行------>【通过】
{'title': '用例11', 'data': '用例参数', 'expected': '预期结果'}
test_1_login_003 (test_eip.TestObject1)执行------>【通过】
所有用例执行完毕,正在生成测试报告中......
测试报告已经生成,报告路径为:./reports\test_unittest.html
相关推荐
枫叶林FYL3 分钟前
项目十一:Saga模式分布式旅行预订系统 核心服务实现与Saga编排器
数据库·python·docker
流浪法师解剖鱼5 分钟前
CocosCreator制作推箱子游戏
python·cocos2d
财经资讯数据_灵砚智能11 分钟前
基于全球经济类多源新闻的NLP情感分析与数据可视化(夜间-次晨)2026年6月9日
人工智能·python·ai·信息可视化·自然语言处理·ai编程·灵砚智能
仙俊红14 分钟前
深入理解 ThreadLocal —— 从变量引用、强弱引用到 Spring Boot 实战
spring boot·python·算法
Dxy123931021619 分钟前
Python 请求:为什么 Session 比直接请求快 10 倍?
开发语言·python
The_Ticker20 分钟前
港股量化实测:实时行情接口性能与数据质量深度解析
python·websocket·算法·金融
装不满的克莱因瓶3 小时前
链式法则如何传递参数误差 —— 深入理解神经网络中的梯度传播
人工智能·python·深度学习·神经网络·数学·机器学习·ai
Anastasiozzzz3 小时前
从有限状态机到智能体图:传统 FSM 与 Agent Graph的演进
java·人工智能·python·ai
biter down9 小时前
从 0 到 1 搭建 Python 接口自动化测试框架(博客系统实战)
开发语言·python
肖永威11 小时前
Python多业务并行计算框架插件化演进:从硬编码到动态注册
python·插件化·并行计算·动态注册