Python+requests+unittest+excel实现接口自动化测试框架

news2024/11/26 9:47:12

一、框架结构:

 工程目录

二、Case文件设计

三、基础包 base

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

1 import requests
 2 import json
 3 class RunMethod:
 4     def post_main(self,url,data,header=None):
 5         res = None
 6         if header !=None:    
 7             res = requests.post(url=url,data=data,headers=header)
 8         else:
 9             res = requests.post(url=url,data=data)
10         return res.json()
11 
12     def get_main(self,url,data=None,header=None):
13         res = None
14         if header !=None:    
15             res = requests.get(url=url,data=data,headers=header,verify=False)
16         else:
17             res = requests.get(url=url,data=data,verify=False)
18         return res.json()
19 
20     def run_main(self,method,url,data=None,header=None):
21         res = None
22         if method == 'Post':
23             res = self.post_main(url,data,header)
24         else:
25             res = self.get_main(url,data,header)
26         return json.dumps(res,ensure_ascii=False,sort_keys=True,indent=2) 

3.2 封装mock(mock.py)

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

四、数据操作包 operation_data

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

  1 #coding:utf-8
  2 from tool.operation_excel import OperationExcel
  3 import data_config
  4 from tool.operation_json import OperetionJson
  5 from tool.connect_db import OperationMysql
  6 class GetData:
  7     def __init__(self):
  8         self.opera_excel = OperationExcel()
  9 
 10     #去获取excel行数,就是case的个数    
 11     def get_case_lines(self):
 12         return self.opera_excel.get_lines()
 13 
 14     #获取是否执行
 15     def get_is_run(self,row):
 16         flag = None
 17         col = int(data_config.get_run())
 18         run_model = self.opera_excel.get_cell_value(row,col)
 19         if run_model == 'yes':
 20             flag = True
 21         else:
 22             flag = False
 23         return flag
 24 
 25     #是否携带header
 26     def is_header(self,row):
 27         col = int(data_config.get_header())
 28         header = self.opera_excel.get_cell_value(row,col)
 29         if header != '':
 30             return header
 31         else:
 32             return None
 33 
 34     #获取请求方式
 35     def get_request_method(self,row):
 36         col = int(data_config.get_run_way())
 37         request_method = self.opera_excel.get_cell_value(row,col)
 38         return request_method
 39 
 40     #获取url
 41     def get_request_url(self,row):
 42         col = int(data_config.get_url())
 43         url = self.opera_excel.get_cell_value(row,col)
 44         return url
 45 
 46     #获取请求数据
 47     def get_request_data(self,row):
 48         col = int(data_config.get_data())
 49         data = self.opera_excel.get_cell_value(row,col)
 50         if data == '':
 51             return None
 52         return data
 53 
 54     #通过获取关键字拿到data数据
 55     def get_data_for_json(self,row):
 56         opera_json = OperetionJson()
 57         request_data = opera_json.get_data(self.get_request_data(row))
 58         return request_data
 59 
 60     #获取预期结果
 61     def get_expcet_data(self,row):
 62         col = int(data_config.get_expect())
 63         expect = self.opera_excel.get_cell_value(row,col)
 64         if expect == '':
 65             return None
 66         return expect
 67 
 68     #通过sql获取预期结果
 69     def get_expcet_data_for_mysql(self,row):
 70         op_mysql = OperationMysql()
 71         sql = self.get_expcet_data(row)
 72         res = op_mysql.search_one(sql)
 73         return res.decode('unicode-escape')
 74 
 75     def write_result(self,row,value):
 76         col = int(data_config.get_result())
 77         self.opera_excel.write_value(row,col,value)
 78 
 79     #获取依赖数据的key
 80     def get_depend_key(self,row):
 81         col = int(data_config.get_data_depend())
 82         depent_key = self.opera_excel.get_cell_value(row,col)
 83         if depent_key == "":
 84             return None
 85         else:
 86             return depent_key
 87 
 88     #判断是否有case依赖
 89     def is_depend(self,row):
 90         col = int(data_config.get_case_depend())
 91         depend_case_id = self.opera_excel.get_cell_value(row,col)
 92         if depend_case_id == "":
 93             return None
 94         else:
 95             return depend_case_id
 96 
 97     #获取数据依赖字段
 98     def get_depend_field(self,row):
 99         col = int(data_config.get_field_depend())
100         data = self.opera_excel.get_cell_value(row,col)
101         if data == "":
102             return None
103         else:
104             return data

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

