接口测试和单元测试

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快   


接口测试的本质:就是通过数据驱动,测试类里面的函数。
单元测试的本质:通过代码级别,测试函数。
单元测试的框架:unitest+接口,pytest+WEB----->接口,pytest+jenkins+allure。

requests 模块讲解和应用

基础知识

url:请求的地址 http://xxx:port

param:传递的参数 非必填参数 字典的格式传递参数

method:请求方式 支持get 以及post 字符串形式的参数

cookie:请求的时候传递的cookie值

利用requests模块写代码做接口测试。

利用request封装get请求和post请求,做接口测试。

以下文件都在request文件夹下。

#文件http_request_get.py
import requests
url='http://120.78.128.25:8765/Index/login.html'
res=requests.get(url)
print(res)
print("响应头:",res.headers)
print("响应状态码:",res.status_code)
print("响应正文:",res.text)#html
#文件http_request_post.py
import requestsurl='http://httpbin.org/post'
data={"name":"qinghan","age":'18'}
res=requests.post(url,data)#消息实体
print("响应头:",res.headers)
print("响应状态码:",res.status_code)
print("响应正文:",res.text,type(res.text))#html
print("响应正文2:",res.json(),type(res.json()))

伪装请求头 User-Agent

#文件http_request_post_chongzhi.py
import requests
url='http://v.juhe.cn/laohuangli/d'
data={"key":"abf91475fc19f66c2f1fe567edd75257","date":'2014-09-09'}
res=requests.post(url,data)#响应结果的消息实体 http response包含响应头,响应状态码,响应正文,Cookie
print("响应头:",res.headers)
print("响应状态码:",res.status_code)
print("**cookies**:",res.cookies)#从消息实体中拿到cookies
print("**cookies value**:",res.cookies['aliyungf_tc'])#类字典形式 Key取值
print("响应正文:",res.text,type(res.text))#html
print("响应正文2:",res.json(),type(res.json()))recharge_url='http://v.juhe.cn/laohuangli/d'
recharge_data={"key":"abf91475fc19f66c2f1fe567edd75257","date":'2014-09-09'}
header={'User-Agent':'Mozilla/5.0 '}#伪装充值的请求头
recharge_res=requests.get(recharge_url,recharge_data,headers=header,cookies=res.cookies)
print("充值结果:",recharge_res.json())
print("状态码:",recharge_res.status_code)
print("代理userAgent",recharge_res.request.headers)#获取请求头 request
#伪装请求头骗服务器!可以用来爬虫,如果别人有更高级的反爬虫那就不行了。哈哈

复制消息实体中拿到cookie

#文件http_request_post_cookies.py
import requests
url='http://v.juhe.cn/laohuangli/d'
data={"key":"abf91475fc19f66c2f1fe567edd75257","date":'2014-09-09'}
res=requests.post(url,data)#消息实体
print("响应头:",res.headers)
print("响应状态码:",res.status_code)
print("**cookies**:",res.cookies)#从消息实体中拿到cookies
print("**cookies value**:",res.cookies['aliyungf_tc'])#类字典形式 Key取值
print("响应正文:",res.text,type(res.text))#html
print("响应正文2:",res.json(),type(res.json()))
'''
响应头: {'Date': 'Sun, 02 Feb 2020 13:39:07 GMT', 'Content-Type': 'application/json;charset=utf-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Set-Cookie': 'aliyungf_tc=AQAAAC3SDE8KIAYAonD0eNi5kz0Qf9BA; Path=/; HttpOnly', 'Etag': '063d270dc44003f39cf480b7ec6ff843'}
响应状态码: 200
**cookies**: <RequestsCookieJar[<Cookie aliyungf_tc=AQAAAC3SDE8KIAYAonD0eNi5kz0Qf9BA for v.juhe.cn/>]>
**cookies value**: AQAAAC3SDE8KIAYAonD0eNi5kz0Qf9BA
响应正文: {"reason":"successed","result":{"id":"1666","yangli":"2014-09-09","yinli":"甲午(马)年八月十六","wuxing":"杨柳木 开执位","chongsha":"冲牛(丁丑)煞西","baiji":"癸不词讼理弱敌强 未不服药毒气入肠","jishen":"天恩 母仓 月德 不将 四相 阴德 金堂 时阳 生气 天仓","yi":"祭祀 立碑 修坟 启钻 除服 成服 馀事勿取","xiongshen":"五虚 土符 触水龙","ji":"馀事勿取"},"error_code":0} <class 'str'>
响应正文2: {'reason': 'successed', 'result': {'id': '1666', 'yangli': '2014-09-09', 'yinli': '甲午(马)年八月十六', 'wuxing': '杨柳
'''

