python实现接口自动化

  • 代码实现自动化相关理论
  • 代码编写脚本和工具实现脚本区别是啥?
  • 代码:
    • 优点:代码灵活方便
    • 缺点:学习成本高
  • 工具:
    • 优点:易上手
    • 缺点:灵活度低,有局限性。
  • 总结:
    • 功能脚本:工具
    • 自动化脚本:代码
  • 代码接口自动化怎么做的?

第一步:python+request+unittest;
具体描述?
第二步:封装、调用、数据驱动、日志、报告;
详细举例:
第三步:api\scripts\data\log\report\until…

  • 脚本实现
  • 使用代码编写自动化脚本的流程

1、抽取功能用例转为自动化用例
2、搭建环境(测试工具、)
3、搭建目录结构
4、编写脚本
5、执行脚本
6、配置持续集成

  • 抽取功能转为自动化用例
    在这里插入图片描述

  • 搭建环境(测试工具)

1、python、Pycharm、requests、pymysql、parametrize
2、jenkins、jdk
提示:由于编写的自动化脚本,而自动化脚本编写之前功能已测试完毕,所以不需要在单独搭建项目环境。

  • 搭建目录结构
    在这里插入图片描述
  • 代码编写
  • config.py
import os
# 服务器地址
HPST = "http://user-p2p-test.itheima.net"# 项目目录路径
dir_path = os.path.dirname(__file__)
  • api(api_register_login.py)
from config import HOST
class ApiRegisterLogin:# 初始化def __init__(self, session):# 获取session对象self.session = session  # 实例化session,类下面的其他接口就能使用自己的session# 图片验证码urlself.__url_img_code = HOST + "/common/public/verifycode1/{}"   # {}是随机变量,用{}占用# 短信验证码urlself.__url_phone_code = HOST + "/member/public/sendSms"# 注册urlself.__url_register = HOST + "/member/public/reg"# 登录urlself.__url_login = HOST + "/member/public/login"# 登录状态urlself.__url_login_status = HOST + "/member/public/islogin"# 获取图片验证码接口 封装def api_img_code(self):pass# 获取短信验证码接口 封装def api_phone_code(self):pass# 注册接口 封装def api_register(self):pass# 登录接口 封装def api_login(self):pass# 查询登录状态接口 封装def api_login_status(self):pass

加上__,只能在当千模块里调用,其他py文件调用不了
在这里插入图片描述

  • 接口封装 实现
 # 获取图片验证码接口 封装def api_img_code(self, random):# 调用get方法,返回响应对象res = self.session.get(url=self.__url_img_code.format(random))return res# 获取短信验证码接口 封装def api_phone_code(self, phone, imgVerifyCode):# 1、定义请求参数data = {"phone": phone,"imgVerifyCode": imgVerifyCode,"type": "reg"}# 2、调用请求方法res = self.session.post(url=self.__url_phone_code, data=data)return res# 注册接口 封装def api_register(self, phone, password, verifycode, phone_code):# 1、定义请求参数data = {"phone": phone,"password": password,"verifycode": verifycode,"phone_code": phone_code,"dy_server": "on","invite_phone": ""}# 2、调用请求方法res = self.session.post(url=self.__url_register, data=data)return res# 登录接口 封装def api_login(self, keywords, password):# 1、定义请求参数data = {"keywords": keywords,"password": password}# 2、调用请求方法res = self.session.post(url=self.__url_login, data=data)return res# 查询登录状态接口 封装def api_login_status(self):res = self.session.post(self.__url_login_status)
  • script(test01_register_login.py)
    在这里插入图片描述
import unittestimport requestsfrom api.api_register_login import ApiRegisterLoginclass TestRegisterLogin(unittest.TestCase):# 初始化def setUp(self):# 获取session对象self.session = requests.session()# 获取ApiRegisterLogin实例self.reg = ApiRegisterLogin(self.session)# 结束def tearDown(self):# 关闭session对象self.session.close()# 获取图片验证码接口 测试def test01_img_code(self):pass# 获取短信验证码接口 测试def test02_phone_code(self):pass# 注册接口测试def test03_register(self):pass# 登录接口 测试def test04_login(self):pass# 查询登录状态 测试def test05_login_status(self):pass
  • 注册登录接口调试测试