1 #coding:utf-8
 2 class global_var:
 3     #case_id
 4     Id = '0'
 5     request_name = '1'
 6     url = '2'
 7     run = '3'
 8     request_way = '4'
 9     header = '5'
10     case_depend = '6'
11     data_depend = '7'
12     field_depend = '8'
13     data = '9'
14     expect = '10'
15     result = '11'
16 #获取caseid
17 def get_id():
18     return global_var.Id
19 
20 #获取url
21 def get_url():
22     return global_var.url
23 
24 def get_run():
25     return global_var.run
26 
27 def get_run_way():
28     return global_var.request_way
29 
30 def get_header():
31     return global_var.header
32 
33 def get_case_depend():
34     return global_var.case_depend
35 
36 def get_data_depend():
37     return global_var.data_depend
38 
39 def get_field_depend():
40     return global_var.field_depend
41 
42 def get_data():
43     return global_var.data
44 
45 def get_expect():
46     return global_var.expect
47 
48 def get_result():
49     return global_var.result
50 
51 def get_header_value():
52     return global_var.header

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

1 #coding:utf-8
 2 import sys
 3 import json
 4 sys.path.append('C:/Users/lxz/Desktop/InterFace_JIA')
 5 from tool.operation_excel import OperationExcel
 6 from base.runmethod import RunMethod
 7 from operation_data.get_data import GetData
 8 from jsonpath_rw import jsonpath,parse
 9 class DependdentData:
10     def __init__(self,case_id):
11         self.case_id = case_id
12         self.opera_excel = OperationExcel()
13         self.data = GetData()
14 
15     #通过case_id去获取该case_id的整行数据
16     def get_case_line_data(self):
17         rows_data = self.opera_excel.get_rows_data(self.case_id)
18         return rows_data
19 
20     #执行依赖测试,获取结果
21     def run_dependent(self):
22         run_method = RunMethod()
23         row_num  = self.opera_excel.get_row_num(self.case_id)
24         request_data = self.data.get_data_for_json(row_num)
25         #header = self.data.is_header(row_num)
26         method = self.data.get_request_method(row_num)
27         url = self.data.get_request_url(row_num)
28         res = run_method.run_main(method,url,request_data)
29         return json.loads(res)
30 
31     #根据依赖的key去获取执行依赖测试case的响应,然后返回
32     def get_data_for_key(self,row):
33         depend_data = self.data.get_depend_key(row)
34         response_data = self.run_dependent()
35         json_exe = parse(depend_data)
36         madle = json_exe.find(response_data)
37         return [math.value for math in madle][0]
38 
39 if __name__ == '__main__':
40     order = {
41         "data": {
42             "_input_charset": "utf-8", 
43             "body": "京东订单-1710141907182334", 
44             "it_b_pay": "1d", 
45             "notify_url": "http://order.imooc.com/pay/notifyalipay", 
46             "out_trade_no": "1710141907182334", 
47             "partner": "2088002966755334", 
48             "payment_type": "1", 
49             "seller_id": "yangyan01@tcl.com", 
50             "service": "mobile.securitypay.pay", 
51             "sign": "kZBV53KuiUf5HIrVLBCcBpWDg%2FnzO%2BtyEnBqgVYwwBtDU66Xk8VQUTbVOqDjrNymCupkVhlI%2BkFZq1jOr8C554KsZ7Gk7orC9dDbQl                        pr%2BaMmdjO30JBgjqjj4mmM%2Flphy9Xwr0Xrv46uSkDKdlQqLDdGAOP7YwOM2dSLyUQX%2Bo4%3D", 
52             "sign_type": "RSA", 
53             "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", 
54             "subject": "京东订单-1710141907182334", 
55             "total_fee": 299
56             }, 
57             "errorCode": 1000, 
58             "errorDesc": "成功", 
59             "status": 1, 
60             "timestamp": 1507979239100
61         }
62     res = "data.out_trade_no"
63     json_exe = parse(res)
64     madle = json_exe.find(order)
65     print [math.value for math in madle][0]

五、工具类包 tool5.1 操作excel (operation_excel.py)


 1 #coding:utf-8
 2 import xlrd
 3 from xlutils.copy import copy
 4 class OperationExcel:
 5     def __init__(self,file_name=None,sheet_id=None):
 6         if file_name:
 7             self.file_name = file_name
 8             self.sheet_id = sheet_id    
 9         else:
