接口测试和单元测试
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快
接口测试的本质:就是通过数据驱动,测试类里面的函数。
单元测试的本质:通过代码级别,测试函数。
单元测试的框架: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就会执行所有的用例。
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。
相关文章:
接口测试和单元测试
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 接口测试的本质:就是通过数据驱动,测试类里面的函数。 单元测试的本质:通过代码级别,测试函数。 单元测试的框架…...
redis工程实战介绍(含面试题)
文章目录 redis单线程VS多线程面试题**redis是多线程还是单线程,为什么是单线程****聊聊redis的多线程特性和IO多路复用****io多路复用模型****redis如此快的原因** BigKey大批量插入数据测试数据key面试题海量数据里查询某一固定前缀的key如果生产上限值keys * ,fl…...
深度学习:GPT-1的MindSpore实践
GPT-1简介 GPT-1(Generative Pre-trained Transformer)是2018年由Open AI提出的一个结合预训练和微调的用于解决文本理解和文本生成任务的模型。它的基础是Transformer架构,具有如下创新点: NLP领域的迁移学习:通过最…...
内嵌编辑器+AI助手,Wave Terminal打造终端新体验
作为新一代终端工具的佼佼者,Wave Terminal 突破性地将传统命令行与现代图形界面相结合,为开发者带来全新的操作体验。这款创新的开源终端工具跨越了操作系统的界限,完美支持 macOS、Windows 和 Linux 平台,特别适合需要频繁处理远…...
《Object类》
目录 一、Object类 1.1 定义与地位 1.2 toString()方法 1.3 equals()方法 1.4 hashcode()方法 一、Object类 1.1 定义与地位 Object类是Java语言中的根类,所有的类(除了Object类)都直接或间接继承自Object。这就意味着在Java中…...
GPTZero:高效识别AI生成文本,保障学术诚信与内容原创性
产品描述 GPTZero 是一款先进的AI文本检测工具,专为识别由大型语言模型(如ChatGPT、GPT-4、Bard等)生成的文本而设计。它通过分析文本的复杂性和一致性,判断文本是否可能由人类编写。GPTZero 已经得到了超过100家媒体机构的报道&…...
2024 APMCM亚太数学建模C题 - 宠物行业及相关产业的发展分析和策略 完整参考论文(1)
摘要 近年来,中国宠物食品行业迅速增长,但面临复杂的国际形势和多变的市场环境,因此科学地分析和预测该行业的发展趋势至关重要。本研究通过构建多个机器学习与统计回归模型,量化分析中国宠物食品行业的关键驱动因素,预测未来宠物食品总产值和出口值。 在数据处理部分,…...
深入实践 Shell 脚本编程:高效自动化操作指南
一、什么是 Shell 脚本? Shell 脚本是一种用 Shell 编写的脚本程序,用于执行一系列的命令。它是 Linux/Unix 系统中自动化管理任务的利器,能够显著提升工作效率,特别适合批量处理文件、监控系统状态、自动部署等任务。 二、Shell…...
用代码如何创建Python代理池
1. 导入所需库 这里使用requests库来发送HTTP请求获取网页内容和测试代理是否可用,BeautifulSoup用于解析网页(比如从提供代理列表的网页提取代理信息),random用于随机选择代理,time用于设置请求间隔等操作。 2. 获取…...
python蓝桥杯刷题2
1.最短路 题解:这个采用暴力枚举,自己数一下就好了 2.门牌制作 题解:门牌号从1到2020,使用for循环遍历一遍,因为range函数无法调用最后一个数字,所以设置成1到2021即可,然后每一次for循环&…...
跨境出海安全:如何防止PayPal账户被风控?
今天咱们聊聊那些让人头疼的事儿——PayPal账户被风控。不少跨境电商商家反馈,我们只是想要安安静静地在网上做个小生意,结果不知道为什么,莫名其妙账户就被冻结了。 但其实每个封禁都是有原因的,今天就来给大家分享分享可能的原…...
学习与理解LabVIEW中多列列表框项名和项首字符串属性
多列列表框控件在如下的位置: 可以对该控件右击,如下位置,即可设置该控件的显示项: 垂直线和水平线指的是上图中组成单元格的竖线和横线(不包括行首列首) 现在介绍该多列列表框的两个属性,分别…...
多摩川编码器协议及单片机使用
参考: https://blog.csdn.net/qq_28149763/article/details/132718177 https://mp.weixin.qq.com/s/H4XoR1LZSMH6AxsjZuOw6g 1、多摩川编码器协议 多摩川数据通讯是基于485 硬件接口标准NRZ 协议,通讯波特率为2.5Mbps 的串行通讯,采用差分两…...
小雪时节,阴盛阳衰,注意禁忌
宋张嵲《小雪作》 霜风一夜落寒林,莽苍云烟结岁阴。 把镜渐无勋业念,爱山唯驻隐沦心。 冰花散落衡门静,黄叶飘零一迳深。 世乱身穷无可奈,强将悲慨事微吟。 网络图片:小雪时节 笔者禁不住喟然而叹:“冰…...
shell脚本
一.要求 1.接收用户部署的服务名称 2.判断服务是否安装 已安装;自定义网站配置路径为/www;并创建共享目录和网页文件;重启服务 没有安装;安装对应的软件包 3.测试 判断服务是否成功运行; 已运行&#…...
[371]基于springboot的高校实习管理系统
摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统高校实习管理系统信息管理难度大,容错率低&am…...
NVR管理平台EasyNVR多个NVR同时管理:全方位安防监控视频融合云平台方案
EasyNVR是基于端-边-云一体化架构的安防监控视频融合云平台,具有简单轻量的部署方式与多样的功能,支持多种协议(如GB28181、RTSP、Onvif、RTMP)和设备类型(IPC、NVR等),提供视频直播、录像、回放…...
Trains-04练习-函数
#基础练习 练习目标 01.计算车费 题目描述 小红打车,起步价8元(3公里), 每公里收费 2 元,她打车行驶了 n 公里,通过函数封装并计算车费 输入描述 输入一个公里数 输出描述 输出应付车费 示例 输入: 5 输出: 1…...
常用docker应用部署,wordpress、mysql、tomcat、nginx、redis
案例一、 wordpress 创建网络 docker network create wordpress-network创建容器 docker volume create --name mariadb_data docker run -d --name mariadb --restartalways \-p 3306:3306 \--env MARIADB_ALLOW_EMPTY_ROOT_PASSWORDyes \--env ALLOW_EMPTY_PASSWORDyes \--…...
设计模式之 模板方法模式
模板方法模式是行为型设计模式的一种。它定义了一个算法的骨架,并将某些步骤的实现延迟到子类中。模板方法模式允许子类在不改变算法结构的情况下重新定义算法的某些特定步骤。 模板方法模式的核心在于: 封装算法的骨架:通过父类中的模板方…...
GitLab|数据迁移
注意:新服务器GitLab版本需和旧版本一致 在旧服务器执行命令进行数据备份 gitlab-rake gitlab:backup:create 备份数据存储在 /var/opt/gitlab/backups/ 将备份数据传输到新服务器的/var/opt/gitlab/backups/下,并修改文件权限(下载前和上传…...
[CISCN 2019初赛]Love Math 详细题解
知识点: 数学函数转换字符串 GET传参外部赋值 eval()函数解析执行命令 PHP动态调用函数名 源码: <?php error_reporting(0); //听说你很喜欢数学,不知道你是否爱它胜过爱flag if(!isset($_GET[c])){show_source(__FILE__); }else{//例子 c20-1$content $_GET[c];if (…...
第N8周:使用Word2vec实现文本分类
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 本周任务: 结合Word2Vec文本内容预测文本标签 加载数据 import torch import torch.nn as nn import torchvision from torchvision import tra…...
SQL,力扣题目1635,Hopper 公司查询 I
一、力扣链接 LeetCode_1635 二、题目描述 表: Drivers ---------------------- | Column Name | Type | ---------------------- | driver_id | int | | join_date | date | ---------------------- driver_id 是该表的主键(具有唯一值的列)。 该表的每一行…...
【Apache Paimon】-- 6 -- 清理过期数据
目录 1、简要介绍 2、操作方式和步骤 2.1、调整快照文件过期时间 2.2、设置分区过期时间 2.2.1、举例1 2.2.2、举例2 2.3、清理废弃文件 3、参考 1、简要介绍 清理 paimon (表)过期数据可以释放存储空间,优化资源利用并提升系统运行效率等。本文将介绍如何清理 Paim…...
nginx 配置lua执行shell脚本
1.需要nginx安装lua_nginx_module模块,这一步安装时,遇到一个坑,nginx执行configure时,一直提示./configure: error: unsupported LuaJIT version; ngx_http_lua_module requires LuaJIT 2.x。 网上一堆方法都试了,都…...
C++:设计模式-单例模式
单例模式(Singleton Pattern)是一种设计模式,确保一个类只有一个实例,并且提供全局访问点。实现单例模式的关键是防止类被多次实例化,且能够保证实例的唯一性。常见的实现手法包括懒汉式、饿汉式、线程安全的懒汉式等。…...
优先级队列
概述 优先级队列(Priority Queue)是一种抽象数据类型(ADT),类似于普通的队列,不同之处在于每个元素都有一个与之相关的优先级。在优先级队列中,元素的出队顺序不是按照它们被入队的顺序&#x…...
一、Docker 安装集
一、Docker CentOS https://docs.docker.com/engine/install/centos/ 在 CentOS 上安装 Docker Engine # Docker要求CentOS系统的内核版本高于3.10:# Docker从1.13版本之后,采用时间线的方式作为版本号: 1. 分为社区版CE和企业版EE。 2. 社…...
软件测试——自动化测试常见函数
在上一篇文章软件测试——自动化测试概念篇-CSDN博客中,给大家演示了一下自动化程序,而本篇文章会带大家详细学习selenium库。 selenium库是python官方的库,里面包含了很多操控浏览器的函数。 本节重点 元素定位操作测试对象窗口等待导航弹…...
SEO网站都用哪里的服务器
在当今这个信息爆炸的时代,网站的加载速度已经成为衡量其质量的重要指标之一。对于SEO网站来说,速度不仅关乎用户体验,更是影响搜索引擎排名的重要因素。在众多服务器提供商中,鼎峰新匯凭借其卓越的性能和优质的服务,成…...
【从零开始的LeetCode-算法】3233. 统计不是特殊数字的数字数量
给你两个 正整数 l 和 r。对于任何数字 x,x 的所有正因数(除了 x 本身)被称为 x 的 真因数。 如果一个数字恰好仅有两个 真因数,则称该数字为 特殊数字。例如: 数字 4 是 特殊数字,因为它的真因数为 1 和…...
shell脚本(五)
声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&#…...
Windows中指定路径安装DockerDesktop
Windows中指定路径安装DockerDesktop 文章目录 Windows中指定路径安装DockerDesktop1. 先卸载干净(如果已安装过的话)2. 指定路径安装1. 新建需要安装的文件目录2. 指定路径安装 3. WSL子系统下载1. GitHub下载地址2. 指定版本直接下载 Widnows中直接安装docker desktop&#x…...
阿里云私服地址
1.解压apache-maven-3.6.1-bin 2.配置本地仓库:修改conf/dettings.xml中的<localReoisitory>为一个指定目录。56行 <localRepository>D:\apache-maven-3.6.1-bin\apache-maven-3.6.1\mvn_repo</localRepository> 3.配置阿里云私服:…...
深入探究 Vue 实例挂载过程与场景 —— 代码实例详解
Vue 实例挂载过程及使用场景分析 Vue 实例的挂载过程是 Vue 应用启动的核心,它决定了 Vue 组件如何与 DOM 进行绑定。在理解 Vue 实例挂载的过程后,我们可以根据不同的使用场景来选择合适的挂载方式。下面详细讲解 Vue 实例的挂载过程、常见使用场景,并通过实际项目示例进行…...
特征交叉-MaskNet文章总结代码实现
MaskNet 这个模型是微博21年提出的,23年twitter(X)开源的推荐系统排序模块使用的backbone结构。 核心思想是认为DNN为主的特征交叉是addictive,交叉效率不高;所以设计了一种multiplicatvie的特征交叉 如何设计muliplicative特征交叉呢&#x…...
【第八课】Rust中的函数与方法
目录 前言 函数指针 函数当作另一个函数的参数 函数当作另一个函数的返回值 闭包 方法 关联函数 总结 前言 在前面几课中,我们都或多或少的接触到了rust中的函数,rust中的函数和其他语言的并没有什么不同,简单的语法不在这篇文章中赘…...
PyQt飞机大战游戏(附下载地址)
欢迎下载体验! 文件大小:22.9 M 下载地址:链接:https://wwrr.lanzoul.com/iybV22frvcng pyqt5-飞机大战 一.前言 up主最近高产,再给大家分享一个博主开发的小游戏-飞机大战,这是一款飞行射击游…...
代替Spinnaker 的 POINTGREY工业级相机 FLIR相机 Python编程案例
SpinnakerSDK_FULL_4.0.0.116_x64 是一个用于FLIR相机的SDK,主要用于图像采集和处理。Spinnaker SDK主要提供C接口,无法直接应用在python环境。本文则基于Pycharm2019python3.7的环境下,调用opencv,EasySpin,PySpin,的库实现POINTGREY工业级相…...
redis模糊匹配key内存分析的脚本
效果: 脚本 与 redis-cli 命令放在同一路径下执行脚本 注意: 1、SCAN 命令仅扫描当前节点的键,若要扫描整个集群中的所有节点,建议在各个从节点上分别执行; 2、为避免扫描对业务产生影响: 可以在从节点或…...
STM32设计学生宿舍监测控制系统-分享
目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 电路图采用Altium Designer进行设计: 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 本项目旨在利用STM32单片机为核心,结合传感器技术、无线通信技…...
Python爬虫案例八:抓取597招聘网信息并用xlutils进行excel数据的保存
excel保存数据的三种方式: 1、pandas保存excel数据,后缀名为xlsx; 举例: import pandas as pddic {姓名: [张三, 李四, 王五, 赵六],年龄: [18, 19, 20, 21],住址: [广州, 青岛, 南京, 重庆] } dic_file pd.DataFrame(dic) dic_file…...
Mybatis-Day3
规则: 定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下 设置SQL映射我呢见的namespace属性为Mapper接口的全限定名 在Mapper接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类…...
第六节-AppScan扫描报告
第六节-AppScan扫描报告 1.加载扫描结果 1.点击【打开】 2.选择之前保存过的扫描结果 3.等待加载完成 2.领导查看的报告 1.点击【报告】 2.模板选择为【缺省值】 3.最低严重性选择为【中】,测试类型选择为【应用程序】 4.点击【布局】 5.选择【其他徽标】&#x…...
多模MPO的测试套件
MultiFiber™Pro光功率计及光纤测试工具包 首款支持单模和多模MPO光纤认证的MPO光纤测试仪 利用“扫描全部”功能自动扫描和测试MPO连接器中的所有光纤 支持多模和单模MPO光纤干线 在测试光纤干线时无需使用扇形跳线 以最小的界面显示易懂的结果 用户界面上显示所有12光纤 自动…...
使用php和Xunsearch提升音乐网站的歌曲搜索效果
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
Idea忽略提交文件、Idea设置文件隐藏、Idea提交时隐藏部分文件、git提交时忽略文件
文章目录 一、在idea中commit文件时隐藏文件方式一:创建.gitignore文件(推荐)方式二:通过File Types设置隐藏文件方式三:通过Git配置忽略文件(不推荐)总结 二、可能遇到的问题2.1、.gitigno…...
菜鸟驿站二维码/一维码 取件识别功能
特别注意需要引入 库文 ZXing 可跳转: 记录【WinForm】C#学习使用ZXing.Net生成条码过程_c# zxing-CSDN博客 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static System.Net.…...
MQ核心作用、解耦、削峰使用场景详解
说在前面 在如今的高并发互联网应用中,如何确保系统在巨大的流量冲击下还能稳定运行,是每个技术团队都会遇到的挑战。说到这,消息队列(MQ)就是背后的“大功臣”了。无论是异步处理请求、平滑应对流量高峰,…...