import unittestimport requestsfrom api.api_register_login import ApiRegisterLoginclass TestRegisterLogin(unittest.TestCase):# 初始化def setUp(self):# 获取session对象self.session = requests.session()# 获取ApiRegisterLogin实例self.reg = ApiRegisterLogin(self.session)# 结束def tearDown(self):# 关闭session对象self.session.close()# 获取图片验证码接口 测试def test01_img_code(self):# 1、调用图片验证码接口r = self.reg.api_img_code(123)# 2、查看响应状态码print(r.status_code)# 获取短信验证码接口 测试def test02_phone_code(self, phone=13600001111, imgVerifyCode=8888):# 1、调用获取图片验证码接口----目的:让session记住cookieself.reg.api_img_code(123)# 2、调用短信验证码接口r = self.reg.api_phone_code(phone=phone, imgVerifyCode=imgVerifyCode)# 3、查看响应结果print(r.json())# 注册接口测试def test03_register(self, phone=13600001111, imgVerifyCode=8888, password="test123", phone_code=666666):# 1、图片验证码接口self.reg.api_img_code(123)# 2、短信验证码接口self.reg.api_phone_code(phone=phone, imgVerifyCode=imgVerifyCode)# 3、注册接口r = self.reg.api_register(phone=phone, password=password, verifycode=imgVerifyCode, phone_code=phone_code)# 4、查看结果print(r.json())# 登录接口 测试def test04_login(self, keywords=13600001111, password="test123"):# 1、登录接口r = self.reg.api_login(keywords=keywords, password=password)# 2、查询结果print(r.json())# 查询登录状态 测试def test05_login_status(self, keywords=13600001111, password="test123"):# 1、调用登录接口self.reg.api_login(keywords=keywords, password=password)# 2、调用查询登录结果接口r = self.reg.api_login_status()print(r.json())
  • 断言

说明:判断程序执行实际结果是否符合预期结果

  • 示例:

在这里插入图片描述

  • 提示:
    • 捕获异常的目的是为了将错误信息记录下来
    • 捕获信息完成后,必须抛出异常
import unittestimport requestsfrom api.api_register_login import ApiRegisterLoginclass TestRegisterLogin(unittest.TestCase):# 初始化def setUp(self):# 获取session对象self.session = requests.session()# 获取ApiRegisterLogin实例self.reg = ApiRegisterLogin(self.session)# 结束def tearDown(self):# 关闭session对象self.session.close()# 获取图片验证码接口 测试def test01_img_code(self):try:# 1、调用图片验证码接口r = self.reg.api_img_code(123)# 2、查看响应状态码self.assertEqual(200, r.status_code)except Exception as e:# 日志print(e)# 抛出异常raise# 获取短信验证码接口 测试def test02_phone_code(self, phone=13600001111, imgVerifyCode=8888, expect_text="发送成功"):try:# 1、调用获取图片验证码接口----目的:让session记住cookieself.reg.api_img_code(123)# 2、调用短信验证码接口r = self.reg.api_phone_code(phone=phone, imgVerifyCode=imgVerifyCode)# 3、查看响应结果self.assertIn(expect_text, r.text)except Exception as e:# 日志print(e)# 抛出异常raise# 注册接口测试def test03_register(self, phone=13600001111, imgVerifyCode=8888, password="test123", phone_code=666666, expect_text="注册成功"):try:# 1、图片验证码接口self.reg.api_img_code(123)# 2、短信验证码接口self.reg.api_phone_code(phone=phone, imgVerifyCode=imgVerifyCode)# 3、注册接口r = self.reg.api_register(phone=phone, password=password, verifycode=imgVerifyCode, phone_code=phone_code)# 4、查看结果self.assertIn(expect_text, r.text)except Exception as e:# 日志print(e)# 抛出异常raise# 登录接口 测试def test04_login(self, keywords=13600001111, password="test123", expect_text="登录成功"):try:# 1、登录接口r = self.reg.api_login(keywords=keywords, password=password)# 2、查询结果self.assertIn(expect_text, r.text)except Exception as e:# 日志print(e)# 抛异常raise# 查询登录状态 测试def test05_login_status(self, keywords=13600001111, password="test123", expect_text="OK"):try:# 1、调用登录接口self.reg.api_login(keywords=keywords, password=password)# 2、调用查询登录结果接口r = self.reg.api_login_status()self.assertIn(expect_text, r.text)except Exception as e:# 日志print(e)# 抛出异常raise
  • 参数化

  • 步骤