10             self.file_name = '../dataconfig/case1.xls'
11             self.sheet_id = 0
12         self.data = self.get_data()
13 
14     #获取sheets的内容
15     def get_data(self):
16         data = xlrd.open_workbook(self.file_name)
17         tables = data.sheets()[self.sheet_id]
18         return tables
19 
20     #获取单元格的行数
21     def get_lines(self):
22         tables = self.data
23         return tables.nrows
24 
25     #获取某一个单元格的内容
26     def get_cell_value(self,row,col):
27         return self.data.cell_value(row,col)
28 
29     #写入数据
30     def write_value(self,row,col,value):
31         '''
32         写入excel数据
33         row,col,value
34         '''
35         read_data = xlrd.open_workbook(self.file_name)
36         write_data = copy(read_data)
37         sheet_data = write_data.get_sheet(0)
38         sheet_data.write(row,col,value)
39         write_data.save(self.file_name)
40 
41     #根据对应的caseid 找到对应行的内容
42     def get_rows_data(self,case_id):
43         row_num = self.get_row_num(case_id)
44         rows_data = self.get_row_values(row_num)
45         return rows_data
46 
47     #根据对应的caseid找到对应的行号
48     def get_row_num(self,case_id):
49         num = 0
50         clols_data = self.get_cols_data()
51         for col_data in clols_data:
52             if case_id in col_data:
53                 return num
54             num = num+1
55 
56 
57     #根据行号,找到该行的内容
58     def get_row_values(self,row):
59         tables = self.data
60         row_data = tables.row_values(row)
61         return row_data
62 
63     #获取某一列的内容
64     def get_cols_data(self,col_id=None):
65         if col_id != None:
66             cols = self.data.col_values(col_id)
67         else:
68             cols = self.data.col_values(0)
69         return cols
70 
71 
72 if __name__ == '__main__':
73     opers = OperationExcel()
74     print opers.get_cell_value(1,2)

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


 1 #coding:utf-8
 2 import json
 3 class CommonUtil:
 4     def is_contain(self,str_one,str_two):
 5         '''
 6         判断一个字符串是否再另外一个字符串中
 7         str_one:查找的字符串
 8         str_two:被查找的字符串
 9         '''
10         flag = None
11         if isinstance(str_one,unicode):
12             str_one = str_one.encode('unicode-escape').decode('string_escape')
13         return cmp(str_one,str_two)
14         if str_one in str_two:
15             flag = True
16         else:
17             flag = False
18         return flag
19 
20 
21     def is_equal_dict(self,dict_one,dict_two):
22         '''
23         判断两个字典是否相等
24         '''
25         if isinstance(dict_one,str):
26             dict_one = json.loads(dict_one)
27         if isinstance(dict_two,str):
28             dict_two = json.loads(dict_two)
29         return cmp(dict_one,dict_two)

5.3 操作header(operation_herder.py)


 1 #coding:utf-8
 2 import requests
 3 import json
 4 from operation_json import OperetionJson
 5 
 6 
 7 class OperationHeader:
 8 
 9     def __init__(self,response):
10         self.response = json.loads(response)
11 
12     def get_response_url(self):
13         '''
14         获取登录返回的token的url
15         '''
16         url = self.response['data']['url'][0]
17         return url
18 
19     def get_cookie(self):
20         '''
21         获取cookie的jar文件
22         '''
23         url = self.get_response_url()+"&callback=jQuery21008240514814031887_1508666806688&_=1508666806689"
24         cookie = requests.get(url).cookies
25         return cookie
26 
27     def write_cookie(self):
28         cookie = requests.utils.dict_from_cookiejar(self.get_cookie())
29         op_json = OperetionJson()
30         op_json.write_data(cookie)
31         
32 if __name__ == '__main__':
33     
34     url = "http://www.jd.com/passport/user/login"
35     data = {
36         "username":"18513199586",
37         "password":"111111",
38         "verify":"",
39         "referer":"https://www.jd.com"
40     }
41     res = json.dumps(requests.post(url,data).json())
42     op_header = OperationHeader(res)
43     op_header.write_cookie()

5.4 操作json文件(operation_json.py)


 1 #coding:utf-8
 2 import json
 3 class OperetionJson:
 4 
 5     def __init__(self,file_path=None):
 6         if file_path  == None:
 7             self.file_path = '../dataconfig/user.json'
 8         else:
 9             self.file_path = file_path