登录-充值

了解cookie是先登录的时候会产生,然后在这个网站充值的时候直接就有cookie了。

以下代码来自文件夹Tools。

#清菡没有找到登录和充值的接口,所以用的老黄历的接口模拟测试的。以下代码除了接口地址不对,代码可以用。
#来自文件http_request_1.py。import requests
class Httprequest:'''利用requests封装get请求和post请求'''def http_request(self,url,data,method,cookie=None):'''url:请求的地址 http://xxx:portparam:传递的参数  非必填参数  字典的格式传递参数method:请求方式支持get以及post  字符串形式的参数cookie:请求的时候传递的cookie值'''if method.lower()=='get':res = requests.get(url, data, cookies=cookie)else:res=requests.post(url,data,cookies=cookie)#响应结果的消息实体 http response包含响应头,响应状态码,响应正文,Cookiereturn res#返回一个消息实体if  __name__ =='__main__':url = 'http://v.juhe.cn/laohuangli/d'data = {"key": "abf91475fc19f66c2f1fe567edd75257", "date": '2014-09-09'}res=Httprequest().http_request(url,data,'post')print("登录结果是:", res.json())#充值recharge_url='http://v.juhe.cn/laohuangli/d'recharge_data={"key":"abf91475fc19f66c2f1fe567edd75257","date":'2014-09-09'}recharges_res=Httprequest().http_request(recharge_url,recharge_data,'get',res.cookies)print("充值结果是:",recharges_res.json())
#来自request_danyuanceshi.py文件
#这个项目是没有cookies的啊,你们测试找个有cookie的接口来测试,user_password我没写,可以自己找个接口来测。import requests
class HttpRequest:'''利用request封装get请求和post请求'''def http_request(self,url,data,method,cookie=None):'''url:请求的地址 http://xxx:portparam:传递的参数  非必填参数  字典的格式传递参数method:请求方式支持get以及post  字符串形式的参数cookie:请求的时候传递的cookie值'''if method.lower()=='get':res = requests.get(url, data, cookies=cookie)else:res=requests.post(url,data,cookies=cookie,verify=False)#响应结果的消息实体 http response包含响应头,响应状态码,响应正文,Cookiereturn res#返回一个消息实体if  __name__ =='__main__':url = 'http://a.buka.tv/buka/api/user/login.do'data={"user_phone_num":"18210033224","user_password":"保密","user_device":"b9a0c082-e133-f0d5-e7d1-aff61f8e2cf8"}res=HttpRequest().http_request(url,data,'post')print("布卡项目登录接口查询结果是:{0}".format(res.text))print("布卡项目登录接口cookies是:{0}".format(res.cookies))url_1 = 'http://a.buka.tv/buka/api/usercenterauth/userstate.do'data =  {"user_token":"1234","user_device":"b9a0c082-e133-f0d5-e7d1-aff61f8e2cf8"}res_2 =HttpRequest().http_request((url_1),data,'post',res.cookies)print("布卡项目搜索接口查询结果是:{0}".format(res_2.text))print("布卡项目搜索接口接口cookies是:{0}".format(res.cookies))

python 单元测试-unittest