1.编写数据存储文件json
2.编写读取工具方法 read_json()
3.使用参数化组件进行引用 parametrize

  • 1 .编写参数化文件(register_login.json)

心得:
1、根据模块来新建json文件1个模块1个json文件
2、最外侧使用{}模块下几个接口,编写几个key值为列表
3、列表值中,有几组数据,就写几个{}
4、每组数据{}中,组成格式:说明+参数+预期结果

  • 几个接口几个key,这里有五个接口(图片验证码、短信验证码、注册、登录、登录状态接口)
  • 每组数据组成格式:说明+参数+预期结果
{"img_code": [{"desc": "获取图片验证码成功(随机小数)","random": "0.123","expect_code": 200},{"desc": "获取图片验证码成功(随机整数)","random": "123","expect_code": 200},{"desc": "获取图片验证码成功(随机数为空)","random": "","expect_code": 404},{"desc": "获取图片验证码成功(随机数为字符串)","random": "heloo123","expect_code": 400}],"phone_code": [{"desc": "获取短信验证码成功","phone": "13600001111","imgVerifyCode": "8888","expect_text": "发送成功"},{"desc": "获取短信验证码失败","phone": "13600001111","imgVerifyCode": "8889","expect_text": "验证码错误"}],"register": [{"desc": "注册成功(必填参数)","phone": "13600001111","password": "test123","verifycode": 8888,"phone_code": 666666,"dy_server": "on","expect_text": "注册成功"},{"desc": "注册失败(图片验证码错误)","phone": "13600001112","password": "test123","verifycode": 8889,"phone_code": 666666,"dy_server": "on","expect_text": "验证码错误"},{"desc": "注册失败(短信验证码错误)","phone": "13600001112","password": "test123","verifycode": 8888,"phone_code": 666667,"dy_server": "on","expect_text": "验证码错误"},{"desc": "注册失败(手机号已存在)","phone": "13600001111","password": "test123","verifycode": 8888,"phone_code": 666666,"dy_server": "on","expect_text": "已存在"}],"login": [{"desc": "登录成功","keywords": "13600001111","password": "test123","expect_text": "登录成功"}, {"desc": "登录失败(密码为空)","keywords": "13600001111","password": "","expect_text": "不能为空"}, {"desc": "登录失败(解锁)","keywords": "13600001111","password": "errror123","expect_text": "登录成功"}],"login_status": [{"desc": "查询登录状态(已登录)","status": "已登录","expect_text": "OK"}, {"desc": "查询登录状态(未登录)","status": "未登录","expect_text": "未登"}]
}
  • 2、编写读取数据工具(util.py)在这里插入图片描述
    在这里插入图片描述
from config import DIR_PATHdef read_json(filename, key):# 拼接读取文件的完整路径  os.sep动态获取/ 还是 \ ,根据电脑的操作系统file_path = DIR_PATH + os.sep + "data" + os.sep + filenamearr = []with open(file_path, 'r', encoding="utf-8") as f:# print(json.load(f))# print(json.load(f).get(key)) [{},{},{}]----->[(),(),()]for data in json.load(f).get(key):arr.append(tuple(data.values())[1:])print(arr)if __name__ == '__main__':read_json("register_login.json", "img_code")# [('0.123', 200), ('123', 200), ('', 404), ('heloo123', 400)]
  • 参数化引用
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 难点1:错误次数锁定
    在这里插入图片描述
    在这里插入图片描述
 # 登录接口 测试@parameterized.expand(read_json("register_login.json", "login"))def test04_login(self, keywords, password, expect_text):try:i = 1if "error" in password:while i <= 3:r = self.reg.api_login(keywords=keywords, password=password)i += 1# 断言锁定print("测试锁定:", r.text)self.assertIn("锁定", r.text)# 暂停60ssleep(60)# 测试登录成功r = self.reg.api_login(keywords="13600001111", password="test123")self.assertIn(expect_text, r.text)# 1、登录接口r = self.reg.api_login(keywords=keywords, password=password)# 2、查询结果self.assertIn(expect_text, r.text)except Exception as e:# 日志print(e)# 抛异常raise
  • 查询登录状态,不同结果。
    在这里插入图片描述
    在这里插入图片描述
