UnitTest 框架学习

介绍

python 自带的测试框架,使用时不需要进行导包
组成:

  • TestFixture

    测试之前或之后需要做的一些操作,常用的有setUp,tearDown,setUpClass,tearDownClass,setUpModel,tearDownModer
    Fixture 注意事项:

    1. 使用Fixture结构代码(定义了前后置方法)时,务必保证至少有一个测试方法
    2. 根据需求只调用部分 Fixture 方法是允许的, 不一定非得成对实现
  • TestCase

    Unittest 中执行测试的最小单元,测试用例的方法必须以test开头,并且执行顺序依照的是方法名的ASCII值排序

  • TestSuite

    测试套件就是一组测试用例,作用是将多个测试用例放在一起,执行一个测试套件就可以将这些测试用例全部执行

  • TestRunner

    测试运行器用来执行测试用例,并返回测试用例的执行结果

  • TestLoader

    加载TestCase 到TestSuit中

入门案例

import unittest

"""
目标:
执行当前测试类的全部test开头的方法
1.测试类必须继承unittest.TestCase
2.测试方法必须以test开头
3.测试类的名字建议以Test开头或者TestCase结尾
4.模块名默认以test开头
"""


class TestDemo(unittest.TestCase):

    def setUp(self) -> None:
        print("setUp")

    def tearDown(self) -> None:
        print("tearDown")

    def test_method01(self):
        self.assertEqual("张飞", "张飞")


if __name__ == '__main__':
    unittest.main()

通过TestSuite 执行指定测试案例

"""
目标:通过TestSuite 运行指定的测试案例
"""

import unittest


from test01 import TestDemo
from test02 import TestDemo2
# 1.获得TestSuite对象
suite = unittest.TestSuite()

# 2.添加测试方法
# 注意格式:suite.addTest(类名("方法名"))
suite.addTest(TestDemo("test_method01"))
suite.addTest(TestDemo2("test_method01"))

# 3.执行测试用例
# 3.1 获得TextTestRunner对象
runner = unittest.TextTestRunner()
# 3.2执行run方法
runner.run(suite)



通过TestSuite 执行指定测试类的全部test开头的方法

"""
目标:通过TestSuite
    运行指定测试类下的全部test开头的方法
"""

# 1.导包
import unittest
from test02 import TestDemo2
# 2.获得TestSuite对象
suite = unittest.TestSuite()

# 3.调用addTest方法指定测试类
"""
unittest.makeSuite(testCaseClass, prefix='test')
如果不指定前缀, 默认是test开头的方法
"""
suite.addTest(unittest.makeSuite(TestDemo2, prefix="method"))
# 4.实例化TextTestRunner
runner = unittest.TextTestRunner()
runner.run(suite)

TestLoader 的使用

"""
目标:
    掌握TestLoader的使用方法,通过TestLoader()运行
    指定路径下,以某种前缀开头的.py文件中的test开头的方法
"""
# 1.导包
import unittest

# 2.通过TestLoader获得TestSuite对象

"""
unittest.TestLoader() 也可以使用unittest.defaultTestLoader代
注意:
def discover(self, start_dir, pattern='test*.py')
start_dir: 搜索的路径
pattern: 指定测试文件的前缀
"""
suite = unittest.TestLoader().discover(".")
# 3.实例化TextTestRunner对象
runner = unittest.TextTestRunner()
# 4.执行run方法
runner.run(suite)

参数化 - DDT

"""
目标:掌握unittest + ddt 实现参数化
DDT: Data Driven Tests,即数据驱动测试,为第三方插件第一次使用需要在安装
"""
import unittest
import ddt


def my_sum(a, b):
    return a + b


@ddt.ddt
class TestSum(unittest.TestCase):

    """
    注意:
    1.测试类需要被@ddt.ddt 修饰
    2.ddt.data(): 可以传递列表和元组,一个列表或元组是一个测试用例
    3.ddt.unpack: 对测试数据进行解包
    """
    @ddt.data((1, 2, 3), (3, 4, 7))
    @ddt.unpack
    def test_my_sum(self, a, b, expect):
        result = my_sum(a, b)
        self.assertEqual(result, expect)

参数化 - parameterized

"""
目标:
掌握unittest 参数化第三方插件parameterized的基本使用,第一次使用需要安装插件
"""
import unittest

from parameterized import parameterized


def my_sum(a, b):
    return a + b


class SumTestCase(unittest.TestCase):
    """
    注意:
    1.parameterized.expand(),需要传递列表
    2.列表中包含元组,一个元组就是一个测试用例
    """

    @parameterized.expand([(1, 2, 3), (1, 5, 6)])
    def test_my_sum(self, a, b, expect):
        result = my_sum(a, b)
        self.assertEqual(result, expect)

skip

"""
@unittest.skip()
@unittest.skipif(condition, reason)
注意:
这两个修饰符可以修饰类和方法
当修饰类时,将忽略类的所有测试方法
"""
import unittest

version = 25


#@unittest.skip
@unittest.skipIf(version > 20, "跳过此案例")
class TestDemo2(unittest.TestCase):

    # @unittest.skip
    def test_method01(self):
        self.assertEqual("关羽", "关羽")

    # @unittest.skipIf(version > 20, "跳过此案例")
    def test_method02(self):
        self.assertEqual("曹操", "曹操")

HTMLTestReport插件生成报告

"""
目标: 掌握HTMLTestReport 的基本使用

report = HTMLTestReport(file_path, [title], [description])
file_path: 报告生成的路径
title: 可选参数,测试报告的标题
description: 可选参数,为报告描述信息
"""

import unittest
from htmltestreport import HTMLTestReport


suite = unittest.TestLoader().discover('../case', pattern='test*.py')
# 生成报告的路径
report_path = '../report/report.html'
# 生成报告
report = HTMLTestReport(report_path, title='测试报告', description='v1.0')

report.run(suite)

报告信息:

posted @   chuangzhou  阅读(69)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示