超详细的Python+requests+unittest+excel接口自动化测试框架教程

news2024/10/5 19:11:46

一、框架结构

工程目录

在这我也准备了一份软件测试视频教程(含接口、自动化、性能等),需要的可以直接在下方观看,或者直接关注VX公众号:互联网杂货铺,免费领取

软件测试视频教程观看处:

软件测试工程师大忌!盲目自学软件测试真的会毁终生,能救一个是一个......

二、Case文件设计

三、基础包 base

3.1 封装get/post请求(runmethon.py)

 imp
 
 import json
 class RunMethod:
 def post_main(self,url,data,header=None):
 res = None
 if header !=None: 
 res = requests.post(url=url,data=data,headers=header)
 else:
 res = requests.post(url=url,data=data)
 return res.json()
 
 def get_main(self,url,data=None,header=None):
 res = None
 if header !=None: 
 res = requests.get(url=url,data=data,headers=header,verify=False)
 else:
 res = requests.get(url=url,data=data,verify=False)
 return res.json() 
 def run_main(self,method,url,data=None,header=None):
 res = None
 if method == 'Post':
 res = self.post_main(url,data,header)
 else:
 res = self.get_main(url,data,header)
 return json.dumps(res,ensure_ascii=False,sort_keys=True,indent=2)

3.2 封装mock(mock.py)

from mock import mock
 #模拟mock 封装
 def mock_test(mock_method,request_data,url,method,response_data):
 mock_method = mock.Mock(return_value=response_data)
 res = mock_method(url,method,request_data)
 return res

四、数据操作包 operation_data

4.1 获取excel单元格中的内容(get_data.py)  

 
#coding:utf-8
 from tool.operation_excel import OperationExcel
 import data_config
 from tool.operation_json import OperetionJson
 from tool.connect_db import OperationMysql
 class GetData:
 def __init__(self):
 self.opera_excel = OperationExcel()
 
 #去获取excel行数,就是case的个数 
 def get_case_lines(self):
 return self.opera_excel.get_lines()
 
 #获取是否执行
 def get_is_run(self,row):
 flag = None
 col = int(data_config.get_run())
 run_model = self.opera_excel.get_cell_value(row,col)
 if run_model == 'yes':
 flag = True
 else:
 flag = False
return flag
 
 #是否携带header
def is_header(self,row):
 col = int(data_config.get_header())
 header = self.opera_excel.get_cell_value(row,col)
 if header != '':
 return header
 else:
 return None
 
 #获取请求方式
 def get_request_method(self,row):
 col = int(data_config.get_run_way())
 request_method = self.opera_excel.get_cell_value(row,col)
 return request_method
 
 #获取url
 def get_request_url(self,row):
 col = int(data_config.get_url())
 url = self.opera_excel.get_cell_value(row,col)
 return url
 
 #获取请求数据
 def get_request_data(self,row):
 col = int(data_config.get_data())
 data = self.opera_excel.get_cell_value(row,col)
 if data == '':
 return None
 return data
 
 #通过获取关键字拿到data数据
 def get_data_for_json(self,row):
 opera_json = OperetionJson()
 request_data = opera_json.get_data(self.get_request_data(row))
 return request_data
 
 #获取预期结果
 def get_expcet_data(self,row):
 col = int(data_config.get_expect())
 expect = self.opera_excel.get_cell_value(row,col)
 if expect == '':
 return None
 return expect
 
 #通过sql获取预期结果
 def get_expcet_data_for_mysql(self,row):
 op_mysql = OperationMysql()
 sql = self.get_expcet_data(row)
 res = op_mysql.search_one(sql)
 return res.decode('unicode-escape')
 
 def write_result(self,row,value):
 col = int(data_config.get_result())
 self.opera_excel.write_value(row,col,value)
 
 #获取依赖数据的key
 def get_depend_key(self,row):
 col = int(data_config.get_data_depend())
 depent_key = self.opera_excel.get_cell_value(row,col)
 if depent_key == "":
 return None
 else:
 return depent_key
 
 #判断是否有case依赖
 def is_depend(self,row):
 col = int(data_config.get_case_depend())
 depend_case_id = self.opera_excel.get_cell_value(row,col)
 if depend_case_id == "":
 return None
 else:
 return depend_case_id
 
 #获取数据依赖字段
 def get_depend_field(self,row):
 col = int(data_config.get_field_depend())
 data = self.opera_excel.get_cell_value(row,col)
 if data == "":
 return None
 else:
 return data 