功能测试

1.写用例: TestCase

2.执行用例:

TestSuite 存储用例。

TestLoader 找用例,找到TestSuite的用例,加载出来。

3.对比实际结果、期望结果,判断用例是否通过,对比结果是否通过叫做断言。

断言:Assert

4.出具测试报告:TextTestRunner

unittest里面的TestCase专门来写用例

写一个测试类,对我们自己写的math method模块里面的类进行单元测试。以下文件都在unittest36文件夹下。首先,创建一个文件math_method.py。

class MathMethod:def __init__(self,a,b):self.a=aself.b=bdef add(self):return self.a+self.bdef multi(self):return self.a*self.b
#来自文件case1.pyimport unittestfrom math_method import MathMethodclass TestMathMethod(unittest.TestCase):#继承了unittest里面的TestCase专门来写用例
#编写测试用例
#一个用例就是一个函数,不能传参。只有self关键字
#所有的用例(所有的函数,都是test开头,test_)def test_add_two_positive(self):#两个正数相加 1+1res=MathMethod(1,1).add()#实际发起请求的结果值print("1+1的结果值是:",res)def test_add_two_zero(self):#两个0相加 0+0res=MathMethod(0,0).add()print("0+0的结果值是:",res)def test_add_two_negative(self):#两个负数相加 -1+-2res=MathMethod(-1,-2).add()print("0+0的结果是:",res)if __name__ =='__main__':unittest.main()

方法1:创建实例。可以只执行1条,也可以执行多条。

#来自文件TestSuite_fanfa1.py
import unittest
from unittest36.case1 import TestMathMethod
suite=unittest.TestSuite()#存储用例的容器
#方法一:
#只执行一条  两个正数相加
#创建实例
suite.addTest(TestMathMethod('test_add_two_zero'))
#再创建一条实例
suite.addTest(TestMathMethod('test_add_two_positive'))
#执行
runner=unittest.TextTestRunner()
runner.run(suite)

文件case1.py和TestSuite_fanfa1.py为1组,run文件TestSuite_fanfa1.py。

方法2:到测试类里面去找用例,根据这个测试类去加载到所有的用例。

loader是一个加载器, 它去帮你寻找用例,寻找完直接用addTest这个方法加到容器TestSuite里面去执行。

#来自文件TestSuite_fanfa2_1.pyimport unittest
from unittest36.case1 import TestMathMethod
suite=unittest.TestSuite()#存储用例的容器#TestLoader 找用例,加载用例
loader=unittest.TestLoader()#创建一个加载器
#是到测试类里去找
suite.addTest(loader.loadTestsFromTestCase(TestMathMethod))#执行
runner=unittest.TextTestRunner()
runner.run(suite)

文件case1.py和TestSuite_fanfa2_1.py为1组,run文件TTestSuite_fanfa2_1.py。

#来自文件case2
import unittestfrom math_method import MathMethodclass TestMathMethod(unittest.TestCase):#继承了unittest里面的TestCase专门来写用例#编写测试用例
#一个用例就是一个函数,不能传参。只有self关键字
#所有的用例(所有的函数,都是test开头,test_)def test_add_two_positive(self):#两个正数相加 1+1res=MathMethod(1,1).add()#实际发起请求的结果值print("1+1的结果值是:",res)def test_add_two_zero(self):#两个0相加 0+0res=MathMethod(0,0).add()#print("0+0的结果值是:",res)def test_add_two_negative(self):#两个负数相加 -1+-2res=MathMethod(-1,-2).add()#print("0+0的结果是:",res)class TestMulti(unittest.TestCase):#继承了unittest里面的TestCase专门来写用例
#    #编写测试用例
# 一个用例就是一个函数,不能传参。只有self关键字
# 所有的用例(所有的函数,都是test开头,test_)def test_multi_two_positive(self):#两个正数相乘 1*1res=MathMethod(1,1).multi()#print("unittest36*1的结果值是:",res)def test_multi_two_zero(self):#两个0相乘 0*0res=MathMethod(0,0).multi()#print("0*0的结果值是:",res)def test_multi_two_negative(self):#两个负数相乘 -1*-2res=MathMethod(-1,-2).multi()#print("-unittest36*-2的结果值是:",res)if __name__ =='__main__':unittest.main()

