目录
使用unittest单元测试框架编写测试用例CountTest.py
六、测试报告的生成,使用HtmlTestRunner生成测试报告
unittest框架的学习
unittest是python单元测试框架,是受到JUnit的启发,
与其他语言中的主流单元测试框架有着相似的风格。
其支持测试自动化,配置共享和关键代码测试。
支持将测试样例聚合到测试集中,并将测试与报告框架独立。
它不仅适用于单元测试,还在自动化测试领域占有一席之地。
借助它组织执行测试用例,使用它提供的丰富的断言方法
进行测试结果的比对,并结合HTMLTestRunner生成
测试报告完成整个自动化测试流程。
即:用代码测试代码
unittest是python内置的单元测试框架,不需要,直接导入使用即可 测试用例需要继承unittest.TestCase 属性该类的测试用例其实就是一个实例方法 该测试用例方法,就必须要使用test开头
一、测试类的编写
cal.py
和 CountTest.py
展示了如何使用 Python 的 unittest
框架进行单元测试。以下是对代码结构和功能的详细说明:
创建被测类cal.py
cal.py
定义了一个 count
类,包含基础的数学运算和随机选择功能:
class count:
def __init__(self, a, b):
self.a = a
self.b = b
def add(self):
return self.a + self.b
def Subtraction(self):
return self.a - self.b
def func(self):
return self.a - self.b > 10 # 简化为直接返回布尔值
def func2(self):
names = ['张三', '李四', '王五', '皮蛋']
return random.choice(names)
二、常见断言方法
使用unittest单元测试框架编写测试用例CountTest.py
常见断言方法 assertEqual() assertNotEqual() assertTrue()
assertEqual 如果两个值相等则测试通过
assertNotEqual 如果两个值不相等则测试通过
assertTrue()表达式结果是True,返回True
import unittest
from Day.day07.calc import count
class CountTest(unittest.TestCase):
#测试加法
def test_add(self):
#类的实例化 类名加上()
c1=count(4,5)
#调用方法
r=c1.add()
#测试的本质是实际结果和需求结果的就比较
#断言
self.assertEqual(r,11)
#测试减法
def test_sub(self):
#类的实例化
c2=count(6,3)
#调用减法
r=c2.Subtraction()
#断言
self.assertEqual(r,3)
def test_func1(self):
c1=count(20,1)
r=c1.func()
self.assertTrue(r,msg="测试不通过")
def test_names(self):
c3=count(4,5)
r=c3.func2()
new_names=['张三','李四','王五','皮蛋','翠花','王峰','李思','花花','草草']
self.assertIn(r,new_names,msg="不存在")
if __name__=='__main__':
CountTest.main()
注意:执行的时候光标一定要放在括号后面,鼠标右键运行
运行结果:
三、对测试环境的初始化和清除模块
TestFixture 对测试环境的初始化和清除模块
测试用例以来的测试数据准备活动就可以在环境的初始化完成
初始化的时候加了什么,清除的时候就删什么
注意这两个名字一定要写对
模块级别>类级别>用例级别
from Day.day07.calc import count
import unittest
def setUpModule():
print("________这是setUpModule_________")
def tearDownModule():
print("—————————这是tearDownModule—————————")
class CountTest(unittest.TestCase):
#用例的执行顺序按照ASCII码表来进行
@classmethod
def setUpClass(cls)->None:
print("———————这是setUpClass—————————")
#每一个用例执行之前都要执行用例的初始化,用例执行之后,都要执行用例的清除
#用例级别的初始化
def setUp(self) -> None:
print("——----这是setUp-------————")
def tearDown(self) -> None:
print("---------这是tearDown---------")
#类级别的清除
@classmethod
def tearDownClass(cls) -> None:
print("------这是tearDownClass--------")
def test_names(self):
c3=count(4,5)
r=c3.func2()
new_names=['张三','李四','王五','皮蛋','翠花','王峰','李思','花花','草草']
print(new_names)
self.assertIn(r,new_names,msg="不存在")
def test_func(self):
print("加油加油加油")
def test_add(self):
c2=count(2,8)
r3=c2.add()
self.assertEqual(r3,10)
if __name__ =='__main__':
CountTest.main()
四、创建测试套件
unittest提供了实现某紫于求的装饰器,在执行测试用例时每个装饰前面加@符号。
@unittest.skip(feason):无条件的跳过装饰的测试,说明跳过测试的原因
@unittest.skiplf(condition,reason):跳过装饰的测试,如果条件为真。
@unittest.skipUnless(condition,reason):跳过装饰的测试,除非条件为真。
@unittest.expectedFailure():测试标记为失败,不管执行结果是否失败,统一标记为失败,但不会抛出错误信息。
@unittest.expectedFailure #如果断言失败,不计入执行case数目中
方法1.通过addTest()加载TestCase到TestSuite中,用于少量的测试用例
#方法1.通过addTest()加载TestCase到TestSuite中,用于少量的测试用例
#创建测试套件
suite=unittest.TestSuite()
#给测试套件添加测试用例
#测试类类名+用例名字
suite.addTest(CountTest('test_add'))
suite.addTest(CountTest('test_names'))
#执行测试套件 TextTestRunner
#创建执行器
runner=unittest.TextTestRunner()
#使用上面那个创建的执行器,执行测试套件
runner.run(suite)
#执行用例之后显示一个'.'代表通过一个测试用例
执行用例之后显示一个'.'代表通过一个测试用例
方法2:同时添加多个测试用例进入到套件之中
#addTests可以接受一个列表
suite=unittest.TestSuite()
cases=[CountTest('test_names'),CountTest('test_add')]
suite.addTests(cases)
#生成执行器
runner=unittest.TextTestRunner()
runner.run(suite)
方法3:添加整个类的测试用例到套件中
suite=unittest.TestSuite()
suite.addTests(unittest.TestLoader().loadTestsFromTestCase(CountTest))
#创建执行器
runner=unittest.TextTestRunner()
runner.run(suite)
方法四 模糊匹配 给套件指定需要执行的测试用例
#制定匹配规则,会自动生成测试套件,将用例添加进去
#加载路径
test_dir='../day07'
#名字不用写完,后面加上*
discover=unittest.defaultTestLoader.discover(start_dir=test_dir,pattern='Cou*.py')
#创建执行器
runner =unittest.TextTestRunner()
# #执行测试用例
runner.run(discover)
五、跳过测试和预期失败
对原有代码进行修改,加上相应注释,如下:
未显示“加油加油”这条用例内容,说明成功跳过,再做修改:
结果同上
结果同上
六、测试报告的生成,使用HtmlTestRunner生成测试报告
HtmlTestRunner是一个用于生成HTML格式测试报告的工具,可以方便地将unittest测试结果可视化。以下是如何使用HtmlTestRunner生成测试报告的方法。
借助HtmlTestRunner来生成,下载下来是一个.py文件
方式一、将下载的文件保存到...\python\lib目录下,不推荐
方式二、创建一个包,将py文件放进去就行了
1.安装HtmlTestRunner.py
通过网盘分享的文件:HTMLTestRunner.py
链接: https://pan.baidu.com/s/137-UO-ZDesn_bO_2c1NhGA 提取码: pz5q
2.基本使用方法
以下是一个完整的示例代码,展示了如何生成测试报告:
import os
import unittest
from common.HTMLTestRunner import HTMLTestRunner
import time
report_path = './report'
# 测试报告的标题
report_title = '冒烟测试'
# 测试的描述
report_desc = "对加减法功能的测试"
# 创建报告目录
if not os.path.exists(report_path):
os.mkdir(report_path)
# 构建时间戳作为报告文件名
rtime = time.strftime("%Y%m%d%H%M%S")
filepath = os.path.join(report_path, f'report{rtime}.html')
# 发现测试用例
case_path = '../day07'
suite = unittest.defaultTestLoader.discover(start_dir=case_path, pattern="C*.py")
# 使用HTMLTestRunner运行测试并生成报告
with open(filepath, "wb") as f1:
runner = HTMLTestRunner(
stream=f1,
title=report_title,
description=report_desc
)
runner.run(suite) # 这里要使用HTMLTestRunner的run方法,不是TextTestRunner
生成后能在我们提前建好的包中找到:
点击即可选择浏览器打开:
3.自定义报告样式
HtmlTestRunner允许自定义报告的样式和内容:
runner = HTMLTestRunner(
output=report_path,
report_name='custom_report',
add_timestamp=False,
combine_reports=True
)
4.高级配置
可以在测试用例中添加更多信息来丰富报告内容:
class TestMath(unittest.TestCase):
"""测试数学运算"""
def test_addition(self):
"""测试加法"""
self.assertEqual(1 + 1, 2)
def test_subtraction(self):
"""测试减法"""
self.assertEqual(3 - 1, 2)
5.注意事项
- 确保测试用例的命名规范一致,便于discover方法查找
- 报告路径需要有写入权限
- 时间戳可以避免报告文件被覆盖
- 测试用例中的docstring会显示在报告中
这种方法生成的HTML报告包含测试结果统计、详细测试步骤和错误信息,方便团队查看和分析测试结果。