当前位置: 首页 > news >正文

单元测试学习

回顾测试理论基础
单元测试基础知识
什么是单元测试
单元测试流程、测试计划
测试策略设计、实现
单元测试 - 执行
HTML 报告生成
1 软件测试分类
目标

回顾测试理论知识-测试分类

1. 试分类 代码可见度上-划分分类:
1. 黑盒测试
2. 灰盒测试
3. 白盒测试
1.1 黑盒测试
作用:是针对整个产品系统进行的测试,验证系统是否满足需求规格的定义,及软件产品的正确性和性能等
是否满
足其需求规格的要求。
1.2 灰盒测试
作用:是介于白盒测试与黑盒测试之间的一种测试,灰盒测试多用于集成测试阶段,不仅关注输出、输入的
正确性
,同时也关注程序内部的情况。
1.3 白盒测试
作用:是通过程序的源代码进行测试而不使用用户界面。这种类型的测试需要从代码内部在算法,路径,条件等等中的缺点或者错误,进而加以修正。

2单元测试基础

1.1 案例
1. 组装一台电脑,选购各种配件 (CPU 、主板、内存、硬盘、电源 ) 等,组装完成后,电脑运行启动无反应。
2. 编写一个程序,编写完成程序运行不起来 ( 程序由 N 个不同功能函数和语句组成 )
1.2 问题
1. 无法确定各配件哪个有问题。
2. 无法确定那个函数或语句出现问题。

2. 什么是单元测试?

概念:单元测试是针对程序的最小单元来进行正确性检验的过程。
单元:一个单元可能是单个程序、类、对象、方法(函数)等。
2.1 优点:
1. 减少 BUG
2. 快速定位 BUG
3. 提高代码质量
4. 减少调试时间
2.2 缺点:
1. 周期时间长
4 2. 耗费资源
3. 能力要求高
3. 单元测试 - 总结
1. 概念
2. 优点
3. 缺点
5

如何进行单元测试

目标
1. 了解单元测试流程
如何进行单元测试?
单元测试流程
1. 单元测试 - 计划
1) 确定要测试代码范围
2) 评估标准 ( 确定被测代码的覆盖率 )
2. 测试策略 - 设计
1) 拿到开发代码进行调整 ( 可独立执行 )
3. 测试策略 - 实现
1) 根据调整好的代码 - 画流程图
2) 根据流程图画流图 - 确定复杂度、路径
3) 根据复杂度和路径确定测试用例 ( 测试数据 )
4. 单元测试 - 执行
1) 使用测试框架 (UnitTest) 编写单元测试用例
2) 测试用例 ( 代码 ) 和测试数据分离
3) 生成测试报告
1. 单元测试-计划
概念:对要测试代码的确定以及这些被测代码的评估标准、优先级等说明
        1. 确定单元测试范围 ( 那些代码要做单元测试 )
        2. 评估标准 -( 被测代码的逻辑覆盖率 )
1.1 如何确定单元测试代码范围?
依据:二八原则 (20% 的代码中隐藏了 80% 的缺陷 )
如何确定20%代码?
        1. 频率:使用频率高的代码段;
        2. 复用性: ( 是否已被复用 )
                1). 全新
                2). 部分复用
                3). 全部复用
        3. 开发人员:
                1). 技术
                2). 业务
        4. 复杂度:业务逻辑复杂度 ( 一般认为圈复杂度在 7 级以上代码包括在 20% 的代码中 )
如何确定圈复杂度等级?
        圈复杂度:在学习测试策略实现时讲解
附录-测试范围汇总格式
1.2 评估标准
        如何确定逻辑覆盖率?
                1. 语句覆盖率
                2. 分支覆盖率
                3. 条件覆盖率
                4. 路径覆盖率
                5. 分支- 条件覆盖率
练习 1
提示用户输入一个数,如果该数大于 0 则加 1 ,否则减 1
代码:
#提示用户输入一个数,如果该数大于0则加一,如果小于0则减一num=int(input("请输入一个数:"))
if num>0:num=num+1
elif num<=0:num=num-1
print("num的值为:"+str(num))
流程图 :
流程图
        说明:使用统一规定标准图形,描述程序运行的具体步骤
        目的:
                1) 确定覆盖率
                2) 根据流程图画流图 (流图--> 测试策略实现时学习)