方法3:从模块里去加载用例,加载该模块所有的用例。

#来自文件TestSuite_fanfa2_2.pyimport unittest
from unittest36.case2 import TestMathMethod
suite=unittest.TestSuite()#存储用例的容器#TestLoader 找用例,加载用例
loader=unittest.TestLoader()#创建一个加载器
from unittest36 import case1#具体到模块
#会到case2里面去找所有的用例,从模块里加载测试用例
suite.addTest(loader.loadTestsFromModule(case2))#执行
runner=unittest.TextTestRunner()
runner.run(suite)

文件case2.py和TestSuite_fanfa2_2.py为1组,run文件TestSuite_fanfa2_2.py。

常见的断言


需要掌握的断言

断言 assertEqual

#来自文件Assert.py# 断言   assertEqual
import unittest
from unittest36.math_method import MathMethod#测试的目标类
class TestMathMethod(unittest.TestCase):#继承了unittest里面的TestCase专门来写用例def test_add_two_positive(self):#两个正数相加res=MathMethod(1,1).add()#实际发起请求的结果值print("1+1的结果值是:",res)
#加个断言:判断期望值与实际值的对比结果一致计算通过。不一致就算失败。self.assertEqual(2,res)#assertEqual()来自父类TestCasedef test_add_two_zero(self):#两个0相加 0+0res=MathMethod(0,0).add()#print("0+0的结果值是:",res)self.assertEqual(1, res,"两个0相加出错了!")#断言里面msg是用例执行失败的时候才会显示def test_add_two_negative(self):#两个负数相加 -1+-2res=MathMethod(-1,-2).add()#print("-1+-2的结果值是:",res)self.assertEqual(-3,res)class TestMulti(unittest.TestCase):  # 继承了unittest里面的TestCase专门来写用例def test_multi_two_positive(self):  # 两个正数相乘 1*1res = MathMethod(1, 1).multi()  #print("1*1的结果值是:", res)def test_multi_two_zero(self):  # 两个0相乘 0*0res = MathMethod(0, 0).multi()  #print("0*0的结果值是:", res)def test_multi_two_negative(self):  # 两个负数相乘 -1*-2res = MathMethod(-1, -2).multi()  #print("-1*-2的结果值是:", res)if __name__ == '__main__':unittest.main()# Assert.py    TestSuite_fanfa2_2.py执行
#来自文件TestSuite_fanfa2_2.pyimport unittest
from unittest36.Assert import TestMathMethod
suite=unittest.TestSuite()#存储用例的容器#TestLoader 找用例,加载用例
loader=unittest.TestLoader()#创建一个加载器
from unittest36 import Assert#具体到模块
#会到Assert里面去找所有的用例,从模块里加载测试用例
suite.addTest(loader.loadTestsFromModule(Assert))#执行
runner=unittest.TextTestRunner()
runner.run(suite)

文件Assert.py和TestSuite_fanfa2_2.py为1组,run文件TestSuite_fanfa2_2.py。

测试报告

#来自文件ceshibaogao_txt.pyimport unittest
from unittest36.Assert  import TestMathMethod
suite=unittest.TestSuite()#存储用例的容器#TestLoader 找用例,加载用例
loader=unittest.TestLoader()#创建一个加载器
#是到测试类里去找
suite.addTest(loader.loadTestsFromTestCase(TestMathMethod))#执行
file=open("test.txt",'w+',encoding='UTF-8')
runner=unittest.TextTestRunner(stream=file,verbosity=0)#verbosity=0,verbosity=1,verbosity=2 显示不一样,2最详细
runner.run(suite)'''
根据ASCII编码按照字母排序的。
posive#2
zero#3
negative#1
执行结果:
-1+-2的结果值是: -3
1+1的结果值是: 2
0+0的结果值是: 0
'''

