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

【软件测试】python——Unittest

UnitTest 框架

笔记来自于黑马程序员python自动化测试教程,python从基础到Uinttest框架管理测试用例。链接:[黑马程序员python自动化测试教程,python从基础到Uinttest框架管理测试用例](https://www.bilibili.com/video/BV1av411q7dT?spm_id_from=333.788.player.switch&vd_source=ecc19dcfc171f374d54c63c80b6e2a19&p=197)

定义:UnitTest 是 python 自带的一个单元测试框架,可以用来进行单元测试。

作用:自动化脚本(用例代码)执行框架(使用unittest框架莱管理运行多个测试用例的)。

好处

  1. 能够组织多个用例去执行
  2. 提供丰富的断言方法(让程序代码代替人工自动的判断预期结果和实际结果是否相符)
  3. 能够生成测试报告

组成

  1. TestCase

    Testcase(测试用例),注意这个测试用例是 unittest框架的组成部分,不是手工和自动化中我们所说的用例(Test case)
    主要作用:每个 Testcase(测试用例)都是一个代码文件,在这个代码文件中 来书写 真正的用例代码

  2. TestSuite

    TestSuite(测试套件),用来 管理 组装(打包)多个 TestCase(测试用例)的

  3. TestRunner

    TestRunner(测试执行,测试运行),用来 执行 TestSuite(测试套件)的

  4. TestLoader

    TestLoader(测试加载),功能是对 Testsuite(测试套件)功能的补充管理 组装(打包)多个 Testcase(测试用例)的

  5. Fixture

    Fixture(测试夹具),书写在 Testcase(测试用例)代码中,是一个代码结构,可以在每个方法执行前后都会执行的内容
    举例:
    登录的测试用例,每个用例中重复的代码就可以写在Fixture 代码结构中,只写一遍,但每次用例方法的执行,都会执行Fixture 中的代 码
    1.打开浏览器
    2.输入网址


一、TestCase(测试用例)

  1. 是一个代码文件,在代码文件中 来书写真正的用例代码
  2. 代码文件的名字必须按照标识符的规则来书写(可以将代码的作用在文件的开头使用注释说明)
步骤
1. 导包(unittest)
2. 自定义测试类
3. 在测试类中书写测试方法
4. 执行用例
代码
python文件:(testcase1.py)
'''
代码的目的:学习 TestCase(测试用例)模块的书写方法
'''
# 1. 导包
import unittest# 2. 自定义测试类,血药继承unittest模块中的TestCase类
class TestDemo1(unittest.TestCase):# 3.书写测试方法,即 用例代码,目前没有真正的用例代码,使用print代替# 书写要求:测试方法必须以test_开头def test_method1(self):print('测试方法1-1)def test_method2(self):print('测试方法1-2)
python文件:(testcase2.py)
'''
代码的目的:学习 TestCase(测试用例)模块的书写方法
'''
# 1. 导包
import unittest# 2. 自定义测试类,血药继承unittest模块中的TestCase类
class TestDemo2(unittest.TestCase):# 3.书写测试方法,即 用例代码,目前没有真正的用例代码,使用print代替# 书写要求:测试方法必须以test_开头def test_method1(self):print('测试方法2-1)def test_method2(self):print('测试方法2-2)

二、TestSuite(测试套件) & TestRunner(测试执行)

TestSuite:管理 打包 组装 TestCase 文件的
TestRunner:执行 TestSuite 套件的

步骤
1. 导包(unittest)
2. 实例化(创建对象),套件对象
3. 使用套件对象添加用例方法
4. 实例化运行对象
5. 使用运行对象去执行套件对象
代码
python文件:(suite_runner.py)
'''
学习 TestSuite 和 TestRunner 的使用
'''
# 1. 导包(unittest)
import unittest
# 2. 实例化(创建对象),套件对象
from testcase1 import TestDemo1
from testcase2 import TestDemo2suite = unittest.TestSuite()
# 3. 使用套件对象添加用例方法
# 方式一:套件对象.addTest(测试类名('方法名'))  # 建议测试类名和方法名直接复制,不要手写
suite.addTest(TestDemo1('test_method1'))
suite.addTest(TestDemo1('test_method2'))
suite.addTest(TestDemo2('test_method1'))
suite.addTest(TestDemo2('test_method2'))
# 方式二:套件对象.addTest(unittest.makeSuite(测试类名))
suite.addTest(unittest.makeSuite(TestDemo1))
suite.addTest(unittest.makeSuite(TestDemo2))
# 4. 实例化运行对象
runner = unittest.TextTestRunner()
# 5. 使用运行对象去执行套件对象
# 运行对象.run(套件对象)
runner.run(suite)

运行结果解释
在这里插入图片描述


三、TestLoader(测试加载)

TestLoader(测试加载),作用和 Testsuite 的作用是一样的,对 Testsuite 功能的补充,用来组装测试用例的
比如:
如果 Testcase 的代码文件有很多,(10,20,30)

步骤
1. 导包(unittest)
2. 实例化测试加载对象并添加用例  ---> 得到的是suite对象
4. 实例化运行对象
5. 运行对象去执行套件对象
代码实现

在一个项目中 TestCase的代码,一般放在一个单独的目录中

'''
TestLoader的使用
'''
# 1. 导包
import unittest# 2. 实例化加载对象并添加用例
# unittest.TestLoader().discover('用例所在路径', pattern='用例的代码文件名.py')
# 用例所在的路径建议使用相对路径,用例的代码文件名可以使用 *(任意多个任意字符) 通配符# 使用自己创建的加载对象TestLoader()
suite = unittest.TestLoader().discover('./case', pattern='test*.py')
# 使用默认加载对象defaultTestLoader
suite = unittest.defaultTestLoader.discover('./case', pattern='test*.py')# # 3. 实例化运行对象
# runner = unittest.TextTestRunner()
# # 4. 执行
# runner.run(suite)# 可以将3,4布变为一步
unittest.TextTestRunner().run(suite)

四、Fixture(测试夹具)

Fixture(测试夹具)是一种代码结构
在某些特定的情况下 会自动执行	
方法级别【掌握】
在每个测试方法(用例代码)执行前后都会自动调用的结构
# 方法执行之前
def setUp(self):# 每个测试方法执行之前都会执行pass# 方法执行之后
def tearDown(self):# 每个测试方法执行之后都会执行pass
类级别【掌握】
在每个测试类中,所有方法执行前后,都会自动调用的结构(在整个类中,执行之前执行之后各一次)
# 类级别的Fixture方法,是一个类方法# 类中所有方法之前@classmethoddef setUpClass(cls):pass# 类中所有方法之后@classmethoddef tearDownClass(cls):pass
模块级别【了解】
模块:代码文件
在每个代码文件执行前后执行的代码结构
#模块几倍的需要写在类的外边直接定义函数即可
# 代码文件之前
def setUpModule():pass# 代码文件之后
def tearDownModule():pass
方法级别和类级别的 前后的方法,不需要同时出现,根据用例代码的需要自行的选择使用

案例——登录

1. 打开浏览器(整个测试过程中就打开一次浏览器) —— 类级别
2. 输入网址(每个测试方法都需要一次)—— 方法级别
3. 输入用户名密码验证码点击登录(不同的测试数据)测试方法
4. 关闭当前页面(每个测试方法都需要一次)—— 方法级别
5. 关闭浏览器(整个测试过程中就关闭一次浏览器) —— 类级别
--------------------------------------------------------------------------------------------------------
1. 打开浏览器(整个测试过程中就打开一次浏览器) —— 类级别
2. 输入网址(每个测试方法都需要一次)—— 方法级别
3. 输入用户名密码验证码点击登录(不同的测试数据)测试方法
4. 关闭当前页面(每个测试方法都需要一次)—— 方法级别
2. 输入网址(每个测试方法都需要一次)—— 方法级别
3. 输入用户名密码验证码点击登录(不同的测试数据)测试方法
4. 关闭当前页面(每个测试方法都需要一次)—— 方法级别
2. 输入网址(每个测试方法都需要一次)—— 方法级别
3. 输入用户名密码验证码点击登录(不同的测试数据)测试方法
4. 关闭当前页面(每个测试方法都需要一次)—— 方法级别
2. 输入网址(每个测试方法都需要一次)—— 方法级别
3. 输入用户名密码验证码点击登录(不同的测试数据)测试方法
4. 关闭当前页面(每个测试方法都需要一次)—— 方法级别
5. 关闭浏览器(整个测试过程中就关闭一次浏览器) —— 类级别
  • 代码

    import unittestclass TestLogin(unittest.TestCase):def setUp(self):'''每个测试方法之前执行'''print('-----2. 输入网址。。。')def tearDown(self):'''每个测试方法之后执行'''print('-----4. 关闭当前页面。。。')@classmethoddef setUpClass(cls) -> None:'''所有测试方法之前执行'''print('-----1. 打开浏览器。。。')@classmethoddef tearDownClass(cls) -> None:'''所有测试方法之后执行'''print('-----5. 关闭浏览器。。。')def test_login1(self):print('-----3. 输入正确用户名密码验证码,点击登录1')def test_login2(self):print('-----3. 输输入错误用户名密码验证码,点击登录2')
    

    运行结果
    在这里插入图片描述


五、断言

概念:让程序代替人工自动判断预期结果与实际结果是否相符断言的结果有两种:
> True:案例通过
> False:案例不通过
在unittest中使用断言,都需要通过self.断言方法来验证
1、常见的断言方法
序号断言方法断言描述
1assertTrue(expr, msg=None)验证expr是true,如果为false,则fail
2assertFalse(expr, msg=None)验证expr是false,如果为true,则fail
3assertEqual(expected, actual, msg=None)验证expected==actual,不等则fail【掌握】
4assertNotEqual(first, second, msg=None)验证first!=second,相等则fail
5assertIsNone(obj, msg=None)验证obj是None,不是则fail
6assertIsNotNone(obj, msg=None)验证obj不是None,是则fail
7assertIn(member, container, msg=None)验证是否member in container【掌握】
8assertNotIn(member, container, msg=None)验证是否member not in container
python文件:tools.py
def login(username, password):if username == 'admin' and password == '123456':return '登陆成功'else:return '登陆失败'
python文件:assert.py
import unittestfrom tools import loginclass TestLogin(unittest.TestCase):def test_username_password_ok(self):self.assertEqual('登陆成功', login('admin', '123456'))def test_username_error(self):self.assertEqual('登陆失败', login('root', '123456'))def test_password_error(self):self.assertEqual('登陆失败', login('admin', '123123'))def test_username_password_error(self):self.assertEqual('登陆失败', login('aaa', '123123'))
2、参数化
参数化:在测试方法中,使用变量来代替具体的测试数据,然后使用传参的方法将测试数据传递给方法的变量
好处:相似的代码不需要多次书写工作场景:- 测试数据一般放在json文件中- 使用代码读取json文件,提取我们想要的数据 ---> [(), ()] or  [[], []]
安装插件
unittest 框架 本身不支持 参数化,想要使用参数化,需要安装插件来完成
- 联网安装pip install parameterized
  • 代码
    1. 导包 unittest/parameterized
    2. 定义测试类
    3. 书写测试方法(用到的测试数据用变量替代)
    4. 组织测试数据并传参
# 1.导包 unittest / parameterized
import unittest
from parameterized import parameterized
from tools import login# 4.组织测试数据
# 【注】列表中有几组数据,就是几个测试用例
data = [('admin', '123456', '登陆成功'),('root', '123456', '登陆失败'),('admin', '123123', '登陆失败'),('aaa', '123123', '登陆失败')
]# 2.定义测试类
class TestLogin(unittest.TestCase):# 4.参数化装饰器 @parameterized.expand(data)@parameterized.expand(data)# 3.书写测试方法(用到的测试数据用变量替代)def test_login(self, username, password, expect):self.assertEqual(expect, login(username, password))

代码结果:
在这里插入图片描述

【注】data中的数据和函数的参数列表中的参数要保持一致

若从data.json文件中导入所需要的数据,代码如下:
# python文件:data.json
[{"desc": "正确的用户名和密码","username": "admin","password": "123456","expect": "登陆成功"},{"desc": "错误的用户名","username": "root","password": "123456","expect": "登陆失败"},{"desc": "错误的密码","username": "admin","password": "123123","expect": "登陆失败"},{"desc": "错误的用户名和密码","username": "aaa","password": "123123","expect": "登陆失败"}
]
# 1.导包 unittest / parameterized
import unittest
import json
from parameterized import parameterized
from tools import login# 4.组织测试数据
# 方式二:从文件中读取测试数据
def build_data():data = []with open('data.json', 'r', encoding='utf-8') as f:result = json.load(f)for item in result:data.append((item.get('username'), item.get('password'), item.get('expect')))return data# 2.定义测试类
class TestLogin(unittest.TestCase):# 4.参数化装饰器 @parameterized.expand(data)@parameterized.expand(build_data())# 3.书写测试方法(用到的测试数据用变量替代)def test_login(self, username, password, expect):self.assertEqual(expect, login(username, password))

在这里插入图片描述


六、跳过

对于一些未完成的或者不满足测试条件的测试函数和测试类,可以跳过执行
代码书写在TestCase文件中
1、使用方法
# 直接将测试函数标记成跳过
@unittest.skip('跳过的原因')# 根据条件判断测试函数是否跳过
@unittest.skipIf(condition, reason)
import unittestversion = 30class TestDemo(unittest.TestCase):@unittest.skip('跳过测试方法1')def test_method1(self):print('TestCase1-1')@unittest.skipIf(version > 20, '版本大于20不用测试')def test_method2(self):print('TestCase1-2')def test_method3(self):print('TestCase1-3')

在这里插入图片描述


七 、测试报告

  • 自带的测试报告

    只有单独运行TestCase的代码,才会生成测试报告
    
  • 第三方的测试报告-HTMLTestRunner【重点】

    1. HTMLTestRunner介绍

      • HTMLTestRunner是一个第三方的类库,用来执行测试用例并生成HTML格式的测试报告
      • 网上有多种不同的实现版本,用法都类似,只是生成的HTML报告样式有差别
      • 注意:下载的文件要与Python的版本兼容(有些版本只支持Python2.x)
        本课程中介绍两种模板文件,HTMLTestRunner.py 和 HTMLTestRunner_PY3.py
        HTMLTestRunner.py:样式比较简单,不需要依赖外部JS和CSS文件
        HTMLTestRunner_PY3.py:样式比较美观,需要依赖外部JS和CSS文件
        
    2. 使用方法

      1. 获取第三方的 测试运行类模块, 将其放在代码的目录中
      2. 导包 unittest
      3. 可以使用套件对象,加载对象,去添加用例方法
      4. 实例化 第三方的运行对象 并运行套件对象
      
    3. 代码

      # 1.获取第三方的测试运行类模块, 将其放在代码的目录中
      # 2.导包unittest
      import unittest
      from HTMLTestRunner import HTMLTestRunner# 3.可以使用套件对象,加载对象,去添加用例方法
      suite = unittest.defaultTestLoader.discover('.', pattern='parameter.py')
      # 4.实例化第三方的运行对象并运行套件对象
      HTMLTestRunner(stream=open('report.html', 'wb')).run(suite)
      # stream=sys.stdout, 测试报告的文件对象(open),注意:要用 wb 打开  (必填)
      # verbosity=1, 报告的详细程度,默认 1-简略,2-详细 (选填)
      # title=None, 测试报告的标题 (选填)
      # description=None, 描述信息,python版本,pycharm版本 (选填)
      

      在这里插入图片描述
      在这里插入图片描述

  1. 组织用例文件(Testcase 里边),书写参数化,书写断言,书写 Fixture,书写 跳过,
  2. 如果单个测试测试文件,直接运行,得到测试报告,如果有多个测试文件,需要组装运行生成测试报告
  3. 使用 套件对象组装,或者使用 加载对象组装
  4. 运行对象 运行
    4.1 运行对象 = 第三方的运行类(文件对象(打开文件需要使用 wb 方式))
    4.2 运行对象.run(套件对象)

相关文章:

【软件测试】python——Unittest

UnitTest 框架 笔记来自于黑马程序员python自动化测试教程,python从基础到Uinttest框架管理测试用例。链接:[黑马程序员python自动化测试教程,python从基础到Uinttest框架管理测试用例](https://www.bilibili.com/video/BV1av411q7dT?spm_i…...

Maven:详解 clean 和 install 命令的使用

clean 的主要功能是清理项目构建过程中生成的所有临时文件和输出文件。具体来说,clean 阶段会删除 target 目录及其所有内容。 clean 阶段的具体功能 删除 target 目录: target 目录是 Maven 构建过程中默认的输出目录,存放所有构建生成的文件…...

HTTP与RPC

一、概念 HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种应用层协议,主要用于在Web服务器之间传输html页面和其他Web资源。 RPC(Remote Procedure Call,远程过程调用) 是一种通用的远程调用通信协议&#…...

解决蓝牙键盘按键错乱的问题

最近发现我的蓝牙键盘按下的键盘与实际不符,于是就上网搜索答案,网上的方法都试了一遍 最后想着准备退货,没想到客服直接给我解决了 原因很简单,就是之前误触了键盘的某些按键导致的 每个键盘品牌的按键因该都不同的,可…...

MiL.k X Biggie 奇妙宇宙来袭!

MiL.k 和亚航奖励计划联手推出 MiL.k X BIGGIE 奇妙宇宙,为亚航会员和 MiL.k 用户提供神奇的 Web3 体验。这款沉浸式体验位于 The Sandbox 的 MiL.k Land,提供趣味游戏,解锁令人兴奋的新奖励。 亚航吉祥物 BIGGIE 和他友好的机舱服务员将引导…...

云服务器中删除非空目录(包含文件和子目录)rm -rf <directory_name>

在云服务器中删除目录可以使用 rm 命令。如果您需要删除一个非空目录&#xff08;包含文件和子目录&#xff09;&#xff0c;可以使用以下命令&#xff1a; rm -rf <directory_name>参数解释&#xff1a; -r&#xff1a;递归删除&#xff0c;即删除目录及其所有内容&am…...

1991-2024年经管类国自然、国社科立项名单(附68份国自然标书)-最新出炉 附下载链接

很全&#xff01;1991-2024年经管类国自然、国社科立项名单&#xff08;附68份国自然标书&#xff09; 下载链接-点它&#x1f449;&#x1f449;&#x1f449;&#xff1a;很全1991-2024年经管类国自然、国社科立项名单&#xff08;附68份国自然标书&#xff09;.zip 资源介…...

Flutter问题记录 - 布局中莫名其妙的白线/缝隙

文章目录 前言开发环境问题描述问题分析解决方案最后 前言 最近客服反馈了一个奇怪的问题&#xff0c;有个用户反馈其他问题时给了应用截图&#xff0c;然后他发现这截图中有一条奇怪的白线。他在自己手机上没有发现这个问题&#xff0c;于是提工单反馈到我这。 开发环境 Fl…...

从零学习大模型(七)-----LoRA(中)

自注意力层中的 LoRA 应用 Transformer 的自注意力机制是模型理解输入序列之间复杂关系的核心部分。自注意力层通常包含多个线性变换&#xff0c;包括键&#xff08;Key&#xff09;、查询&#xff08;Query&#xff09; 和 值&#xff08;Value&#xff09; 三个权重矩阵的线…...

Java知识巩固(十二)

I/O JavaIO流了解吗&#xff1f; IO 即 Input/Output&#xff0c;输入和输出。数据输入到计算机内存的过程即输入&#xff0c;反之输出到外部存储&#xff08;比如数据库&#xff0c;文件&#xff0c;远程主机&#xff09;的过程即输出。数据传输过程类似于水流&#xff0c;因…...

一家光伏企业终止,恐不具行业代表性,市占率仅为2.35%

海达光能终止原因如下&#xff1a;报告期内海达光能销售金额较所在行业第二名亚玛顿相差两倍以上&#xff0c;公司毛利率更是远低于行业龙头福莱特&#xff0c;恐难以说明公司行业代表性。在企业竞争上&#xff0c;公司2021年度的市场占有率约为2.35%&#xff0c;公司未来光伏玻…...

企业计算机监控软件是什么?6款电脑监控软件分享!提升企业管理效率,吐血推荐!

嘿&#xff0c;各位企业管理者和IT小伙伴们&#xff01; 您是否曾担忧员工在工作时间内效率低下&#xff1f;是否对公司的数据安全感到不安&#xff1f; 别担心&#xff0c;今天我们就来聊聊企业计算机监控软件&#xff0c;它就像是企业的"超级侦探"&#xff0c;帮…...

VisionPro —— CogOCRMaxTool工具详解

CogOCRMaxTool的作用&#xff1a; CogOCRMaxTool:是一个字符识别工具&#xff0c;主要用于字符识别,它能够根据已训练的字符样本读取灰度图像中的字符,并返回读取结果。 一&#xff1a;工具位置 二&#xff1a;添加图片 三&#xff1a;工具的初始页面 将识别框拖到需要识别处…...

网站安全问题都有哪些,分别详细说明

网站安全问题涉及多个方面&#xff0c;以下是一些常见的网站安全问题及其详细说明&#xff1a; 数据泄露 问题描述&#xff1a;数据泄露是指网站存储的用户敏感信息&#xff08;如用户名、密码、信用卡信息等&#xff09;被非法获取。黑客可能通过SQL注入、XSS攻击等手段窃取这…...

DiskGenius一键修复磁盘损坏

下午外接磁盘和U盘都出现扇区损坏&#xff0c;估计就是在开着电脑&#xff0c;可能是电脑运行的软件还在对磁盘进行读写&#xff0c;不小心按到笔记本关机键&#xff0c;重新开机读写磁盘分区变得异常卡顿&#xff0c;估摸就是这个原因导致扇区损坏。在进行读写时&#xff0c;整…...

Matlab实现鼠群优化算法优化回声状态网络模型 (ROS-ESN)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 鼠群优化算法&#xff08;Rat Swarm Optimization, ROS&#xff09;是一种基于老鼠群体行为的群体智能优化算法。ROS通过模拟老鼠在寻找食物时的聚集、分散和跟随行为&#xff0c;来探索解空间并寻找最优解。该算…...

nfs作业

一、作业要求 1、开放/nfs/shared目录&#xff0c;供所有用户查询资料 2、开放/nfs/upload目录&#xff0c;为192.168.xxx.0/24网段主机可以上传目录&#xff0c; 并将所有用户及所属的组映射为nfs-upload,其UID和GID均为210 3、将/home/tom目录仅共享给192.168.xxx.xxx这台…...

Linux 基础io_理解文件系统_软硬链接_动静态库

一.磁盘 1.磁盘物理结构 盘片 磁盘可以有多个磁片&#xff0c;每个磁片有两个盘面&#xff0c;每个盘面都对应一个磁头&#xff0c;都可以存储数据。 磁道 扇区 磁道是指在盘面上&#xff0c;由磁头读写的数据环形轨道。每个磁道都是由一圈圈的圆形区域组成&#xff0c;数据…...

大语言模型参数传递、model 构建与tokenizer构建(基于llama3模型)

文章目录 前言一、传递参数构建1、构建模型参数2、构建数据参数3、构建训练参数4、类似parse方式解析数据、模型、训练参数五、构建tokenizer与model1、tokenizer与model调用代码2、tokenizer实现2、model实现前言 上一篇说到huggingface的参数传递理论方法,本篇文章应用与ll…...

使用 `screen` + `nohup` 实现高效日志记录和多环境任务管理

使用 screen nohup 实现高效日志记录和多环境任务管理 在深度学习模型训练中&#xff0c;特别是在服务器上运行长时间的任务时&#xff0c;有效的任务管理和日志记录至关重要。我们通常需要在后台运行多个任务&#xff0c;同时为每个任务配置不同的 conda 环境。通过结合使用…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合

作者&#xff1a;来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布&#xff0c;Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明&#xff0c;Elastic 作为 …...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...