【软件测试】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框架莱管理运行多个测试用例的)。
好处:
- 能够组织多个用例去执行
- 提供丰富的断言方法(让程序代码代替人工自动的判断预期结果和实际结果是否相符)
- 能够生成测试报告
组成:
- TestCase
Testcase(测试用例),注意这个测试用例是 unittest框架的组成部分,不是手工和自动化中我们所说的用例(Test case)
主要作用:每个 Testcase(测试用例)都是一个代码文件,在这个代码文件中 来书写 真正的用例代码 - TestSuite
TestSuite(测试套件),用来 管理 组装(打包)多个 TestCase(测试用例)的
- TestRunner
TestRunner(测试执行,测试运行),用来 执行 TestSuite(测试套件)的
- TestLoader
TestLoader(测试加载),功能是对 Testsuite(测试套件)功能的补充管理 组装(打包)多个 Testcase(测试用例)的
- Fixture
Fixture(测试夹具),书写在 Testcase(测试用例)代码中,是一个代码结构,可以在每个方法执行前后都会执行的内容
举例:
登录的测试用例,每个用例中重复的代码就可以写在Fixture 代码结构中,只写一遍,但每次用例方法的执行,都会执行Fixture 中的代 码
1.打开浏览器
2.输入网址
一、TestCase(测试用例)
- 是一个代码文件,在代码文件中 来书写真正的用例代码
- 代码文件的名字必须按照标识符的规则来书写(可以将代码的作用在文件的开头使用注释说明)
步骤
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、常见的断言方法
序号 | 断言方法 | 断言描述 |
---|---|---|
1 | assertTrue(expr, msg=None) | 验证expr是true,如果为false,则fail |
2 | assertFalse(expr, msg=None) | 验证expr是false,如果为true,则fail |
3 | assertEqual(expected, actual, msg=None) | 验证expected==actual,不等则fail【掌握】 |
4 | assertNotEqual(first, second, msg=None) | 验证first!=second,相等则fail |
5 | assertIsNone(obj, msg=None) | 验证obj是None,不是则fail |
6 | assertIsNotNone(obj, msg=None) | 验证obj不是None,是则fail |
7 | assertIn(member, container, msg=None) | 验证是否member in container【掌握】 |
8 | assertNotIn(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
- 代码
- 导包 unittest/parameterized
- 定义测试类
- 书写测试方法(用到的测试数据用变量替代)
- 组织测试数据并传参
# 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【重点】
-
HTMLTestRunner介绍
- HTMLTestRunner是一个第三方的类库,用来执行测试用例并生成HTML格式的测试报告
- 网上有多种不同的实现版本,用法都类似,只是生成的HTML报告样式有差别
- 注意:下载的文件要与Python的版本兼容(有些版本只支持Python2.x)
本课程中介绍两种模板文件,HTMLTestRunner.py 和 HTMLTestRunner_PY3.py HTMLTestRunner.py:样式比较简单,不需要依赖外部JS和CSS文件 HTMLTestRunner_PY3.py:样式比较美观,需要依赖外部JS和CSS文件
-
使用方法
1. 获取第三方的 测试运行类模块, 将其放在代码的目录中 2. 导包 unittest 3. 可以使用套件对象,加载对象,去添加用例方法 4. 实例化 第三方的运行对象 并运行套件对象
-
代码
# 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版本 (选填)
-
- 组织用例文件(Testcase 里边),书写参数化,书写断言,书写 Fixture,书写 跳过,
- 如果单个测试测试文件,直接运行,得到测试报告,如果有多个测试文件,需要组装运行生成测试报告
- 使用 套件对象组装,或者使用 加载对象组装
- 运行对象 运行
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 命令。如果您需要删除一个非空目录(包含文件和子目录),可以使用以下命令: rm -rf <directory_name>参数解释: -r:递归删除,即删除目录及其所有内容&am…...

1991-2024年经管类国自然、国社科立项名单(附68份国自然标书)-最新出炉 附下载链接
很全!1991-2024年经管类国自然、国社科立项名单(附68份国自然标书) 下载链接-点它👉👉👉:很全1991-2024年经管类国自然、国社科立项名单(附68份国自然标书).zip 资源介…...

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

从零学习大模型(七)-----LoRA(中)
自注意力层中的 LoRA 应用 Transformer 的自注意力机制是模型理解输入序列之间复杂关系的核心部分。自注意力层通常包含多个线性变换,包括键(Key)、查询(Query) 和 值(Value) 三个权重矩阵的线…...

Java知识巩固(十二)
I/O JavaIO流了解吗? IO 即 Input/Output,输入和输出。数据输入到计算机内存的过程即输入,反之输出到外部存储(比如数据库,文件,远程主机)的过程即输出。数据传输过程类似于水流,因…...

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

企业计算机监控软件是什么?6款电脑监控软件分享!提升企业管理效率,吐血推荐!
嘿,各位企业管理者和IT小伙伴们! 您是否曾担忧员工在工作时间内效率低下?是否对公司的数据安全感到不安? 别担心,今天我们就来聊聊企业计算机监控软件,它就像是企业的"超级侦探",帮…...

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

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

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

Matlab实现鼠群优化算法优化回声状态网络模型 (ROS-ESN)(附源码)
目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 鼠群优化算法(Rat Swarm Optimization, ROS)是一种基于老鼠群体行为的群体智能优化算法。ROS通过模拟老鼠在寻找食物时的聚集、分散和跟随行为,来探索解空间并寻找最优解。该算…...

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

Linux 基础io_理解文件系统_软硬链接_动静态库
一.磁盘 1.磁盘物理结构 盘片 磁盘可以有多个磁片,每个磁片有两个盘面,每个盘面都对应一个磁头,都可以存储数据。 磁道 扇区 磁道是指在盘面上,由磁头读写的数据环形轨道。每个磁道都是由一圈圈的圆形区域组成,数据…...

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

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

【探索数字孪生,引领未来技术】
在数字化浪潮的推动下,数字孪生技术正成为连接虚拟与现实的桥梁,它不仅是工业互联网的基石,更是智慧城市、智慧园区、智慧楼宇以及元宇宙构建的核心。为了帮助更多专业人士掌握这一前沿技术,我们荣幸地宣布,“新质技术…...

Tcp_Sever(线程池版本的 TCP 服务器)
Tcp_Sever(线程池版本的 TCP 服务器) 前言1. 功能介绍及展示1.1 服务端连接1.2 客户端连接(可多个用户同时在线连接服务端)1.3 功能服务1.3.1 defaultService(默认服务)1.3.2 transform(大小写转…...

第十一章 Vue生命周期及生命周期的四个阶段
目录 一、引言 1.1. Vue生命周期的具体阶段 1.2. 每个阶段的具体作用和常用场景 1.3. 生命周期钩子函数 二、代码示例 三、运行效果 一、引言 Vue生命周期是指Vue组件实例从创建到销毁的整个过程。在这个过程中,组件经历了一系列的阶段,每个阶段…...

展厅展会客流显示屏的客流统计功能如何实现
随着科技的发展,展厅和展会的管理越来越智能化。客流显示屏作为一种高效的管理工具,能够实时显示参观人数,帮助主办方更好地了解客流情况,优化资源配置。本文将详细介绍展厅展会客流显示屏的客流统计功能如何实现,分为…...

golang正则表达式的使用及举例
正则表达式很强大,在一些场合如抓包,爬虫等方面很有用。在 Go语言中,正则表达式通过标准库 regexp 提供支持。使用正则表达式可以进行字符串匹配、替换和分割等操作。 以下是正则表达式的基本使用方法及示例: 1. 导入 regexp 包 …...

Flutter杂学: iOS 上启用自动填充和关联域
下面是详细的配置和代码,以确保在 iOS 上启用自动填充和关联域(Associated Domains)功能。 配置步骤 1. 在 Apple Developer 控制台中启用 Associated Domains 登录 Apple Developer。导航至您的 App ID 设置页面。找到您要配置的 App ID&…...

接口自动化-框架搭建(Python+request+pytest+allure)
使用代码如何开展接口自动化测试。 一 选择自动化测试用例 业务流程优先,单接口靠后,功能稳定优先,变更频繁不选。 二 搭建自动化测试环境 (1)安装python编译器3.7版本以上--自行安装 (2)安…...

[论文阅读]Constrained Decision Transformer for Offline Safe Reinforcement Learning
Constrained Decision Transformer for Offline Safe Reinforcement Learning Proceedings of the 40th International Conference on Machine Learning (ICML), July 23-29, 2023 https://arxiv.org/abs/2302.07351 泛读只需要了解其核心思想即可。 安全强化学习(Safe Rei…...

工具_Nginx
文章目录 location语法介绍跨域配置https配置http重定向到https配置反向代理配置负载均衡配置upstream配置负载均衡算法(1)rr轮询(默认)(2)wrr加权轮询(weight)(3&#x…...

web开发Model1
WEB开发模式–Model 1 Model1是指基于JSPJavaBean的开发模式,JSP负责web的相关部分,包括数据的展示,请求逻辑的控制等,JavaBean负责业务的逻辑部分,包括数据的存取,业务的实现。 这是我写的一个小项目&…...