文件Assert.py和文件ceshibaogao_txt.py为1组,run文件Tceshibaogao_txt.py。

必须加encoding='UTF-8',否则输出的txt显示乱码。

加了之后,正确显示。

上下文管理器

如果不关闭文件,会占用资源,影响性能。

#shangxiawenguanliqi.pyimport unittest
from unittest36.Assert  import TestMathMethod
suite=unittest.TestSuite()#存储用例的容器#TestLoader 找用例,加载用例
loader=unittest.TestLoader()#创建一个加载器
#是到测试类里去找
suite.addTest(loader.loadTestsFromTestCase(TestMathMethod))#执行  上下文管理器
with open("test.txt","w+",encoding="UTF-8")as file:#执行完代码,file会自动关闭掉。runner=unittest.TextTestRunner(stream=file, verbosity=2)#0 1 2   2是最详细的runner.run(suite)
print(file.closed)

文件Assert.py和文件shangxiawenguanliqi.py为1组,run文件shangxiawenguanliqi.py。

异常处理

异常处理就是加raise e

#来自文件yichangchuli.py
#异常处理就是加raise e  # 异常处理完了之后,记得要抛出去
#如果不加raise e,用例就会全部通过
import unittest
from unittest36.math_method import MathMethod#测试的目标类
class TestMathMethod(unittest.TestCase):#继承了unittest里面的TestCase专门来写用例def test_add_two_positive(self):#两个正数相加 unittest36+unittest36res=MathMethod(1,1).add()#实际发起请求的结果值print("1+1的结果值是:",res)try:self.assertEqual(2,res)#assertEqual()来自父类except AssertionError as e:print("出错了,断言错误是{0}".format(e))raise e  # 异常处理完了之后,记得要抛出去def test_add_two_zero(self):#两个0相加 0+0res=MathMethod(0,0).add()#print("0+0的结果值是:",res)try:self.assertEqual(1, res,"两个0相加出错了!")#断言里面msg是用例执行失败的时候才会显示except AssertionError as e:print("出错了,断言错误是{0}".format(e))raise e  # 异常处理完了之后,记得要抛出去def test_add_two_negative(self):#两个负数相加 -1+-2res=MathMethod(-1,-2).add()#print("-1+-2的结果值是:", res)try:self.assertEqual(-3, res)except AssertionError as e:print("出错了,断言错误是{0}".format(e))raise e  # 异常处理完了之后,记得要抛出去class TestMulti(unittest.TestCase):#继承了unittest里面的TestCase专门来写用例
#    #编写测试用例
# #一个用例就是一个函数,不能传参。只有self关键字
# #所有的用例(所有的函数,都是test开头,test_)def test_multi_two_positive(self):#两个正数相乘 1*1res=MathMethod(1,1).multi()#print("unittest36*1的结果值是:",res)def test_multi_two_zero(self):#两个0相乘 0*0res=MathMethod(0,0).multi()#print("0*0的结果值是:",res)def test_multi_two_negative(self):#两个负数相乘 -1*-2res=MathMethod(-1,-2).multi()#print("-unittest36*-2的结果值是:",res)if __name__ =='__main__':unittest.main()
#来自文件test_report.pyimport unittest
import HTMLTestRunner#别人写好的一个模块,你可以直接调用
from unittest36.set_upandtear_down  import TestMathMethod
suite=unittest.TestSuite()#存储用例的容器#TestLoader 找用例,加载用例
loader=unittest.TestLoader()#创建一个加载器
#是到测试类里去找
suite.addTest(loader.loadTestsFromTestCase(TestMathMethod))#新鲜 html
with open("test_report.html",'wb') as file:runner=HTMLTestRunner.HTMLTestRunner(stream=file,verbosity=2,title="学python自动化 单元测试报告",description="第一次报告",tester='清菡')runner.run(suite)