4.2 获取excel中每个列(data_config.py)

#coding:utf-8
 class global_var:
 #case_id
 Id = '0'
 request_name = '1'
 url = '2'
 run = '3'
 request_way = '4'
 header = '5'
 case_depend = '6'
 data_depend = '7'
 field_depend = '8'
 data = '9'
 expect = '10'
 result = '11'
 #获取caseid
 def get_id():
 return global_var.Id
 
 #获取url
 def get_url():
 return global_var.url
 
 def get_run():
 return global_var.run
 
 def get_run_way():
 return global_var.request_way
 
 def get_header():
 return global_var.header
 
 def get_case_depend():
 return global_var.case_depend
 
 def get_data_depend():
 return global_var.data_depend
 
 def get_field_depend():
 return global_var.field_depend
 
 def get_data():
 return global_var.data
 
 def get_expect():
 return global_var.expect
 
 def get_result():
 return global_var.result
 
 def get_header_value():
 return global_var.header

4.3 解决数据依赖(dependent.py )

#coding:utf-8

 import sys

 import json

 sys.path.append('C:/Users/lxz/Desktop/InterFace_JIA')

 from tool.operation_excel import OperationExcel

 from base.runmethod import RunMethod

 from operation_data.get_data import GetData

 from jsonpath_rw import jsonpath,parse

 class DependdentData:

 def __init__(self,case_id):

 self.case_id = case_id

 self.opera_excel = OperationExcel()

 self.data = GetData()

  

 #通过case_id去获取该case_id的整行数据

 def get_case_line_data(self):

 rows_data = self.opera_excel.get_rows_data(self.case_id)

 return rows_data

  

 #执行依赖测试,获取结果

 def run_dependent(self):

 run_method = RunMethod()

 row_num = self.opera_excel.get_row_num(self.case_id)

 request_data = self.data.get_data_for_json(row_num)

 #header = self.data.is_header(row_num)

 method = self.data.get_request_method(row_num)

 url = self.data.get_request_url(row_num)

 res = run_method.run_main(method,url,request_data)

 return json.loads(res)

  

 #根据依赖的key去获取执行依赖测试case的响应,然后返回

 def get_data_for_key(self,row):

 depend_data = self.data.get_depend_key(row)

 response_data = self.run_dependent()

 json_exe = parse(depend_data)

 madle = json_exe.find(response_data)

 return [math.value for math in madle][0]

  

 if __name__ == '__main__':

 order = {

 "data": {

 "_input_charset": "utf-8",

 "body": "京东订单-1710141907182334",

 "it_b_pay": "1d",

 "notify_url": "http://order.imooc.com/pay/notifyalipay",

 "out_trade_no": "1710141907182334",

 "partner": "2088002966755334",

 "payment_type": "1",

 "seller_id": "yangyan01@tcl.com",

"service": "mobile.securitypay.pay",

"sign": "kZBV53KuiUf5HIrVLBCcBpWDg%2FnzO%2BtyEnBqgVYwwBtDU66Xk8VQUTbVOqDjrNymCupkVhlI%2BkFZq1jOr8C554KsZ7Gk7orC9dDbQl

pr%2BaMmdjO30JBgjqjj4mmM%2Flphy9Xwr0Xrv46uSkDKdlQqLDdGAOP7YwOM2dSLyUQX%2Bo4%3D",

 "sign_type": "RSA",

 "string": "_input_charset=utf-8&body=京东订单-1710141907182334&it_b_pay=1d&notify_url=http://order.imooc.com/pay/

notifyalipay&out_trade_no=1710141907182334&partner=2088002966755334&payment_type=1&seller_id=yangyan01@

tcl.com&service=mobile.securitypay.pay&subject=京东订单-1710141907182334&total_fee=299&sign=kZBV53KuiUf5H

IrVLBCcBpWDg%2FnzO%2BtyEnBqgVYwwBtDU66Xk8VQUTbVOqDjrNymCupkVhlI%2BkFZq1jOr8C554KsZ7Gk7orC9dDbQlpr%2BaMmdjO30

JBgjqjj4mmM%2Flphy9Xwr0Xrv46uSkDKdlQqLDdGAOP7YwOM2dSLyUQX%2Bo4%3D&sign_type=RSA",

 "subject": "京东订单-1710141907182334",

 "total_fee": 299

 },

 "errorCode": 1000,

 "errorDesc": "成功",

 "status": 1,

 "timestamp": 1507979239100

 }

 res = "data.out_trade_no"

 json_exe = parse(res)

 madle = json_exe.find(order)

 print [math.value for math in madle][0]