# 查询登录状态 测试@parameterized.expand(read_json("register_login.json", "login_status"))def test05_login_status(self, status, expect_text):try:if status == "已登录":# 1、调用登录接口self.reg.api_login(keywords="13600001111", password="test123")# 2、调用查询登录结果接口r = self.reg.api_login_status()self.assertIn(expect_text, r.text)except Exception as e:# 日志print(e)# 抛出异常raise
  • 断言代码示例:(test01_register_login.py)
import unittestimport requestsfrom api.api_register_login import ApiRegisterLoginfrom parameterized import parameterizedfrom util import read_jsonfrom time import sleepclass TestRegisterLogin(unittest.TestCase):# 初始化def setUp(self):# 获取session对象self.session = requests.session()# 获取ApiRegisterLogin实例self.reg = ApiRegisterLogin(self.session)# 结束def tearDown(self):# 关闭session对象self.session.close()# 获取图片验证码接口 测试@parameterized.expand(read_json("register_login.json", "img_code"))def test01_img_code(self, random, expect_code):try:# 1、调用图片验证码接口r = self.reg.api_img_code(random)# 2、查看响应状态码self.assertEqual(expect_code, r.status_code)except Exception as e:# 日志print(e)# 抛出异常raise# 获取短信验证码接口 测试@parameterized.expand(read_json("register_login.json", "phone_code"))def test02_phone_code(self, phone, imgVerifyCode, expect_text):try:# 1、调用获取图片验证码接口----目的:让session记住cookieself.reg.api_img_code(123)# 2、调用短信验证码接口r = self.reg.api_phone_code(phone=phone, imgVerifyCode=imgVerifyCode)# 3、查看响应结果self.assertIn(expect_text, r.text)except Exception as e:# 日志print(e)# 抛出异常raise# 注册接口测试@parameterized.expand(read_json("register_login.json", "register"))def test03_register(self, phone, password, imgVerifyCode, phone_code, expect_text):try:# 1、图片验证码接口self.reg.api_img_code(123)# 2、短信验证码接口self.reg.api_phone_code(phone=phone, imgVerifyCode=imgVerifyCode)# 3、注册接口r = self.reg.api_register(phone=phone, password=password, verifycode=imgVerifyCode, phone_code=phone_code)# 4、查看结果self.assertIn(expect_text, r.text)except Exception as e:# 日志print(e)# 抛出异常raise# 登录接口 测试@parameterized.expand(read_json("register_login.json", "login"))def test04_login(self, keywords, password, expect_text):try:i = 1if "error" in password:while i <= 3:r = self.reg.api_login(keywords=keywords, password=password)i += 1# 断言锁定print("测试锁定:", r.text)self.assertIn("锁定", r.text)# 暂停60ssleep(60)# 测试登录成功r = self.reg.api_login(keywords="13600001111", password="test123")self.assertIn(expect_text, r.text)# 1、登录接口r = self.reg.api_login(keywords=keywords, password=password)# 2、查询结果self.assertIn(expect_text, r.text)except Exception as e:# 日志print(e)# 抛异常raise# 查询登录状态 测试@parameterized.expand(read_json("register_login.json", "login_status"))def test05_login_status(self, status, expect_text):try:if status == "已登录":# 1、调用登录接口self.reg.api_login(keywords="13600001111", password="test123")# 2、调用查询登录结果接口r = self.reg.api_login_status()self.assertIn(expect_text, r.text)except Exception as e:# 日志print(e)# 抛出异常raise
  • 日志

  • 日志的作用?

记录程序运行的步骤和错误。

  • 日志的场景?

1、调试bug
2、查看程序运行轨迹

  • 日志的基本应用?

#1、导包
import logging
#2、调用日志入口
logging.error(“出错啦,错误原因:{}”.format(e))

import logging# 设置级别,level=logging.DEBUG制定日志级别,filename存储日志文件,不会打印在控制台
logging.basicConfig(level=logging.DEBUG, filename="../log/p2p.log")# 调用日志
logging.debug("调试信息 ")
logging.info("信息级别")
logging.warning("警告级别")
logging.error("错误级别")
logging.critical("严重级别")
  • 测试人员使用的日志的入口