10         self.data = self.read_data()
11 
12     #读取json文件
13     def read_data(self):
14         with open(self.file_path) as fp:
15             data = json.load(fp)
16             return data
17 
18     #根据关键字获取数据
19     def get_data(self,id):
20         print type(self.data)
21         return self.data[id]
22 
23     #写json
24     def write_data(self,data):
25         with open('../dataconfig/cookie.json','w') as fp:
26             fp.write(json.dumps(data))
27 
28 
29 
30 if __name__ == '__main__':
31     opjson = OperetionJson()
32     print opjson.get_data('shop')

5.5 操作数据库(connect_db.py)


 1 #coding:utf-8
 2 import MySQLdb.cursors
 3 import json
 4 class OperationMysql:
 5     def __init__(self):
 6         self.conn = MySQLdb.connect(
 7             host='localhost',
 8             port=3306,
 9             user='root',
10             passwd='123456',
11             db='le_study',
12             charset='utf8',
13             cursorclass=MySQLdb.cursors.DictCursor
14             )
15         self.cur = self.conn.cursor()
16 
17     #查询一条数据
18     def search_one(self,sql):
19         self.cur.execute(sql)
20         result = self.cur.fetchone()
21         result = json.dumps(result)
22         return result
23 
24 if __name__ == '__main__':
25     op_mysql = OperationMysql()
26     res = op_mysql.search_one("select * from web_user where Name='ailiailan'")
27     print res

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


 1 #coding:utf-8
 2 import smtplib
 3 from email.mime.text import MIMEText
 4 class SendEmail:
 5     global send_user
 6     global email_host
 7     global password
 8     email_host = "smtp.163.com"
 9     send_user = "jiaxiaonan666@163.com"
10     password = "jia_668"
11     def send_mail(self,user_list,sub,content):
12         user = "jiaxiaonan"+"<"+send_user+">"
13         message = MIMEText(content,_subtype='plain',_charset='utf-8')
14         message['Subject'] = sub
15         message['From'] = user
16         message['To'] = ";".join(user_list)
17         server = smtplib.SMTP()
18         server.connect(email_host)
19         server.login(send_user,password)
20         server.sendmail(user,user_list,message.as_string())
21         server.close()
22 
23     def send_main(self,pass_list,fail_list):
24         pass_num = float(len(pass_list))
25         fail_num = float(len(fail_list))
26         count_num = pass_num+fail_num
27         #90%
28         pass_result = "%.2f%%" %(pass_num/count_num*100)
29         fail_result = "%.2f%%" %(fail_num/count_num*100)
30 
31 
32         user_list = ['609037724@qq.com']
33         sub = "接口自动化测试报告"
34         content = "此次一共运行接口个数为%s个,通过个数为%s个,失败个数为%s,通过率为%s,失败率为%s" %(count_num,pass_num,fail_num,pass_result,fail_result )
35         self.send_mail(user_list,sub,content)
36 
37 if __name__ == '__main__':
38     sen = SendEmail()
39     sen.send_main([1,2,3,4],[2,3,4,5,6,7])

六、主函数run_test.py


 1 #coding:utf-8
 2 import sys
 3 sys.path.append("C:/Users/lxz/Desktop/InterFace_JIA")
 4 from base.runmethod import RunMethod
 5 from operation_data.get_data import GetData
 6 from tool.common_util import CommonUtil
 7 from operation_data.dependent_data import DependdentData
 8 from tool.send_email import SendEmail
 9 from tool.operation_header import OperationHeader
10 from tool.operation_json import OperetionJson
11 class RunTest:
12     def __init__(self):
13         self.run_method = RunMethod()
14         self.data = GetData()
15         self.com_util = CommonUtil()
16         self.send_mai = SendEmail()
17 
18     #程序执行的
19     def go_on_run(self):
20         res = None
21         pass_count = []
22         fail_count = []
23         #10  0,1,2,3
24         rows_count = self.data.get_case_lines()
25         for i in range(1,rows_count):
26             is_run = self.data.get_is_run(i)
27             if is_run:
28                 url = self.data.get_request_url(i)
29                 method = self.data.get_request_method(i)
30                 request_data = self.data.get_data_for_json(i)
31                 expect = self.data.get_expcet_data_for_mysql(i)
32                 header = self.data.is_header(i)
33                 depend_case = self.data.is_depend(i)
34                 if depend_case != None:
35                     self.depend_data = DependdentData(depend_case)
36                     #获取的依赖响应数据
37                     depend_response_data = self.depend_data.get_data_for_key(i)
38                     #获取依赖的key
39                     depend_key = self.data.get_depend_field(i)
40                     request_data[depend_key] = depend_response_data
41                 if header == 'write':
42                     res = self.run_method.run_main(method,url,request_data)
43                     op_header = OperationHeader(res)
44                     op_header.write_cookie()
45 
46                 elif header == 'yes':
47                     op_json = OperetionJson('../dataconfig/cookie.json')
48                     cookie = op_json.get_data('apsid')
49                     cookies = {
50                         'apsid':cookie
51                     }
52                     res = self.run_method.run_main(method,url,request_data,cookies)
53                 else:
54                     res = self.run_method.run_main(method,url,request_data)
55 
56                 if self.com_util.is_equal_dict(expect,res) == 0:
57                     self.data.write_result(i,'pass')
58                     pass_count.append(i)
59                 else:
60                     self.data.write_result(i,res)
61                     fail_count.append(i)
62         self.send_mai.send_main(pass_count,fail_count)
63 
64     #将执行判断封装
65     #def get_cookie_run(self,header):
66 
67 
68 if __name__ == '__main__':
69     run = RunTest()
70     run.go_on_run()