五、工具类包 tool

5.1 操作excel (operation_excel.py)

 
#coding:utf-8
 import xlrd
 from xlutils.copy import copy
 class OperationExcel:
 def __init__(self,file_name=None,sheet_id=None):
 if file_name:
 self.file_name = file_name
 self.sheet_id = sheet_id 
 else:
 self.file_name = '../dataconfig/case1.xls'
 self.sheet_id = 0
 self.data = self.get_data()
 
 #获取sheets的内容
 def get_data(self):
 data = xlrd.open_workbook(self.file_name)
 tables = data.sheets()[self.sheet_id]
 return tables
 
 #获取单元格的行数
 def get_lines(self):
 tables = self.data
 return tables.nrows
 
 #获取某一个单元格的内容
 def get_cell_value(self,row,col):
 return self.data.cell_value(row,col)
 
 #写入数据
 def write_value(self,row,col,value):
 '''
 写入excel数据
 row,col,value
 '''
 read_data = xlrd.open_workbook(self.file_name)
 write_data = copy(read_data)
 sheet_data = write_data.get_sheet(0)
 sheet_data.write(row,col,value)
 write_data.save(self.file_name)
 
 #根据对应的caseid 找到对应行的内容
 def get_rows_data(self,case_id):
 row_num = self.get_row_num(case_id)
 rows_data = self.get_row_values(row_num)
 return rows_data
 
 #根据对应的caseid找到对应的行号
 def get_row_num(self,case_id):
 num = 0
 clols_data = self.get_cols_data()
 for col_data in clols_data:
 if case_id in col_data:
 return num
 num = num+1
 
 
 #根据行号,找到该行的内容
 def get_row_values(self,row):
 tables = self.data
 row_data = tables.row_values(row)
 return row_data
 
 #获取某一列的内容
 def get_cols_data(self,col_id=None):
 if col_id != None:
 cols = self.data.col_values(col_id)
 else:
 cols = self.data.col_values(0)
 return cols
 
 
 if __name__ == '__main__':
 opers = OperationExcel()
 print opers.get_cell_value(1,2)

5.2判断字符串包含,判断字典是否相等(common_util.py)

 
#coding:utf-8
 import json
 class CommonUtil:
 def is_contain(self,str_one,str_two):
 '''
 判断一个字符串是否再另外一个字符串中
 str_one:查找的字符串
str_two:被查找的字符串
 '''
 flag = None
 if isinstance(str_one,unicode):
 str_one = str_one.encode('unicode-escape').decode('string_escape')
 return cmp(str_one,str_two)
 if str_one in str_two:
 flag = True
 else:
 flag = False
 return flag
 
 
 def is_equal_dict(self,dict_one,dict_two):
 '''
 判断两个字典是否相等
 '''
 if isinstance(dict_one,str):
 dict_one = json.loads(dict_one)
 if isinstance(dict_two,str):
 dict_two = json.loads(dict_two)
 return cmp(dict_one,dict_two)

5.3 操作header(operation_herder.py)

 
#coding:utf-8
 import requests
 import json
 from operation_json import OperetionJson
  class OperationHeader: 
 def __init__(self,response):
 self.response = json.loads(response)
  def get_response_url(self):
 '''
 获取登录返回的token的url
 '''
 url = self.response['data']['url'][0]
 return url
 
 def get_cookie(self):
 '''
 获取cookie的jar文件
 '''
 url = self.get_response_url()+"&callback=jQuery21008240514814031887_1508666806688&_=1508666806689"
 cookie = requests.get(url).cookies
 return cookie
 
 def write_cookie(self):
 cookie = requests.utils.dict_from_cookiejar(self.get_cookie())
 op_json = OperetionJson()
 op_json.write_data(cookie)
 
 if __name__ == '__main__':
 
 url = "http://www.jd.com/passport/user/login"
 data = {
 "username":"18513199586",
 "password":"111111",
 "verify":"",
 "referer":"https://www.jd.com"
 }
 res = json.dumps(requests.post(url,data).json())
 op_header = OperationHeader(res)
 op_header.write_cookie()