info:记录运行步骤
error:记录运行错误

  • 日志底层组成介绍

说明:logging库底层有4大组件(日志器、处理器、格式器、过滤器
1、日志器:接受日志信息,设置日志显示级别
2、处理器:控制日志显示位置或文件(显示在控制台还是文件位置)
3、格式器:控制日志输出的显示样式
关系:

  • 格式器必须关联处理器
  • 处理器必须关联日志器
  • 日志封装应用

重组封装的目的:解决日志显示的样式、存储方式

import logging
import logging.handlers
import osclass GetLog:__logger = None  # 类变量,确保日志器单例@classmethoddef get_log(cls):if cls.__logger is None:  # 只初始化一次cls.__logger = logging.getLogger("MyLogger")  # 指定日志器名称cls.__logger.setLevel(logging.INFO)  # 设置日志级别# 确保日志目录存在log_dir = os.path.join(os.getcwd(), "log")if not os.path.exists(log_dir):os.makedirs(log_dir)file_path = os.path.join(log_dir, "p2p.log")# 创建处理器(定时滚动日志)tf = logging.handlers.TimedRotatingFileHandler(filename=file_path,when="midnight",interval=1,backupCount=3,encoding="utf-8")# 设置日志格式fmt = "%(asctime)s %(levelname)s [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s"fm = logging.Formatter(fmt)tf.setFormatter(fm)# 只添加一次处理器cls.__logger.addHandler(tf)return cls.__logger  # 返回日志器if __name__ == '__main__':logger = GetLog.get_log()logger.info("信息级别测试")
class GetLog:@classmethoddef get_log(cls):cls.log = Noneif cls.log is None:# 1、获取日志器cls.log = logging.getLogger()# 设置日志级别 INFO 这里要用大写,全局变量cls.log.setLevel(logging.INFO)# 2、获取处理器 TimedRotatingFileHandler:日志保存到文件且根据时间分隔  midnight:一天一夜,interval:2 ,间隔2天一夜,backupCount:3代表第四个文件替换第一个,filepath = DIR_PATH + os.sep + "log" + os.sep + "p2p.log"tf = logging.handlers.TimedRotatingFileHandler(filename=filepath,when="midnight",interval=1,backupCount=3,encoding="utf-8")# 3、获取格式器fmt ="%(asctime)s %(levelname)s [%(filename)s(%(funcName)s:%(lineno)d)]-%(message)s"fm = logging.Formatter(fmt)# 4、将格式器添加到处理器中tf.setFormatter(fm)# 5、将处理器添加到日志器中cls.log.addHandler(tf)# 返回日志器return cls.log
  • 应用(init.py)
    在这里插入图片描述

应用的级别:info、error
info:info记录程序运行的步骤
error:记录程序错误

  • api_register_login.py 使用log记录
    在这里插入图片描述
import requestsfrom api import log
from config import HOST
class ApiRegisterLogin:# 初始化def __init__(self, session):# 获取session对象self.session = session  # 实例化session,类下面的其他接口就能使用自己的session# 图片验证码urlself.__url_img_code = HOST + "/common/public/verifycode1/{}"   # {}是随机变量,用{}占用# 短信验证码urlself.__url_phone_code = HOST + "/member/public/sendSms"# 注册urlself.__url_register = HOST + "/member/public/reg"# 登录urlself.__url_login = HOST + "/member/public/login"# 登录状态urlself.__url_login_status = HOST + "/member/public/islogin"# 获取图片验证码接口 封装def api_img_code(self, random):log.info("正在调用获取图片验证码接口,请求方法:{},请求url:{}".format('get', self.__url_img_code.format(random)))# 调用get方法,返回响应对象res = self.session.get(url=self.__url_img_code.format(random))return res# 获取短信验证码接口 封装def api_phone_code(self, phone, imgVerifyCode):# 1、定义请求参数data = {"phone": phone,"imgVerifyCode": imgVerifyCode,"type": "reg"}log.info("正在调用获取短信验证码接口,请求方法:{},请求:url,请求参数:{}".format("post", self.__url_phone_code, data=data))# 2、调用请求方法res = self.session.post(url=self.__url_phone_code, data=data)return res# 注册接口 封装def api_register(self, phone, password, verifycode, phone_code):# 1、定义请求参数data = {"phone": phone,"password": password,"verifycode": verifycode,"phone_code": phone_code,"dy_server": "on","invite_phone": ""}log.info("正在调用注册接口,请求方法:{},请求url:{},请求参数:{}".format("post", self.__url_register, data=data))# 2、调用请求方法res = self.session.post(url=self.__url_register, data=data)return res# 登录接口 封装def api_login(self, keywords, password):# 1、定义请求参数data = {"keywords": keywords,"password": password}log.info("正在调用登录接口,请求方法:{},请求url:{},请求参数:{}".format("post", self.__url_login, data=data))# 2、调用请求方法res = self.session.post(url=self.__url_login, data=data)return res# 查询登录状态接口 封装def api_login_status(self):log.info("正在查询登录状态接口,请求方法:{},请求url:{}".format('post', self.__url_login_status))res = self.session.post(self.__url_login_status)
  • test01_register_login.py 使用log记录
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/37181.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++特性——RAII、智能指针

RAII 就像new一个需要delete&#xff0c;fopen之后需要fclose&#xff0c;但这样会有隐形问题&#xff08;忘记释放&#xff09;。RAII即用对象把这个过程给包起来&#xff0c;对象构造的时候&#xff0c;new或者fopen&#xff0c;析构的时候delete. 为什么需要智能指针 对于…

算法系列——有监督学习——4.支持向量机

一、概述 支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种应用范围非常广泛的算法&#xff0c;既可以用于分类&#xff0c;也可以用于回归。 本文将介绍如何将线性支持向量机应用于二元分类问题&#xff0c;以间隔&#xff08;margin&#x…

网络安全之前端学习(HTML篇)

前言&#xff1a;网络安全中有一个漏洞叫xss漏洞&#xff0c;就是利用网页引发弹窗&#xff0c;这就要求我们看得懂源码&#xff0c;所以我会持续更新前端学习&#xff0c;可以不精通&#xff0c;但是一定要会&#xff0c;主要掌握HTML&#xff0c;css&#xff0c;js这三项技术…

大华HTTP协议在智联视频超融合平台中的接入方法

一. 大华HTTP协议介绍 大华HTTP协议是大华股份&#xff08;Dahua Technology&#xff09;为其安防监控设备开发的一套基于HTTP/HTTPS的通信协议&#xff0c;主要用于设备与客户端&#xff08;如PC、手机、服务器&#xff09;之间的数据交互。该协议支持设备管理、视频流获取、…

介绍一下TiDB、RocksDb、levelDB、LSM 树、SSTable。

LSM 树&#xff08;Log-Structured Merge-Tree&#xff09; 核心原理&#xff1a;通过将随机写转换为顺序写优化写入性能&#xff0c;适用于写密集型场景。数据首先写入内存中的 MemTable&#xff08;有序结构&#xff0c;如跳表&#xff09;&#xff0c;当达到阈值后转为 Imm…

Powershell WSL导出导入ubuntu22.04.5子系统

导出Linux子系统 导出位置在C盘下,根据自己的实际情况更改即可Write-Host "export ubuntu22.04.5" -ForegroundColor Green wsl --export Ubuntu-22.04 c:\Ubuntu-22.04.tar 导入Linux子系统 好处是目录可用在任意磁盘路径,便于迁移不同的设备之间Write-Host &quo…

Jmeter

Jmeter 官网地址 https://jmeter.apache.org/ 下载安装包 系统环境变量 变量值JMETER_HOMEG:\Application\apache-jmeter-5.6.3 修改成自己的安装目录CLASSPATH;%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar; %JMETER_HOME%\lib\jorphan.jar;Path%JMETER_HOME%\bin 中文界…

碰一碰发视频saas系统技术源头一站式开发文档

碰一碰发视频系统技术源头一站式开发文档 一、引言 在数字化信息传播高速发展的当下&#xff0c;如何让视频分享更便捷、高效&#xff0c;成为商家和开发者们关注的焦点。“碰一碰发视频”系统以其独特的交互方式和强大的功能优势&#xff0c;为视频分享领域带来了革命性变革。…

Execution failed for task ‘:path_provider_android:compileDebugJavaWithJavac‘.

What went wrong: Execution failed for task ‘:path_provider_android:compileDebugJavaWithJavac’. Could not resolve all files for configuration ‘:path_provider_android:androidJdkImage’. Failed to transform core-for-system-modules.jar to match attributes {…

学习笔记 ASP.NET Core Web API 8.0部署到iis

一.修改配置文件 修改Program.cs配置文件将 if (app.Environment.IsDevelopment()) {app.UseSwagger();app.UseSwaggerUI(); }修改为 app.UseSwagger(); app.UseSwaggerUI(); 二.安装ASP.NET Core Runtime 8.0.14 文件位置https://dotnet.microsoft.com/en-us/download/do…

一、小雅自带tutorial文件教程

下载压缩包 这是elegantrl的开源地址: ElegantRL 我使用的是云服务器平台&#xff0c;上传压缩包之后&#xff0c;使用Linux解压缩命令&#xff0c;将压缩包解压。 使用conda新建一个虚拟环境 conda create -n ElegantRL conda activate ElegantRL安装elegantrl包 pip ins…

海康ISAPI协议在智联视频超融合平台中的接入方法

一. 海康ISAPI协议详解 海康ISAPI协议原理 海康ISAPI&#xff08;Internet Server Application Programming Interface&#xff09;协议是海康威视设备提供的一种基于HTTP/HTTPS的高级通信协议&#xff0c;用于实现客户端与设备之间的数据交互。其核心原理包括&#xff1a; 基…

【Azure 架构师学习笔记】- Azure Databricks (22) --Autoloader

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (21) --费用相关 前言 Databricks家里在Apache Spark之上&#xff0c;是企业级的应对大规模数据处理的通用平台&#xff0c; 可以运行在AWS&a…

论文略读(2025.3.18-更新中)

关于可控视频生成 I2V3D: Controllable image-to-video generation with 3D guidance Image to Video工作&#xff0c;能够实现给一张图&#xff0c;输出一个视频&#xff0c;且可以控制相机。动态信息来自于用户手工设计&#xff08;相机移动&#xff0c;人体骨骼驱动&#x…

Excel导出工具类--复杂的excel功能导出(使用自定义注解导出)

Excel导出工具类 前言: 简单的excel导出,可以用easy-excel, fast-excel, auto-poi,在导出实体类上加上对应的注解,用封装好的工具类直接导出,但对于复杂的场景, 封装的工具类解决不了,要用原生的excel导出(easy-excel, fast-excel, auto-poi都支持原生的) 业务场景: 根据…

神策数据接入 DeepSeek,AI 赋能数据分析与智能运营

在 AI 技术迅猛发展的浪潮下&#xff0c;神策数据正在加速推进人工智能在数据分析和智能运营领域的深度应用。近日&#xff0c;神策数据宣布全面接入 DeepSeek&#xff0c;为企业客户带来更加智能化、高效的数据分析与智能运营服务。这一举措展现了神策数据在人工智能方向的探索…

头歌 JAVA 桥接模式实验

目录 任务描述 实现方式 编程要求 测试说明 代码实现 总结 1 任务描述 某软件公司欲开发一个数据转换工具&#xff0c;可以将数据库中的数据转换成多种文件格式&#xff0c;例如 TXT、XML、PDF 等格式&#xff0c;同时该工具需要支持多种不同的数据库。 本关任务&#…

安全无事故连续天数计算,python 时间工具的高效利用

安全天数计算&#xff0c;数据系统时间直取&#xff0c;安全标准高效便捷好用。 笔记模板由python脚本于2025-03-17 23:50:52创建&#xff0c;本篇笔记适合对python时间工具有研究欲的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值&#xff1a;在于输出思考与经验&am…

Docker Swarm集群搭建

Docker Swarm集群搭建 1.准备环境 搭建Docker Swarm集群最低需要准备三台设备&#xff0c;且均需要提前安装好Docker。我这里准备了四台机器用于搭建集群&#xff0c;分别是&#xff1a; DockerSwarm-Node1 lemonDockerSwarm-Node1:~$ docker --version Docker version 28.…

Unity教程(二十二)技能系统 分身技能

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程&#xff08;零&#xff09;Unity和VS的使用相关内容 Unity教程&#xff08;一&#xff09;开始学习状态机 Unity教程&#xff08;二&#xff09;角色移动的实现 Unity教程&#xff08;三&#xff09;角色跳跃的实现 Unity教程&…