【整整200集】超超超详细的Python接口自动化测试进阶教程合集,真实模拟企业项目实战

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

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

相关文章

win10,WSL的Ubuntu配python3.7手记

1.装linux 先在windows上安装WSL版本的Ubuntu Windows10系统安装Ubuntu子系统_哔哩哔哩_bilibili &#xff08;WSL2什么的一直没搞清楚&#xff09; 图形界面会出一些问题&#xff0c;注意勾选ccsm出的界面设置 win10安装Ubuntu16.04子系统&#xff0c;并开启桌面环境_win…

opencv: 解决保存视频失败的问题

摘要&#xff1a;opencv能读取视频&#xff0c;但保存视频时报错。 一、首先要确保已经下载了openh264.dll文件&#xff0c;否则保存的视频无法打开&#xff0c;详细可以浏览这个&#xff1a;opencv&#xff1a;保存视频。 二、保存视频时出现一下问题&#xff1a; OpenCV:…

自学Mysql调优笔记

Mysql性能调优学习 预计十天完成14/day 1. 存储引擎 存储引擎是基于表的&#xff0c;而不是基于库的 SHOW ENGINES --展示所有存储引擎1.1 InnoDB DML操作遵循ACID模型&#xff0c;支持事务。 行鸡锁&#xff0c;提供并发访问性能。 支持外键约束&#xff0c;保证数据完…

赢麻了!smardaten闷声干大事,竟然用无代码开发了复杂小程序!

本文目录 一、【前言】二、移动端项目实战&#xff1a;关爱云服务平台2.1 项目背景2.2 6大场景功能拆解&#xff08;1&#xff09;场景1-首页&#xff08;2&#xff09;场景2-找活动&#xff08;3&#xff09;场景3-找组织&#xff08;4&#xff09;场景4-找服务&#xff08;5&…

自学网络安全———(黑客技术)

如果你想自学网络安全&#xff0c;首先你必须了解什么是网络安全&#xff01;&#xff0c;什么是黑客&#xff01;&#xff01; 1.无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面性&#xff0c;例如 Web 安全技术&#xff0c;既有 Web 渗透2.也有 Web 防…

电压放大器在无损探伤中的应用研究

电压放大器是一种常见的电子设备&#xff0c;其主要作用是将低电平信号转换为高电平信号。在无损探伤中&#xff0c;电压放大器被广泛应用于信号增益和分析&#xff0c;以便更好地检测表面或内部缺陷。下面安泰电子Aigtek将详细介绍电压放大器在无损探伤中的应用研究。 电压放大…

电缆桥架填充计算表

一、规范要求 1、《建筑电气与智能化通用规范》&#xff08;GB55024-2022&#xff09;6.1.2&#xff1a; 导管和电缆槽盒内配电电线的总截面面积不应超过导管或电缆槽盒内截面面积的40%&#xff1b;电缆槽盒内控制线缆的总截面面积不应超过电缆槽盒内截面面积的50%。 2、《建筑…

asp.net core automapper的使用