文件yichangchuli.py和文件test_report.py为1组,run文件test_report.py。

setUp和tearDown

根据用例名进行识别,每条用例执行前都会执行setUp,每条用例执行完毕后都会执行tearDown,这就是夹心饼干。如果有操作必须在执行用例之前准备好,那就放在setUp里面(例如连接数据库,放在setUp里面),有操作必须在执行用例后要清除掉,那就放在tearDown里面(例如操作完毕,关闭操作数据库,放在tearDown里面)。

#来自文件set_upandtear_down.py
import unittest
from unittest36.math_method import MathMethod#测试的目标类
class TestMathMethod(unittest.TestCase):#继承了unittest里面的TestCase专门来写用例def setUp(self):print("我要开始执行用例了")def tearDown(self):print("我已经执行完用例了")def test_add_two_positive(self):#两个正数相加 unittest36+unittest36res=MathMethod(1,1).add()#实际发起请求的结果值print("1+1的结果值是:",res)try:self.assertEqual(2,res)#assertEqual()来自父类except AssertionError as e:print("出错了,断言错误是{0}".format(e))raise e  # 异常处理完了之后,记得要抛出去def test_add_two_zero(self):#两个0相加 0+0res=MathMethod(0,0).add()#print("0+0的结果值是:",res)try:self.assertEqual(1, res,"两个0相加出错了!")#断言里面msg是用例执行失败的时候才会显示except AssertionError as e:print("出错了,断言错误是{0}".format(e))raise edef test_add_two_negative(self):#两个负数相加 -1+-2res=MathMethod(-1,-2).add()#print("-1+-2的结果值是:", res)try:self.assertEqual(-3, res)except AssertionError as e:print("出错了,断言错误是{0}".format(e))raise e#异常处理完了之后,记得要抛出去class TestMulti(unittest.TestCase):#继承了unittest里面的TestCase专门来写用例
#    #编写测试用例
# #一个用例就是一个函数,不能传参。只有self关键字
# #所有的用例(所有的函数,都是test开头,test_)def test_multi_two_positive(self):#两个正数相乘 1*1res=MathMethod(1,1).multi()#print("1*1的结果值是:",res)def test_multi_two_zero(self):#两个0相乘 0*0res=MathMethod(0,0).multi()#print("0*0的结果值是:",res)def test_multi_two_negative(self):#两个负数相乘 -1*-2res=MathMethod(-1,-2).multi()#print("-1-2的结果值是:",res)if __name__ =='__main__':unittest.main()
#来自文件test_report.pyimport unittest
import HTMLTestRunner#别人写好的一个模块,你可以直接调用
from unittest36.set_upandtear_down  import TestMathMethod
suite=unittest.TestSuite()#存储用例的容器#TestLoader 找用例,加载用例
loader=unittest.TestLoader()#创建一个加载器
#是到测试类里去找
suite.addTest(loader.loadTestsFromTestCase(TestMathMethod))#新鲜 html
with open("test_report.html",'wb') as file:runner=HTMLTestRunner.HTMLTestRunner(stream=file,verbosity=2,title="学python自动化 单元测试报告",description="第一次报告",tester='清菡')runner.run(suite)

文件set_upandtear_down.py和test_report.py为1组,run文件test_report.py。

常识

1.开发写接口的时候定义好的get还是post请求,这些是写死的。

并不是所有的请求都支持get和post,有时候都支持,有时候只支持get,有时候只支持post,根据接口文档来看。

接口抓不到的原因:人家是get请求,你非要post去抓

2.为什么有些接口抓不到?

别的接口,包括接口地址,参数,未必都可以抓到,例如腾讯的,数据会加密或者是根本抓不到。

3.抓到接口了,哪个才是我想要的东西呢?

