UnitTest 框架学习
目录
介绍
python 自带的测试框架,使用时不需要进行导包
组成:
- TestFixture
测试之前或之后需要做的一些操作,常用的有setUp,tearDown,setUpClass,tearDownClass,setUpModel,tearDownModer
Fixture 注意事项:- 使用Fixture结构代码(定义了前后置方法)时,务必保证至少有一个测试方法
- 根据需求只调用部分 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)
报告信息:
本文来自博客园,作者:chuangzhou,转载请注明原文链接:https://www.cnblogs.com/czzz/p/15754942.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!