5.4 操作json文件(operation_json.py)

 
 #coding:utf-8
 import json
 class OperetionJson:
 
  def __init__(self,file_path=None):
 if file_path == None:
 self.file_path = '../dataconfig/user.json'
 else:
 self.file_path = file_path
 self.data = self.read_data()
 
 #读取json文件
 def read_data(self):
 with open(self.file_path) as fp:
 data = json.load(fp)
 return data
 
 #根据关键字获取数据
 def get_data(self,id):
 print type(self.data)
 return self.data[id]
 
 #写json
 def write_data(self,data):
 with open('../dataconfig/cookie.json','w') as fp:
 fp.write(json.dumps(data))
  
 
 if __name__ == '__main__':
 opjson = OperetionJson()
 print opjson.get_data('shop')

5.5 操作数据库(connect_db.py)

#coding:utf-8
 import MySQLdb.cursors
 import json
 class OperationMysql:
 def __init__(self):
 self.conn = MySQLdb.connect(
 host='localhost',
 port=3306,
 user='root',
 passwd='123456',
 db='le_study',
 charset='utf8',
 cursorclass=MySQLdb.cursors.DictCursor
)
 self.cur = self.conn.cursor()
 
 #查询一条数据
 def search_one(self,sql):
 self.cur.execute(sql)
 result = self.cur.fetchone()
 result = json.dumps(result)
 return result
 
 if __name__ == '__main__':
 op_mysql = OperationMysql()
 res = op_mysql.search_one("select * from web_user where Name='ailiailan'")
 print res

5.6 发送报告邮件(send_email.py)

#coding:utf-8
import smtplib
 from email.mime.text import MIMEText
 class SendEmail:
 global send_user
 global email_host
 global password
 email_host = "smtp.163.com"
 send_user = "jiaxiaonan666@163.com"
 password = "jia_668"
 def send_mail(self,user_list,sub,content):
 user = "jiaxiaonan"+"<"+send_user+">"
 message = MIMEText(content,_subtype='plain',_charset='utf-8')
 message['Subject'] = sub
 message['From'] = user
 message['To'] = ";".join(user_list)
 server = smtplib.SMTP()
 server.connect(email_host)
 server.login(send_user,password)
 server.sendmail(user,user_list,message.as_string())
 server.close()
 
 def send_main(self,pass_list,fail_list):
 pass_num = float(len(pass_list))
 fail_num = float(len(fail_list))
 count_num = pass_num+fail_num
 #90%
 pass_result = "%.2f%%" %(pass_num/count_num*100)
 fail_result = "%.2f%%" %(fail_num/count_num*100)
 
 
 user_list = ['609037724@qq.com']
 sub = "接口自动化测试报告"
 content = "此次一共运行接口个数为%s个,通过个数为%s个,失败个数为%s,通过率为%s,失败率为%s" %(count_num,pass_num,fail_num,pass_result,fail_result )
 self.send_mail(user_list,sub,content)
 
 if __name__ == '__main__':
 sen = SendEmail()
 sen.send_main([1,2,3,4],[2,3,4,5,6,7]) 

六、主函数

run_test.py
 
 #coding:utf-8
 import sys
 sys.path.append("C:/Users/lxz/Desktop/InterFace_JIA")
 from base.runmethod import RunMethod
 from operation_data.get_data import GetData
 from tool.common_util import CommonUtil
 from operation_data.dependent_data import DependdentData
 from tool.send_email import SendEmail
 from tool.operation_header import OperationHeader
 from tool.operation_json import OperetionJson
 class RunTest:
 def __init__(self):
 self.run_method = RunMethod()
 self.data = GetData()
 self.com_util = CommonUtil()
 self.send_mai = SendEmail()
 
 #程序执行的
 def go_on_run(self):
 res = None
 pass_count = []
 fail_count = []
 #10 0,1,2,3
 rows_count = self.data.get_case_lines()
 for i in range(1,rows_count):
 is_run = self.data.get_is_run(i)
 if is_run:
 url = self.data.get_request_url(i)
 method = self.data.get_request_method(i)
 request_data = self.data.get_data_for_json(i)
 expect = self.data.get_expcet_data_for_mysql(i)
 header = self.data.is_header(i)
 depend_case = self.data.is_depend(i)
 if depend_case != None:
 self.depend_data = DependdentData(depend_case)
 #获取的依赖响应数据
 depend_response_data = self.depend_data.get_data_for_key(i)
 #获取依赖的key
 depend_key = self.data.get_depend_field(i)
 request_data[depend_key] = depend_response_data
 if header == 'write':
 res = self.run_method.run_main(method,url,request_data)
 op_header = OperationHeader(res)
 op_header.write_cookie()
 
 elif header == 'yes':
 op_json = OperetionJson('../dataconfig/cookie.json')
 cookie = op_json.get_data('apsid')
 cookies = {
 'apsid':cookie
 }
 res = self.run_method.run_main(method,url,request_data,cookies)
 else:
 res = self.run_method.run_main(method,url,request_data)
 
 if self.com_util.is_equal_dict(expect,res) == 0:
 self.data.write_result(i,'pass')
 pass_count.append(i)
 else:
 self.data.write_result(i,res)
 fail_count.append(i)
 self.send_mai.send_main(pass_count,fail_count)
 
 #将执行判断封装
 #def get_cookie_run(self,header):
 
 if __name__ == '__main__':
 run = RunTest()
 run.go_on_run()