找关键字。 例如:/User/Api/login 这就是个登录的接口,有Api啊,Api就是关键字。

4.登录的时候有cookie是保存登录信息,例如账户用户名密码。

不是所有的东西都有cookie,这个是开发定义的,看软件的需求呢。第一次登录生成cookie,下次登录就会根据用户名,密码这些信息,对比校验是不是同一个人。这就是cookie。

例如考勤就没有cookie,因为考勤是每天都得打卡得,所以不需要cookie。

5.注意:鼠标放哪就执行哪条用例,如果鼠标放在全部用例的后面,点击run就会执行所有的用例。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

​这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。

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

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

相关文章

第5篇 寻找最大数___ARM汇编语言<一>

Q&#xff1a;如何设计一段ARM处理器汇编语言子程序并调用来寻找一组数中的最大数呢&#xff1f; A&#xff1a;基本原理与基于Nios II处理器的汇编语言子程序一样&#xff0c;使用子程序LARGE实现找到列表中最大数的功能。主程序通过寄存器将列表的条目数和起始地址作为参数传…

JavaWeb之综合案例

前言 这一节讲一个案例 1. 环境搭建 然后就是把这些数据全部用到sql语句中执行 2.查询所有-后台&前台 我们先写后台代码 2.1 后台 2.2 Dao BrandMapper&#xff1a; 注意因为数据库里面的名称是下划线分割的&#xff0c;我们类里面是驼峰的&#xff0c;所以要映射 …

【LeetCode每日一题】——746.使用最小花费爬楼梯

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时空频度】九【代码实现】十【提交结果】 一【题目类别】 数组 二【题目难度】 简单 三【题目编号】 746.使用最小花费爬楼梯 四【题目描述】 给你一…

记录下jekins新建个前端部署配置项

1 新建个item 2 输入项目名称&#xff0c;选择个新的工程或 或者搜个已存在的现有模板 3 添加一些描述 4 &#xff08;可选&#xff09;配置下构建历史保存情况 5 限制下构建节点和选择gitlab或者github 6 写下git仓库地址、账号密码以及分支 7 选择构建工具node以及版本 8 构建…

设计模式之 状态模式

状态模式&#xff08;State Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许一个对象在其内部状态改变时&#xff0c;改变其行为。这种模式将状态的转换和行为的变化解耦&#xff0c;将不同状态的行为封装到独立的状态类中&#xff0c;而通过上下文&#xff08;Con…

uni-app 界面TabBar中间大图标设置的两种方法

一、前言 最近写基于uni-app 写app项目的时候&#xff0c;底部导航栏 中间有一个固定的大图标&#xff0c;并且没有激活状态。这里记录下实现方案。效果如下&#xff08;党组织这个图标&#xff09;&#xff1a; 方法一&#xff1a;midButton的使用 官方文档&#xff1a;ta…

IText创建加盖公章的pdf文件并生成压缩文件

第一、前言 此前已在文章&#xff1a;Java使用IText根据pdf模板创建pdf文件介绍了Itex的基本使用技巧&#xff0c;本篇以一个案例为基础&#xff0c;主要介绍IText根据pdf模板填充生成pdf文件&#xff0c;并生成压缩文件。 第二、案例 以下面pdf模板为例&#xff0c;生成一个p…

合法三元数量计算

问题描述 小C、小U 和小R 三个好朋友喜欢做一些数字谜题。这次他们遇到一个问题&#xff0c;给定一个长度为n的数组a&#xff0c;他们想要找出符合特定条件的三元组 (i, j, k)。具体来说&#xff0c;三元组要满足 0 < i < j < k < n&#xff0c;并且 max(a[i], a[…

【AI系统】GPU 架构回顾(从2018年-2024年)

Turing 架构 2018 年 Turing 图灵架构发布&#xff0c;采用 TSMC 12 nm 工艺&#xff0c;总共 18.6 亿个晶体管。在 PC 游戏、专业图形应用程序和深度学习推理方面&#xff0c;效率和性能都取得了重大进步。相比上一代 Volta 架构主要更新了 Tensor Core&#xff08;专门为执行…