1.安装automapper的nuget包 AutoMapper.Extensions.Microsoft.DependencyInjection 2.创建需要映射的类和转换后的类 public class studto{public int sn { get; set; }public string name { get; set; }public string sex { get; set; }public int age { get; set; }public s…

快速使用Spring Cache

哈喽~大家好&#xff0c;这篇我们来看看快速使用Spring Cache。 &#x1f947;个人主页&#xff1a;个人主页​​​​​ &#x1f948; 系列专栏&#xff1a;【日常学习上的分享】 &#x1f949;与这篇相关的文章&#xff1a; R…

数据结构之道:如何选择适合你的数据存储

文章目录 第1节&#xff1a;数据结构的基本原理1.1 时间复杂度和空间复杂度1.2 数据的访问方式1.3 数据的增删操作 第2节&#xff1a;常见的数据结构2.1 数组&#xff08;Array&#xff09;2.2 链表&#xff08;Linked List&#xff09;2.3 栈&#xff08;Stack&#xff09;2.4…

数字化卡券拉新怎么做?卡券营销系统如何裂变用户

卡券促销活动对于大众用户而言是一种常见的营销手段&#xff0c;也是一种推动产品销售的方式&#xff0c;针对不同类型的营销诉求&#xff0c;同类型的卡券活动也需要配置不同的落地手段&#xff0c;才能更好地抓住消费者的心理&#xff0c;达到增收的目的&#xff0c;如何借助…

Interceptor内存马

Interceptor是SpringMVC中的拦截器&#xff0c;类似于Servlet中的Filter&#xff0c;主要针对Controller层进行拦截请求。 Interceptor的注册过程 在DispatcherServlet#doDispatch方法中的会调用getHandler方法&#xff08;可接Controller查找部分&#xff09;&#xff0c;在…

选择适合的项目管理工具,助力出海企业

当下全球化的加速推进&#xff0c;越来越多的企业开始寻求海外市场的机会&#xff0c;从而迎来了充满机遇的前景&#xff1a;市场多元化&#xff0c;降低单一市场风险&#xff0c;实现更稳健的增长&#xff1b;技术创新&#xff0c;不同地区的市场需求可能会激发新的技术创新&a…

通用CI/CD软件平台TeamCity推出代理终端功能,谁能从中获益?

JetBrains官方在TeamCity中推出代理终端&#xff1a;这项新功能专门用于帮助用户轻松查看代理上的系统日志、检查已安装的软件&#xff0c;以及直接从 TeamCity 的 UI 调试特定代理问题。 TeamCity是一个通用的 CI/CD 软件平台&#xff0c;可以实现灵活的工作流、协作和开发做…

增强for循环和一般for循环的对比使用

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。个人B站主页热爱技术的小郑 &#xff0c;视频内容主要是对应文章的视频讲解形式。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘…

智能回答机器人的“智能”体现在哪里?

人工智能的广泛应用已经成为当今社会科技发展的趋势之一。通过人工智能技术&#xff0c;我们可以在不同领域中实现自动化、智能化和高效化&#xff0c;从而大大提升生产和生活效率。智能回答机器人的出现和使用便能很好的证明这一点。今天我们就来探讨一下智能会打机器人的“智…

全网最全Python系列教程(非常详细)---数值篇讲解(学Python入门必收藏)

&#x1f9e1;&#x1f9e1;&#x1f9e1;这篇是关于Python中数值的讲解&#xff0c;涉及到以下内容&#xff0c;欢迎点赞和收藏&#xff0c;你点赞和收藏是我更新的动力&#x1f9e1;&#x1f9e1;&#x1f9e1; 涉及到&#xff1a; 数值表现形式进制之间的转换常用操作 1 表…

C++与QML交互总结二

目录 1.CPP调用QML 1.1 QMetaObject::invokeMethod调用 1.2 CPP中的信号绑定qml中的槽 2.QML调用CPP 2.1 QML单实例注册 2.2 将类对象注册到QML的上下文中 2.3 QML信号调用CPP槽 3.QML中注入一个cpp实例 3.1qmlRegisterType 3.2QML_ELEMENT 4.附加属性: QML_ATTACHE…

了解MES:提升制造业的效率与竞争力

今天我将和大家分享关于MES&#xff08;Manufacturing Execution System&#xff0c;制造执行系统&#xff09;的知识。随着制造业的发展和变革&#xff0c;MES作为一个关键的信息技术工具&#xff0c;已经成为许多企业提升效率和竞争力的重要策略之一。 MES的定义与作用 MES是…

孟晚舟最新发声!华为吹响人工智能的号角,发布“全面智能化”战略部署

原创 | 文 BFT机器人 1、华为孟晚舟新发声&#xff0c;华为发布“全面智能化”战略 上周三&#xff08;9月30号&#xff09;上午&#xff0c;华为全联接大会2023正式在上海举行&#xff0c;作为华为副董事长、轮值董事长、CFO的孟晚舟代表华为再次发声&#xff01;在演讲上&am…