七、总结 

PS:这套软件测试的自学教程合集,对于在测试行业发展的小伙伴们来说应该会很有帮助。全套内容已经打包到网盘,内容总量接近500个G。如需要软件测试学习资料,关注公众号(互联网杂货铺),后台回复1,整理不易,给个关注点个赞吧,谢谢各位大佬!

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

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

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

相关文章

二开的基础资料设置 为辅助核算项目的两种方式

一、第一种 自己插入相关表数据 T_BD_AsstActType //辅助核算项目表 insert into T_BD_AsstActType(FID, FName_L1, FName_L2, FName_L3, FNumber, FDescription_L1, FDescription_L2, FDescription_L3, FSimpleName, FAssistantType, FIsSelfAsstActaiatem, FIsSystemA…

如何评估一个论坛或峰会值不值得参加?

现在的论坛和峰会非常多&#xff0c;且都宣传的非常高端&#xff0c;很多人为了不错过机会像赶场一样总在参会路上。但究竟什么样的论坛或峰会才值得一去呢&#xff1f; 评估一个论坛或峰会是否值得参加&#xff0c;需要考虑多个因素。 1、主题与你的兴趣或职业相关性&#xf…

接口自动化测试是个啥?如何开始?什么是框架?带你揭开神秘面纱

自动化测试 自动化测试&#xff0c;这几年行业内的热词&#xff0c;也是测试人员进阶的必备技能&#xff0c;更是软件测试未来发展的趋势。 特别是在敏捷模式下&#xff0c;产品迭代速度快&#xff0c;市场不断调整&#xff0c;客户需求不断变化&#xff0c;单纯的手工测试越…

十大排序之选择排序(详解)

文章目录 &#x1f412;个人主页&#x1f3c5;算法思维框架&#x1f4d6;前言&#xff1a; &#x1f380;选择排序 时间复杂度O(n^2)&#x1f387;1. 算法步骤思想&#x1f387;2.动画实现&#x1f387; 3.代码实现 &#x1f412;个人主页 &#x1f3c5;算法思维框架 &#x1f…

华为ensp:trunk链路

当我们使用trunk链路后&#xff0c;还要选择要放行的vlan那就是全部vlan&#xff08;all&#xff09;&#xff0c;但是all并不包括vlan1&#xff0c;所以我们的trunk链路中的all不对all进行放行 实现相同vlan之间的通信 先将他们加入对应的vlan lsw1 进入e0/0/3接口 interfa…

随机生成字母