什么是语句覆盖率?
        语句:非分支非判断的代码
练习1 测试数据
        1. 输入 3=2/3
        2. 输入 0=2/3
        3. 输入 -2=2/3
语句覆盖率-总结
        1. 语句
        2. 计算方式:被覆盖语句 / 总语句
分支覆盖率
        分支:判断语句的分支; :if 判断有两个分支
练习1 分支覆盖率测试数据
本题有两个分支
        1. 输入 3=1/2
        2. 输入 0=1/2
        3. 输入 -2=1/2
分支覆盖率-总结
        1. 分支
        1. 计算方式:覆盖分支 / 总分支数
条件覆盖率
条件:结果为 true false
练习 2
输入用户名和密码,如果用户名为:admin, 密码为: 123456 ,输出验证成功;否则输出验证失败;
代码:
#输入用户名和密码,如果用户名为:admin,密码为:123456,输出验证成功;否则输出验证失败;
username=input("请输入用户名:")
password=input("请输入密码:")
#注意input输入的是字符串类型
if username=="admin" and password=="123456":print("验证成功")
else:print("验证失败")
流程图:
练习 2 分析
1. 条件个数
练习 2 测试数据
1. 用户名: admin 密码: 123456
2. 用户名: zhangsan 密码: 123456
3. 用户名: admin 密码: 456789
练习 3
输入两个数 a,b ,如果 a>5 and b<5 执行语句 3 ;否则 elif a==5 or b<10 执行语句 4 ;否则执行语句 5
代码:
流程图:
练习 3 分析
1. 条件个数
练习 3 测试数据
1. a=3,b=6
2. a=6,b=3
3. a=6,b=6
练习 4
9 输入用户名和密码:
如果 username= "admin" and password="123456" 执行语句 3; 否则执行语句 4
如果 username= "zhangsan" and password="654321" 执行语句 5 ;否则执行语句 6
练习 4 分析
1. 条件个数
练习 4 测试数据
1. 用户名: admin 密码: 123456
2. 用户名: zhang 密码: 123456
路径覆盖率
路径:从开始到结束的过程
分析练习 2 路径
1. 路径个数
分析练习 3 路径
1. 路径个数
练习 3 路径覆盖数据
1. a=6,b=3
路径覆盖率 - 总结
1. 路径概念
2. 计算方式:覆盖路径 / 全部路径
3. 路径和分支区别
分支 - 条件覆盖率
10 说明:分支和条件的组合
练习 2 测数据 分支 - 条件覆盖率
1. 用户名: admin 密码: 123456
分析练习 2 分支 - 条件覆盖率
1. 分支个数
2. 条件个数
3. 分支条件个数
练习 3 测试数据 分支 - 条件覆盖率
1. a=6,b=6
练习 3 分析 分支 - 条件覆盖率
1. 分支个数
2. 条件个数
3. 分支条件个数
练习 4 汇总
1. 语句覆盖率
2. 分支覆盖率
3. 条件覆盖率
4. 路径覆盖率
5. 分支条件覆盖率
提示:
练习 4 :路径有 4 条,但有一条永远不可成立,所以路径为 3 条;
练习 4 测试数据
1. 用户名: admin 密码: 123456
11 1.3 测试策略设计、实现
目标
1. 了解单元测试 - 测试策略
1. 什么是单元测试策略?
概念:针对单元测试选择测试的一种方式
2. 单元测试策略 - 方式
1. 自上向下
2. 自下向上
3. 孤立策略
2.1 策略 自上向下
方式:从最上层函数往下开始逐层测试
案例 1
两个函数 ( 求和、求减 ) ,求和函数内调用求减函数;
案例 1 分析
1. 编写求和函数
2. 编写求减函数
3. 在求和函数内调用求减函数
4. 调用求和函数
案例 1 问题
12 1. 我们只想测试求和函数不测求减函数该如何做?
打桩
概念:打桩就是模拟编写一个我们需要引用的函数
提示:一般我们只模拟写个函数名,直接返回相应的结果即可
示例:
def fun_1(self):
return true
自上向下 - 总结:
1. 方式
2. 打桩 ( 模拟调用的函数 )
3. 缺点 ( 成本高 )
2.2 策略 自下向上
方式:从最底层函数往上开始逐层测试
自下向上 - 总结:
1. 方式
2. 缺点 ( 周期长 )
2.3 策略 孤立策略
方式:选择需要进行测试的函数进行测试
孤立策略 - 总结:
1. 方式
2. 【推荐使用】
3. 优点:选择重要的代码进行测试
3. 测试策略实现
13 3.1 什么是测试策略实现?
概念:把我们选定的代码,转向流程图、流图及用例的过程
3.2 测试策略实现如何操作?
1. 将测试代码转换成流程图
2. 根据流程图转换为流图
案例 2
函数 (test001) 判断参数 a, 如果 a>0 ,输出语句 1
案例 2 流程图
什么是流图?
概念:表达程序业务逻辑的复杂度一种示意图
构成:
1) 圈:判断条件、语句块 ( 一条或多条语句 ) 两者都圈
2) 线:箭头指向的线,用来连接圈和圈的指向
流图的目的?
1) 确定单元的复杂度级别
2) 确定测试用例
备注 : 路径的个数为复杂度的级别 ( 一条路径为 1 个复杂度级别 )
14 案例 2 流图
测试用例 模板
案例 2 总结
1. 路径: 2 (1-2-3,1-3)
2. 复杂度: 2
3. 用例个数: 2
案例 3
函数 (test002) 判断参数 a,b; 如果 a>0 and b<10 输出语句 1 ;否则输出语句 2
代码 :
流程图 :
流图:
案例 3 总结
1. 复杂度
2. 路径明细
思考?
15 如果把案例 3 的条件 a>0 and b<10 换成 条件 1 or 条件 2 那么复杂度是多少?
案例 4
输入两个数,如果两个数同时为大于 0 小于 10 ,那么就进行求和运算;否则判断两个数是否同时大于等于 10
20 那么
就进行求减运算,否则输入错误;
代码:
流程图:
流图:
案例 4 总结
1. 路径数:
2. 路径明细:
3. 复杂度:
案例 5 while 循环
使用 while 循环求 1-10 相加之和;
代码:
流程图:
流图:
案例 5 总结
1. 路径数:
2. 路径明细:
3. 复杂度:
案例 6
提示输入三角形三条边 , 进行判断三角形类型 ( 等边、等腰、普通 ) 并进行提示,否则提示不是三角形;
提示:
三角形:两边之和大于第三边;
16 等腰三角形:两条边相等
等边三角形:三条边相等
案例 6 步骤分析
1. 代码:
1) 自定义函数
2) 判断是否为三角形
3) 判断是否为等边三角形
4) 非等边三角形继续判断是否为等腰三角形
5) 如果不是等腰三角形,输出普通三角形
2. 流程图
3. 流图
4. 用例
总结
1. 单元测试计划
2. 测试策略设计
3. 测试策略实现
17 1.4 单元测试 - 执行
目标
1. 回顾 UnitTest 框架使用
2. 基于 UnitTest 测试三角形案例
3. UnitTest 框架中使用数据分离
什么是单元测试执行?
概念:通过单元测试框架对要进行测试代码的实践过程
1. 练习 1
1. 通过 Python 语言编写一个运算的类 (Calc) ,类中包含两个函数:
1) add(self,a,b) 返回 a+b 之和
2) sub(self,a,c) 返回 a-c 之差
提示:通过练习 1 ,我们先简单复习下 UnitTest 框架的使用
1.1 练习 1 步骤分析
1. 新建 Calc
2. Calc 类中新建 add 函数
3. Calc 类中新建 sub 函数
4. 调用对象中方法
1.2 练习 1 单元测试
1. 导包 UnitTest Calc
2. 新建单元测试类 Test01( 集成 unitTest.TestCase)
3. 新建 testAdd() 函数
1). 导入 Calc 类中的 add 函数
18 2). 添加断言
4. 新建 testSub() 函数
1). 导入 Calc 类中的 sub 函数
2). 添加断言
5. 执行测试
1). unittest.main()
1.3 总结
1. 导包
2. setUp 函数作用
3. tearDown 函数作用
4. 断言
5. 运行测试函数
1.4 问题
1. 练习 1 我们数据直接写入代码中,如果数量庞大,我们需要频繁改动数据或复制冗余代码进行实现数据测
试目的。
2. 做不到数据分离 ( 代码和数据分开 ) ,不便维护;
参数化
概念:根据需求动态获取数据并进行赋值的过程
2. 参数化 - 方式
1. XML 格式( 1
3. CSV 格式( 2
2. JSON 串 ( 3
4. TXT 文本( 4
提示:括号内为推荐使用优先级,从小到大 ;1-2 为扩展了解, 3-4 建议重点了解
3. XML 是什么?
概念: XML 是一种标记语句,很类似 HTML 标记语言;后缀 .xml
19 3.1 XML HTML 区别?
XML 是传输和存储数据,焦点在数据; HTML 是显示数据,焦点在外观;
3.2 XML 格式是什么?
<?xml version="1.0" encoding="UTF-8"?>
<book category=" 面授 ">
<title> 单元测试 </title>
<author>XST</author>
<year>2008</year>
<price>39.95</price>
</book>
1. 必须有 XML 声明语句: <?xml version="1.0" encoding="UTF-8"?>
2. 必须要有一个根元素,如: <book>
3. 标签大小写敏感
4. 属性值用双引号
5. 标签成对
6. 元素正确嵌套
7. 标签名可随意命名 , 但有以下限制
1) 不能以数字或者标点符号开始参
2 )不能以字符 “xml” (或者 XML Xml )开始
3) 名称不能包含空格
3.3 需求
对三角形案例单元测试使用 XML 格式进行参数化
3.4 操作步骤
1. 编写 XML 数据文件
2. 编写读取 XML 模块函数
3. 单元测试模块中引用 XML 读取函数
4. 执行
3.5 重点分析
1. 导入 XML from xml.dom import minidom
2. 加载解析 dom=minidom.parse(filename)
20 3. 获取对象 root=dom.documentElement
4. 获取子元素 aas=root.getElementsByTagName(one)[0]
5. 获取子元素值 aas.getElementsByTagName(two)[0].firstChild.data
3.6 XML- 总结
1. 读取方式
2. 什么是 XML
3. XML HTML 区别
4. XML 编写格式
5. 缺点:不适合大量参数化数据时使用
4. CSV 格式
概念: CSV 是一种以逗号做分割的表格格式 ; 后缀 .csv
4.1 使用 CSV 实现三角形案例参数化 - 操作步骤
1. 创建 CSV 文件
2. 编写 CSV 读取模块函数
3. 单元测试 - 引用 CSV 读取函数
4. 执行
4.2 重点分析
1. 导包 import csv
2. 打开 csv 文件
with open("../Data/sjx.csv","r",encoding="utf-8") as f:
lines=csv.reader(f)
4.3 CSV- 总结
1. 读取方式
2. 生成 CSV 文件方式
3. 编码
21 5. 什么是 JSON
概念:一种轻量级数据交换格式;后缀名 .json
提示:
接口测试一般使用 JSON 为接口传递数据规范格式,所以我们有必要对如何获取 JSON 数据做个了解;
5.1 JSON 格式
格式: {"name":" 张三 ","age":28}
提示:由键值对组成 , 健名和值之间使用分号 (:) 分割,多个键值对之间使用逗号 (,) 分割
5.2 使用 JSON 实现三角形案例参数化 - 操作步骤
1. 编写 JSON 文件
2. 编写 JSON 读取模块函数
3. 单元测试 - 引用 JSON 读取函数
4. 执行
5.3 难点分析
1. 导入 JSON 包( import JSON
2. 打开 JSON 文件并解析
with open('../DataXML/sjx.json','r',encoding='utf-8') as f:
file=json.load(f)
5.4 JSON- 总结
1. JSON 概念
2. JSON 格式
3. 如何导入 JSON
4. 如何加载 JSON
6. TXT 文本
概念:一种纯文本格式 ; 后缀名 .txt
6.1 TXT 文本优点:
22 1. 编写测试数据方便
2. 使用模块函数读取时便捷
6.2 使用 TXT 实现三角形案例参数化 - 操作步骤
1. 创建 txt 文本并写入测试数据
2. 编写读取 txt 模块函数
3. 单元测试 - 引用 JSON 读取函数
4. 执行
6.3 难点分析
1. 如何读取 txt 文本?
with open(r'../DataXML/ 三角形 .txt','r',encoding='utf-8') as f:
2. 如何去除行尾 /n 换行符?
line.strip()
6.4 TXT 总结
1. TXT 文本读取
2. 去除行尾回车符 (/n)
7. 参数化 - 总结
1. XML
2. CSV
3. JSON
4. TXT
23 HTML 报告生成
目标
对单元测试生成 HTML 报告进行简单回顾
1. 如何生成 HTML 报告?
1.1. 导入 HTML 报告模板 模板
HTMLTestRunner.py
1.2 编写生成 HTML 模块
# 导入 unittest
import unittest
# 导入 HTMLTestRunner 模板包
from UnitTest.Day02.ReadData.HTMLTestRunner import HTMLTestRunner
# 导入时间包
import time
# 定义测试模块路径
dirpath='.'
disconver=unittest.defaultTestLoader.discover(dirpath,pattern='test*.py')
if __name__=='__main__':
# 存放报告的文件夹
report_dir='../TestReport'
# 报告名称含时间,时间格式
now=time.strftime("%Y-%m-%d %H_%M_%S")
# 报告完整路径 + 名称
report_name=report_dir+'/'+now+'result.html'
# 打开报告写入结果
with open(report_name,'wb')as f:
runner=HTMLTestRunner(stream=f,title="UnitTest Report-SJX",description='Tes
t Case Report')
runner.run(disconver)
1.3 生成报告示例图
24 25

相关文章:

单元测试学习

回顾测试理论基础 单元测试基础知识 什么是单元测试 单元测试流程、测试计划 测试策略设计、实现 单元测试 - 执行 HTML 报告生成 1 软件测试分类 目标 回顾测试理论知识-测试分类 1. 测 试分类 代码可见度上-划分分类&#xff1a; 1. 黑盒测试 2. 灰盒测试 3. …...

python编写接口测试文档(以豆瓣搜索为例)

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…...

C++查看Class类结构

cl指令 cl test.cpp /d1reportSingleClassLayout 类名 注意。上面指令是d1,1是数字1 &#xff0c; 不是字母l;...

appium如何连接多台设备

我们在做app自动化的时候&#xff0c;若要考虑兼容性问题&#xff0c;需要跑几台设备&#xff0c;要是一台一台的跑比较耗时&#xff0c;因此需要考虑使用多线程来同时操作多台设备。 1.我们拿两台设备来模拟操作下&#xff0c;使用&#xff1a;adb devices查看连接状况&#…...

VUE el-form组件不绑定model时进行校验

在el-form中如果要使用:rules规则校验时,需要在el-form标签绑定 :model 如何不绑定model而进行校验字段: 思路: 1.假设规则为非空判断 2.获取该字段,进行非空判断,记录该字段是否校验完成,添加到校验标识中 3.表单或数据提交时,判断校验标识 required 红星星 :error 提示项 …...

计算机视觉的监督学习与无监督学习

什么是监督学习&#xff1f; 监督学习是一种机器学习算法&#xff0c;它从一组已标记的 合成数据生成器中生成的训练数据中学习。这意味着数据科学家已经用正确的标签&#xff08;例如&#xff0c;“猫”或“狗”&#xff09;标记了训练集中的每个数据点&#xff0c;以便算法可…...

Linux-lvds接口

lvds接口 单6 单8 双6 双8...

Android 自定义View一

1.继承已有VIew&#xff0c;改写尺寸&#xff1a;重写onMeasure SquareImageView 2.完全自定义重写onMeasure 3.自定义Layout 重写onMeasure onLayout 1.继承已有VIew&#xff0c;改写尺寸&#xff1a;重写onMeasure 流程&#xff1a; 重写onMeasure 用getmeasureedWidth …...

11、电路综合-集总参数电路结构的S参数模型计算与Matlab

11、电路综合-集总参数电路结构的S参数模型 电路综合专栏的大纲如下&#xff1a; 网络综合和简化实频理论学习概述 前面介绍了许多微带线电路综合的实际案例&#xff0c;如&#xff1a; 3、电路综合原理与实践—单双端口理想微带线&#xff08;伪&#xff09;手算S参数与时域…...

计算机网络--真题

因特网上专门用于传输文件的协议是 因特网上专门用于传输文件的协议通常是 FTP&#xff08;File Transfer Protocol&#xff09;。FTP 是一种标准的网络协议&#xff0c;用于在计算机之间传输文件。它允许用户在客户端和服务器之间传输文件&#xff0c;上传文件到服务器或从服务…...

java毕业设计基于ssm的招聘求职网站

项目介绍 本前途招聘求职网站是针对目前仓库的实际需求&#xff0c;从实际工作出发&#xff0c;对过去的前途招聘求职网站存在的问题进行分析&#xff0c;完善用户的使用体会。采用计算机系统来管理信息&#xff0c;取代人工管理模式&#xff0c;查询便利&#xff0c;信息准确…...

【JavaEE初阶】 初识网络原理

文章目录 &#x1f332;网络发展史&#x1f6a9;独立模式&#x1f6a9;网络互连&#x1f4cc;局域网LAN&#x1f388;基于网线直连&#x1f388;基于集线器组建&#x1f388;基于交换机组建&#x1f388;基于交换机和路由器组建 &#x1f4cc;广域网WAN &#x1f340;网络通信基…...

LeetCode题解:993. 二叉树的堂兄弟节点,BFS,JavaScript,详细注释

原题链接&#xff1a; https://leetcode.cn/problems/cousins-in-binary-tree/ 解题思路&#xff1a; 使用队列进行BFS搜索&#xff0c;同时保存每个节点&#xff0c;以及其深度和父节点信息。当搜索到x和y时&#xff0c;对比深度和父节点&#xff0c;如果满足要求&#xff0…...

在python中加载tensorflow-probability模块和numpy模块

目录 操作步骤&#xff1a; 注意&#xff1a; 问题&#xff1a; 解决办法&#xff1a; 操作步骤&#xff1a; 在虚拟环境的文件夹中&#xff0c;找到Scripts文件夹&#xff0c;点击进去&#xff0c;找到地址栏&#xff0c;在地址栏中输入cmd&#xff0c;进入如下界面。 输…...

t2017递推2猴子摘桃

2、猴子摘桃(nhoi2005xx1) Description 果园里种了很多桃树&#xff0c;当桃树开始结果的时候&#xff0c;猴子便会成群结队地前来摘桃。 猴子们第一天会摘掉桃子的一半还多一个&#xff0c;第二天再摘第一天剩下的一半还多一个&#xff0c;以后每天均摘掉上一天剩下的一半还…...

呼吸灯【FPGA】

晶振50Mhz 1us 等于 计0~49 1ms等于 0~999us 1s等于 0~999ms //led_outalways(posedge FPGA_CLK_50M_b5 or negedge reset_e8) //【死循环】敏感【触发条件&#xff1a;上升沿 clk】【运行副本】if(reset_e81b0)begin //50Mhz晶振&#xff0c; 49_999_999 是 1秒…...

Codeforces 1855E 数学期望 + DP

题意 传送门 Codeforces 1855E Expected Destruction 题解 将 S i S_i Si​ 运动至 S i 1 S_{i1} Si1​ 的情况看作后者消失&#xff0c;则 S i S_i Si​ 在碰到 S i 1 S_{i 1} Si1​ 前&#xff0c; S i 1 S_{i 1} Si1​ 必然存在。 根据数学期望的线性性质&…...

5-1CComplex运算符重载为友元

以下是一个用运算符重载为友元重载的方法重做复数加减法的运算&#xff0c;请填空完成程序。 #include <iostream> using namespace std; class CComplex { private:double real; double imag; public:CComplex(double r0.0,double i0.0){ real(r), imag(i)}friend…...

Vue3.0 watch和watchEffect监听器:VCA

简介 在项目中&#xff0c;有时候检测一个变量的值是否反升了变化。通常使用的watch或者使用低效的循环判断。 在次vue中给我们设置了深度监测数据繁盛变化的方法。 1.vue中提供了在watch监听时设置deep:true 就可以实现对对象的深度监听; 2.immediate:true,代表watch里面声明了…...

1360. 日期之间隔几天

1360. 日期之间隔几天 Java代码&#xff1a; 【DateFormat】DateFormat用于实现日期的格式化 import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; // 好像已过时class Solution {public int daysBet…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...