【高阶数据结构】图论

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是图&#xff0c;并能掌握深度优先遍历和广度优先遍历。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持…

日期(练习)

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title></title> </head> <body></body> <script>// 定义一个函数&#xff0c;实现格式化日期对象&#xff0c;返回yyyy-MM-dd…

【IDEA】解决总是自动导入全部类(.*)问题

文章目录 问题描述解决方法 我是一名立志把细节说清楚的博主&#xff0c;欢迎【关注】&#x1f389; ~ 原创不易&#xff0c; 如果有帮助 &#xff0c;记得【点赞】【收藏】 哦~ ❥(^_-)~ 如有错误、疑惑&#xff0c;欢迎【评论】指正探讨&#xff0c;我会尽可能第一时间回复…

企业使用知识管理工具与技术的好处(举例说明)

我们都知道“知识就是力量”这句老话&#xff0c;无论是在工作还是个人生活中&#xff0c;我们每一天都越来越认识到这句话的真谛。近年来&#xff0c;不可否认的是&#xff0c;全球范围内我们都在某种程度上缺乏对于许多企业和大型公司至关重要的高端技术技能。 当然&#xf…

机器学习系列-决策树

文章目录 1. 决策树原理决策树的构建流程 2. 案例步骤 1&#xff1a;计算当前节点的熵步骤 2&#xff1a;对每个特征计算分裂后的熵(1) 按“天气”分裂数据集(2) 计算分裂后的加权熵 步骤 3&#xff1a;计算分裂依据信息增益信息增益率GINI系数&#xff08;二叉树&#xff09; …

resnet50,clip,Faiss+Flask简易图文搜索服务

一、实现 文件夹目录结构&#xff1a; templates -----upload.html faiss_app.py 前端代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widt…

爬虫重定向问题解决

一&#xff0c;问题 做爬虫时会遇到强制重定向的链接&#xff0c;此时可以手动获取重定向后的链接 如下图情况 第二个链接是目标要抓取的&#xff0c;但它是第一个链接重定向过去的&#xff0c;第一个链接接口状态也是302 二&#xff0c;解决方法 请求第一个链接&#xff0c…

一个小的可编辑表格问题引起的思考

11.21工作中遇到的问题 预期&#xff1a;当每行获取红包金额的时候若出现错误&#xff0c;右侧当行会出现提示 结果&#xff1a;获取红包金额出现错误&#xff0c;右侧对应行并没有出现错误提示 我发现&#xff0c;当我们设置readonly的时候&#xff0c;其实render函数依旧是…

高效集成:金蝶盘亏单数据对接管易云

金蝶盘亏单数据集成到管易云的技术实现 在企业日常运营中&#xff0c;数据的高效流转和准确对接是确保业务顺利进行的关键。本文将聚焦于一个具体的系统对接集成案例&#xff1a;如何将金蝶云星空中的盘亏单数据无缝集成到管易云的其他出库模块。 为了实现这一目标&#xff0…

神经网络问题之一:梯度消失(Vanishing Gradient)

梯度消失&#xff08;Vanishing Gradient&#xff09;问题是深度神经网络训练中的一个关键问题&#xff0c;它主要发生在反向传播过程中&#xff0c;导致靠近输入层的权重更新变得非常缓慢甚至几乎停滞&#xff0c;严重影响网络的训练效果和性能。 图1 在深度神经网络中容易出现…

单神经元 PID 解耦控制

单神经元 PID 解耦控制是一种将单神经元自适应控制与解耦控制相结合的方法&#xff0c;适用于多输入多输出&#xff08;MIMO&#xff09;系统。其核心是利用单神经元的自适应能力实现 PID 参数在线调整&#xff0c;同时通过解耦策略减少变量之间的相互影响&#xff0c;提高控制…