目录 css代码 html代码 js代码 css代码 .box {width: 400px;height: 400px;background-color: #797979;margin: 100px auto;padding-top: 100px;}.text{width: 200px;height: 50px;outline: none;border: 5px solid #545454;background-color: #797979;border-radius: 10px;f…

【数据分享】我国12.5米分辨率的山体阴影数据(免费获取)

地形数据&#xff0c;也叫DEM数据&#xff0c;是我们在各项研究中最常使用的数据之一。之前我们分享过源于NASA地球科学数据网站发布的12.5米分辨率DEM地形数据&#xff0c;这个DEM数据的优点是精度高&#xff01;基于该数据我们处理得到12.5米分辨率的坡度数据&#xff08;以上…

软件测试 | MySQL 主键约束详解:保障数据完整性与性能优化

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

pcl+vtk(十二)使用vtkPolyData创建点、线、面(不规则面)、三角带

一、前言 vtkPlaneSource创建平面&#xff0c;只可以创建平行四边形的平面&#xff0c;根据一个起点和两个终点创建法向量创建平面。但是当有创建多个点围成不规则平面的需求时&#xff0c;该怎么创建显示呢&#xff1f; 在网上查了资料&#xff0c;可以使用vtkPolyData拓扑结…

Linux-Ubuntu环境下搭建SVN服务器

Linux-Ubuntu环境下搭建SVN服务器 一、背景二、前置工作2.1确定IP地址保持不变2.2关闭防火墙 三、安装SVN服务器四、修改SVN服务器版本库目录五、调整SVN配置5.1查看需要修改的配置文件5.2修改svnserve.conf文件5.3修改passwd文件&#xff0c;添加账号和密码&#xff08;window…

各种工具的快捷键或命令

前言 这里就存放自己存有的一些小工具的地址以及工具的命令。 正文 零、各种小工具 1、wizTree:磁盘分析工具-分析磁盘的文件夹存储 2、稻壳阅读器&#xff1a;有黑色背景 3、youtube 视频下载&#xff1a;https://zh.savefrom.net/226/ 4、视频录制&#xff1a;Bandica…

lv11 嵌入式开发 GPIO实验 9

目录 1 简介 1.1 GPIO 2 LED实验步骤 2.1 通过电路原理图分析LED的控制逻辑 2.2 通过电路原理图查找LED与Exynos4412的连接关系 2.3 通过数据手册分析GPIO中哪些寄存器可以控制LED 2.4 通过程序去操控对应的寄存器完成对LED的控制 2.4.1 使用寄存器写入…

基于51单片机的交通信号灯系统【程序+proteus仿真+参考论文+AD原理图等16个文件夹资料】

一、项目功能简介 整个设计系统由STC89C52单片机数码管显示模块LED指向灯模块三线八线译码器模块按键模块组成。 具体功能&#xff1a; 1、东西向、南北向依次进行周期通行&#xff0c;默认设置为&#xff1a;东西向直行&#xff08;绿灯&#xff09;时间30秒&#xff0c;左转…

案例精选|聚铭网络流量智能分析审计系统加强南京市溧水区人社局信息安全防护能力

一字排开的社保综合服务窗口、实时滚动的数“智”人社大屏、便捷快速的社保卡自助服务机……每位到溧水市民中心人社大厅进行业务办理的市民对高效的社保服务经办效率赞叹不已。 党的二十大报告提出&#xff0c;健全覆盖全民、统筹城乡、公平统一、安全规范、可持续的多层次社…

AI和人工智能与机器学习全景报告

今天分享的是AI系列深度研究报告&#xff1a;《AI和人工智能与机器学习全景报告》。 &#xff08;报告出品方&#xff1a;appen&#xff09; 报告共计&#xff1a;30页 获取 数据获取仍是AI应用构建团队的主要瓶颈。 原因各不相同。例如&#xff0c;特定用例的数据可能不足…

【数据结构】树与二叉树(廿三):树和森林的遍历——层次遍历(LevelOrder)

文章目录 5.3.1 树的存储结构5. 左儿子右兄弟链接结构 5.3.2 获取结点的算法5.3.3 树和森林的遍历1. 先根遍历&#xff08;递归、非递归&#xff09;2. 后根遍历&#xff08;递归、非递归&#xff09;3. 森林的遍历4. 层次遍历a. 算法LevelOrderb. 算法解读c. 时间复杂度d.代码…

试写一算法将两个递增有序的带头结点的单链表合并为一个递增有序的带头结点的单链表。(利用原表结点空间)

试写一算法将两个递增有序的带头结点的单链表合并为一个递增有序的带头结点的单链表。 &#xff08;利用原表结点空间&#xff09; 比如现在要将下面两个链表合并&#xff0c;这里是要求利用原表空间 我们先创建一个辅助的链表L3&#xff0c;用p和q分别标记L1和L2的数据元素&…

macOS unlocker 4.0.5 for VMware ESXi 7.0

正文共&#xff1a;555 字 6 图&#xff0c;预估阅读时间&#xff1a;1 分钟 我们前面在macOS上已经折腾了好久了&#xff0c;包括黑苹果的安装&#xff08;老树发新芽&#xff0c;ACER TM4750G装黑苹果&#xff09;、macOS的安装&#xff08;VMware ESXI部署macOS&#xff08…

【React】打包体积分析 source-map-explorer

通过分析打包体积&#xff0c;才能知道项目中的哪部分内容体积过大&#xff0c;方便知道哪些包需要进一步优化。 使用步骤 安装分析打包体积的包&#xff1a;npm i source-map-explorer在 package.json 中的 scripts 标签中&#xff0c;添加分析打包体积的命令对项目打包&…

人工智能面面观

人工智能简介 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一门研究如何使计算机能够模拟和执行人类智能任务的科学和技术领域。它致力于开发能够感知、理解、学习、推理、决策和与人类进行交互的智能系统。人工智能的背景可以追溯到上世纪50…