当前位置: 首页 > news >正文

excel管理接口测试用例

闲话休扯,上需求:自动读取、执行excel里面的接口测试用例,测试完成后,返回错误结果并发送邮件通知。

分析:

1、设计excel表格
2、读取excel表格
3、拼接url,发送请求
4、汇总错误结果、发送邮件

开始实现:

1、设计excel接口用例表格,大概长这样:  

依次为:用例编号、接口名称、接口主host、接口路由、请求方式、请求参数类型、请求参数、断言

这次案例中用到的接口,其实就是如何优雅的进行接口测试使用的快递查询接口,一时半会儿没找到好用的,之前写的也找不到了,只好作罢。

2、读取excel表格,获取每个用例的数据

import xlrd
import sysdef test_cases_in_excel(test_case_file):test_case_file = os.path.join(os.getcwd(), test_case_file)# 获取测试用例全路径 如:E:\Python\httprunner\interface_excel\testcases.xlsxprint(test_case_file)if not os.path.exists(test_case_file):print("测试用例excel文件存在或路径有误!")# 找不到指定测试文件,就退出程序 os.system("exit")是用来退出cmd的sys.exit()# 读取excel文件test_case = xlrd.open_workbook(test_case_file)# 获取第一个sheet,下标从0开始table = test_case.sheet_by_index(0)# 记录错误用例error_cases = []# 一张表格读取下来,其实就像个二维数组,无非是读取第一行的第几列的值,由于下标是从0开始,第一行是标题,所以从第二行开始读取数据for i in range(1, table.nrows):num = str(int(table.cell(i, 0).value)).replace("\n", "").replace("\r", "")api_name = table.cell(i, 1).value.replace("\n", "").replace("\r", "")api_host = table.cell(i, 2).value.replace("\n", "").replace("\r", "")request_url = table.cell(i, 3).value.replace("\n", "").replace("\r", "")method = table.cell(i, 4).value.replace("\n", "").replace("\r", "")request_data_type = table.cell(i, 5).value.replace("\n", "").replace("\r", "")request_data = table.cell(i, 6).value.replace("\n", "").replace("\r", "")check_point = table.cell(i, 7).value.replace("\n", "").replace("\r", "")print(num, api_name, api_host, request_url, method, request_data_type, request_data, check_point)try:# 调用接口请求方法,后面会讲到status, resp = interface_test(num, api_name, api_host, request_url, method, request_data_type, request_data, check_point)if status != 200 or check_point not in resp:# append只接收一个参数,所以要讲四个参数括在一起,当一个参数来传递# 请求失败,则向error_cases中增加一条记录error_cases.append((num + " " + api_name, str(status), api_host + request_url))except Exception as e:print(e)print("第{}个接口请求失败,请检查接口是否异常。".format(num))# 访问异常,也向error_cases中增加一条记录error_cases.append((num + " " + api_name, "请求失败", api_host + request_url))return error_cases

3、拼接url,判断请求方式(get/post),发送请求传入读取用例的各种参数,先判断请求方式,再拼接参数通过requests库来发送请求


import requestsdef interface_test(num, api_name, api_host, request_url, method, request_data_type, request_data, check_point):# 构造请求headersheaders = {'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8','X-Requested-With' : 'XMLHttpRequest','Connection' : 'keep-alive','Referer' : 'http://' + api_host,'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36'}# 判断请求方式,如果是GET,则调用get请求,POST调post请求,都不是,则抛出异常if method == "GET":r = requests.get(url=api_host+request_url, params=json.loads(request_data), headers=headers)# 获取请求状态码status = r.status_code# 获取返回值resp = r.textif status == 200:# 断言,判断设置的断言值,是否在返回值里面if check_point in str(r.text):print("第{}条用例'{}'执行成功,状态码为{},结果返回值为{}.".format(num, api_name, status, r.text))return status, respelse:print("第{}条用例'{}'执行失败!!!状态码为{},结果返回值为{}.".format(num, api_name, status, r.text))return status, respelse:print("第{}条用例'{}'执行失败!!!状态码为{},结果返回值为{}.".format(num, api_name, status, r.text))return status, respelif method == "POST":# 跟GET里面差不多,就不一一注释了r = requests.post(url=api_host+request_url, params=json.loads(request_data), headers=headers)status = r.status_coderesp = r.textif status == 200:if check_point in str(r.text):print("第{}条用例'{}'执行成功,状态码为{},结果返回值为{}.".format(num, api_name, status, r.text))return status, respelse:print("第{}条用例'{}'执行失败!!!状态码为{},结果返回值为{}.".format(num, api_name, status, r.text))return status, respelse:print("第{}条用例'{}'执行失败!!!状态码为{},结果返回值为{}.".format(num, api_name, status, r.text))return status, respelse:print("第{}条用例'{}'请求方式有误!!!请确认字段【Method】值是否正确,正确值为大写的GET或POST。".format(num, api_name))return 400, "请求方式有误"

4、汇总错误结果、发送邮件4.1、汇总错误结果,保存为简易html报告,并通过邮件发送到指定接收人


def main():# 执行所以测试用例,获取错误的用例error_cases = test_cases_in_excel("testcases.xlsx")# 如果有错误接口,则开始构造html报告if len(error_cases) > 0:html = '<html><body>接口自动化扫描,共有 ' + str(len(error_cases)) + ' 个异常接口,列表如下:' + '</p><table><tr><th style="width:100px;text-align:left">接口</th><th style="width:50px;text-align:left">状态</th><th style="width:200px;text-align:left">接口地址</th></tr>'for test in error_cases:html = html + '<tr><td style="text-align:left">' + test[0] + '</td><td style="text-align:left">' + test[1] + '</td><td style="text-align:left">' + test[2] + '</td></tr>'send_email(html)print(html)with open ("report.html", "w") as f:f.write(html)else:print("本次测试,所有用例全部通过")send_email("本次测试,所有用例全部通过")

4.2、构造邮件函数

先读取配置文件,新建config.yml配置文件,内容如下:

sender为发送邮件的邮箱,receiver为接收者着的邮箱,支持多个,smtpserver邮箱服务,username发送者邮箱少去后缀,password密码 

import yamldef get_conf():with open ("config.yml", "r", encoding='utf-8') as f:cfg = f.read()dic = yaml.load(cfg)sender = dic['email']['sender']receiver = dic['email']['receiver']smtpserver = dic['email']['smtpserver']username = dic['email']['username']password = dic['email']['password']print(sender, receiver, smtpserver, username, password)return sender, receiver, smtpserver, username, password

然后构造发送邮件的函数

import smtplib
import time
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.header import Headerdef send_email(text):today = time.strftime('%Y.%m.%d',time.localtime(time.time()))sender, receiver, smtpserver, username, password = get_conf()# subject为邮件主题 text为邮件正文subject = "[api_test]接口自动化测试结果通知 {}".format(today)msg = MIMEText(text, 'html', 'utf-8')msg['Subject'] = subjectmsg['From'] = sendermsg['To'] = "".join(receiver)smtp = smtplib.SMTP()smtp.connect(smtpserver)smtp.login(username, password)smtp.sendmail(sender, receiver, msg.as_string())smtp.quit()

以上内容就将需求实现了,由于现在很晚了(懒),上面所以函数就对在一个py文件里面了,来运行下吧 

 

邮件一会儿就收到了

所有代码如下:

#!/usr/bin/env python
#-*- coding:utf-8 -*-'''
需求:自动读取、执行excel里面的接口测试用例,测试完成后,返回错误结果并发送邮件通知。
一步一步捋清需求:
1、设计excel表格
2、读取excel表格
3、拼接url,发送请求
4、汇总错误结果、发送邮件
'''
import xlrd
import os
import requests
import json
import yaml
import smtplib
import time
import sys
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.header import Headerdef test_cases_in_excel(test_case_file):test_case_file = os.path.join(os.getcwd(), test_case_file)# 获取测试用例全路径 如:E:\Python\httprunner\interface_excel\testcases.xlsxprint(test_case_file)if not os.path.exists(test_case_file):print("测试用例excel文件存在或路径有误!")# 找不到指定测试文件,就退出程序 os.system("exit")是用来退出cmd的sys.exit()# 读取excel文件test_case = xlrd.open_workbook(test_case_file)# 获取第一个sheet,下标从0开始table = test_case.sheet_by_index(0)# 记录错误用例error_cases = []# 一张表格读取下来,其实就像个二维数组,无非是读取第一行的第几列的值,由于下标是从0开始,第一行是标题,所以从第二行开始读取数据for i in range(1, table.nrows):num = str(int(table.cell(i, 0).value)).replace("\n", "").replace("\r", "")api_name = table.cell(i, 1).value.replace("\n", "").replace("\r", "")api_host = table.cell(i, 2).value.replace("\n", "").replace("\r", "")request_url = table.cell(i, 3).value.replace("\n", "").replace("\r", "")method = table.cell(i, 4).value.replace("\n", "").replace("\r", "")request_data_type = table.cell(i, 5).value.replace("\n", "").replace("\r", "")request_data = table.cell(i, 6).value.replace("\n", "").replace("\r", "")check_point = table.cell(i, 7).value.replace("\n", "").replace("\r", "")print(num, api_name, api_host, request_url, method, request_data_type, request_data, check_point)try:# 调用接口请求方法,后面会讲到status, resp = interface_test(num, api_name, api_host, request_url, method, request_data_type, request_data, check_point)if status != 200 or check_point not in resp:# append只接收一个参数,所以要讲四个参数括在一起,当一个参数来传递# 请求失败,则向error_cases中增加一条记录error_cases.append((num + " " + api_name, str(status), api_host + request_url))except Exception as e:print(e)print("第{}个接口请求失败,请检查接口是否异常。".format(num))# 访问异常,也向error_cases中增加一条记录error_cases.append((num + " " + api_name, "请求失败", api_host + request_url))return error_casesdef interface_test(num, api_name, api_host, request_url, method, request_data_type, request_data, check_point):# 构造请求headersheaders = {'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8','X-Requested-With' : 'XMLHttpRequest','Connection' : 'keep-alive','Referer' : 'http://' + api_host,'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36'}# 判断请求方式,如果是GET,则调用get请求,POST调post请求,都不是,则抛出异常if method == "GET":r = requests.get(url=api_host+request_url, params=json.loads(request_data), headers=headers)# 获取请求状态码status = r.status_code# 获取返回值resp = r.textif status == 200:# 断言,判断设置的断言值,是否在返回值里面if check_point in str(r.text):print("第{}条用例'{}'执行成功,状态码为{},结果返回值为{}.".format(num, api_name, status, r.text))return status, respelse:print("第{}条用例'{}'执行失败!!!状态码为{},结果返回值为{}.".format(num, api_name, status, r.text))return status, respelse:print("第{}条用例'{}'执行失败!!!状态码为{},结果返回值为{}.".format(num, api_name, status, r.text))return status, respelif method == "POST":# 跟GET里面差不多,就不一一注释了r = requests.post(url=api_host+request_url, params=json.loads(request_data), headers=headers)status = r.status_coderesp = r.textif status == 200:if check_point in str(r.text):print("第{}条用例'{}'执行成功,状态码为{},结果返回值为{}.".format(num, api_name, status, r.text))return status, respelse:print("第{}条用例'{}'执行失败!!!状态码为{},结果返回值为{}.".format(num, api_name, status, r.text))return status, respelse:print("第{}条用例'{}'执行失败!!!状态码为{},结果返回值为{}.".format(num, api_name, status, r.text))return status, respelse:print("第{}条用例'{}'请求方式有误!!!请确认字段【Method】值是否正确,正确值为大写的GET或POST。".format(num, api_name))return 400, "请求方式有误"def main():# 执行所以测试用例,获取错误的用例error_cases = test_cases_in_excel("testcases.xlsx")# 如果有错误接口,则开始构造html报告if len(error_cases) > 0:# html = '<html><body>接口自动化扫描,共有 ' + str(len(error_cases)) + ' 个异常接口,列表如下:' + '</p><table><tr><th style="width:100px;text-align:left">接口</th><th style="width:50px;text-align:left">状态</th><th style="width:200px;text-align:left">接口地址</th><th   style="text-align:left">接口返回值</th></tr>'html = '<html><body>接口自动化扫描,共有 ' + str(len(error_cases)) + ' 个异常接口,列表如下:' + '</p><table><tr><th style="width:100px;text-align:left">接口</th><th style="width:50px;text-align:left">状态</th><th style="width:200px;text-align:left">接口地址</th></tr>'for test in error_cases:# html = html + '<tr><td style="text-align:left">' + test[0] + '</td><td style="text-align:left">' + test[1] + '</td><td style="text-align:left">' + test[2] + '</td><td style="text-align:left">' + test[3] + '</td></tr>'html = html + '<tr><td style="text-align:left">' + test[0] + '</td><td style="text-align:left">' + test[1] + '</td><td style="text-align:left">' + test[2] + '</td></tr>'send_email(html)print(html)with open ("report.html", "w") as f:f.write(html)else:print("本次测试,所有用例全部通过")send_email("本次测试,所有用例全部通过")def get_conf():with open ("config.yml", "r", encoding='utf-8') as f:cfg = f.read()dic = yaml.load(cfg)# print(type(dic))# print(dic)sender = dic['email']['sender']receiver = dic['email']['receiver']smtpserver = dic['email']['smtpserver']username = dic['email']['username']password = dic['email']['password']print(sender, receiver, smtpserver, username, password)return sender, receiver, smtpserver, username, passworddef send_email(text):today = time.strftime('%Y.%m.%d',time.localtime(time.time()))sender, receiver, smtpserver, username, password = get_conf()# subject为邮件主题 text为邮件正文subject = "[api_test]接口自动化测试结果通知 {}".format(today)msg = MIMEText(text, 'html', 'utf-8')msg['Subject'] = subjectmsg['From'] = sendermsg['To'] = "".join(receiver)smtp = smtplib.SMTP()smtp.connect(smtpserver)smtp.login(username, password)smtp.sendmail(sender, receiver, msg.as_string())smtp.quit()if __name__ == "__main__":# send_email("test")main()

 View Code

思考:

需要改进的地方有很多:

1、增加日志:导入logging模块,代码里面的print一通copy即可,自己尝试哈

2、回写excel表格:xlrd既然可以读取excel文档,肯定可以写入的。可以新增一列,每次执行完用例,将结果写进去,自己去尝试哈

3、request data type没有做判断,这里偷懒了,因为只用了一个接口,而且大晚上在赶工,就没有做判断。可以参照判断请求方式(get/post)来写。

4、报告渣:1、可以尝试使用htmlreport库;2、也可以自己尝试使用一些前端框架生成,如bootstrap

5、未做持续集成:什么是持续集成?听起来高大上,说白了就是找个数据库或者其他玩意儿,将用例、执行结果等等,都存储起来。python有很多库,可以连接各种数据库(mysql、mongoDB),读取excel或者其他接口脚本文档,存入数据库;然后请求接口后,再从库里面读取出来。balabala......

6、无界面:没有界面,其实要不要都无所谓,毕竟只要维护一份excel表格即可。如果一定要的话,可以考虑使用django或者flask框架,构造web页面,将用例的导入导出、新增、编辑、发送请求,生成报告等等一系列操作,全部移交到前端。这就需要懂一点前端代码,如果有兴趣,你也可以尝试。

Python接口自动化测试零基础入门到精通(2023最新版)

相关文章:

excel管理接口测试用例

闲话休扯&#xff0c;上需求&#xff1a;自动读取、执行excel里面的接口测试用例&#xff0c;测试完成后&#xff0c;返回错误结果并发送邮件通知。 分析&#xff1a; 1、设计excel表格 2、读取excel表格 3、拼接url&#xff0c;发送请求 4、汇总错误结果、发送邮件 开始实现…...

根文件系统制作并启动 Linux

根文件系统制作并启动 Linux busybox 下载链接&#xff1a;https://busybox.net/ 下载 wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2解压 tar -vxf busybox-1.36.1.tar.bz2 并进入其根目录 export ARCHarm export CROSS_COMPILEarm-none-linux-gnueabihf- m…...

JSKarel教学编程机器人使用介绍

JSKarel教学编程机器人使用介绍 为了避免被编程语言固有的复杂性所困扰&#xff0c;有一个被称为卡雷尔&#xff08;Karel&#xff09;机器人的微型世界&#xff08;microworld&#xff09;的简化环境&#xff0c;可以让编程初学者从中学习理解编程的基本概念&#xff0c;而不…...

换低挡装置(Kickdown, ACM/ICPC NEERC 2006, UVa1588)rust解法

给出两个长度分别为n1&#xff0c;n2&#xff08;n1&#xff0c;n2≤100&#xff09;且每列高度只为1或2的长条。需要将它们放入一个高度为3的容器&#xff08;如图3-8所示&#xff09;&#xff0c;问能够容纳它们的最短容器长度。 样例 2112112112 2212112 1012121212 2121…...

Windows10用Navicat 定时备份报错80070057

直接按照网上的教程配置定时任务发现报错&#xff0c;提示参数非法之类的&#xff0c;80070057。 搜索加自己测试发现是用户权限问题。 设置任务计划的时候&#xff0c;我用了用户组&#xff0c;选了administors&#xff0c;在勾选上run with hightest privileges。 查找用户…...

JimuReport 积木报表 v1.6.4 稳定版本正式发布 — 开源免费的低代码报表

项目介绍 一款免费的数据可视化报表&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完成报…...

为什么要把 String 设计为不可变?

将字符串设计为不可变具有多个重要的原因&#xff1a; 线程安全性&#xff1a; 不可变字符串可以在多线程环境中共享而无需额外的同步措施。因为字符串不会改变&#xff0c;多个线程可以同时访问它而不会导致竞态条件或数据不一致性。 缓存和性能优化&#xff1a; 字符串不可变…...

华为OD机考算法题:服务器广播

题目部分 题目服务器广播难度难题目说明服务器连接方式包括直接相连&#xff0c;间接连接。A 和 B 直接连接&#xff0c;B 和 C 直接连接&#xff0c;则 A 和 C 间接连接。直接连接和间接连接都可以发送广播。 给出一个 N * N 数组&#xff0c;代表 N 个服务器&#xff0c;mat…...

Android ViewBinding和DataBinding功能作用区别

简述 ViewBinding和DataBinding都是用于在 Android 应用程序中处理视图的工具&#xff0c;但它们有不同的作用和用途。 ViewBinding: ViewBinding 是 Android Studio 的一个工具&#xff0c;用于生成一个绑定类&#xff0c;能够轻松访问 XML 布局文件中的视图。ViewBinding 为…...

【云计算网络安全】DDoS 攻击类型:什么是 ACK 洪水 DDoS 攻击

文章目录 一、什么是 ACK 洪水 DDoS 攻击&#xff1f;二、什么是数据包&#xff1f;三、什么是 ACK 数据包&#xff1f;四、ACK 洪水攻击如何工作&#xff1f;五、SYN ACK 洪水攻击如何工作&#xff1f;六、文末送书《AWD特训营》内容简介读者对象 一、什么是 ACK 洪水 DDoS 攻…...

springboot 导出word模板

一、安装依赖 <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.1</version></dependency>二、定义工具类 package com.example.springbootmp.utils;import com.deepoove.poi.XWP…...

Angular安全专辑之五 —— 防止URL中敏感信息泄露

URL 中的敏感数据是指在网址上的机密或者个人信息&#xff0c;包括 UserId, usernames, passwords, session, token 等其他认证信息。 由于URL 可能会被第三方拦截和查看&#xff08;比如互联网服务商、代理或者其他监视网络流量的攻击者&#xff09;&#xff0c;所以URL中的敏…...

vueday01——文本渲染与挂载

1.定义html样式字符串 const rawHtml "<span stylecolor:red>htmlTest</span>" 2.创建标签&#xff0c;分别渲染普通文本和html文本 <p> 你好<span v-html"rawHtml"></span></p> 3.代码展示 4.结果展示...

Prometheus的Pushgateway快速部署及使用

prometheus-pushgateway安装 一. Pushgateway简介 Pushgateway为Prometheus整体监控方案的功能组件之一&#xff0c;并做于一个独立的工具存在。它主要用于Prometheus无法直接拿到监控指标的场景&#xff0c;如监控源位于防火墙之后&#xff0c;Prometheus无法穿透防火墙&…...

spring cloud config 占位符 application用法

前一篇讲过spring cloud config pattern 的用法,但是在使用spring cloud config的时候,我们经常会根据config client的application name来选择对应的central config的路径,当然spring cloud config官网也给出了相关的说明,但是说的并不算明朗,也没有举例说明在spring clou…...

SAP ERP系统解决光伏电池产业管理难题

无锡哲讯聚焦光伏行业的业务需求和流程&#xff0c;推出SAP光伏能源行业整体化解决方案。该系统着眼于“企业管理信息化、资源合理配置、利润扩张”三个方面&#xff0c;提供实用丰富的管理功能&#xff0c;同时具有较高的信息综合利用效率。SAP解决方案实现了光伏企业产、供、…...

el-table的formatter属性的使用方法

一、formatter是什么&#xff1f; formatter是el-table-column的一个属性&#xff0c;用来格式化内容。&#xff08;比如后台给你返0或1&#xff0c;你需要展示成“否”和“是”&#xff09; 二、详细使用 1.知道formatter之前&#xff1a; 代码如下&#xff08;示例&#…...

高质量床上用品类网站带手机端的pbootcms模板

模板介绍&#xff1a; 这是一个基于PbootCMS内核开发的床上用品类网站模板&#xff0c;专为床上用品、家用纺织类企业设计和开发。它不仅提供了网站界面简洁简单、易于管理的特点&#xff0c;还附带了测试数据&#xff0c;方便用户进行演示和学习。 模板特点&#xff1a; 采用…...

paddlenlp:社交网络中多模态虚假媒体内容核查(特征篇)

初赛之特征构造 写在前面一、安装paddleOCR二、代码部分三、模型优缺点四、写在最后 写在前面 通过前面两篇文章的介绍&#xff0c;我们可以大致的知道模型用到的特征分为四块&#xff1a;qCap&#xff0c;qImg&#xff0c;captions&#xff0c;imgs。根据这些特征&#xff0c…...

【网络】总览(待更新)

网络Ⅰ 零、概述0. 网络协议1. 网络协议分层OSI 七层模型TCP/IP 五层模型 2. 协议报头3. 通信过程 一、应用层1.1 &#x1f517;HTTP 协议1.2 &#x1f517;HTTPS 协议 二、传输层2.1 端口号2.2 netstat - - 查询网络状态2.3 pidof - - 查看服务器的进程 id2.4 &#x1f517;UD…...

策略模式——多重if-else解决方案

概念 大量的 if 判断操作&#xff0c;逻辑比较复杂&#xff0c;并且处理起来相对麻烦。可以采用策略模式来优化分支代码。 策略模式 &#x1f4a4;&#xff1a;是一种行为设计模式&#xff0c;它允许你在运行时根据不同情况选择不同的算法或行为。 设计模式 &#x1f90c;&…...

CTAmap 1.12版本2013年-2023年省市县矢量数据更新

中国行政区划数据CTAmap 1.12版本更新 从2022年起&#xff0c;笔者开始整理长时间序列的中国行政区划数据&#xff0c;通过以国家基础地理信息矢量数据为基础&#xff0c;以高德、民政部、gadm、乡镇界、村界、各省标准地图等区划矢量数据和相关行政区划变更文字资料为参考&am…...

【Linux初阶】多线程3 | 线程同步,生产消费者模型(普通版、BlockingQueue版)

文章目录 ☀️一、线程同步&#x1f33b;1.条件变量&#x1f33b;2.同步概念与竞态条件&#x1f33b;3.条件变量函数&#x1f33b;4.条件变量使用规范&#x1f33b;5.代码案例 ☀️二、生产者消费者模型&#x1f33b;1.为何要使用生产者消费者模型&#x1f33b;2.生产者消费者模…...

JUC并发编程——四大函数式接口(基于狂神说的学习笔记)

四大函数式接口 函数式接口&#xff1a;只有一个方法的接口 &#xff0c;例如&#xff1a;Runnable接口 Function 函数型接口&#xff0c;有一个输入参数&#xff0c;有一个输出 源码&#xff1a; /*** Represents a function that accepts one argument and produces a resul…...

【2】c++11新特性(稳定性和兼容性)—>超长整型 long long

c11标准要求long long整型可以在不同的平台上有不同的长度&#xff0c;但是至少64位&#xff0c;long long整型有两种&#xff1a; 有符号long long&#xff1a;–对应类型的数值可以使用LL或者ll后缀 long long num1 123456789LL; long long num2 123456789ll;无符号unsign…...

AI算法检测对无人军用车辆的MitM攻击

南澳大利亚大学和查尔斯特大学的教授开发了一种算法来检测和拦截对无人军事机器人的中间人&#xff08;MitM&#xff09;攻击。 MitM 攻击是一种网络攻击&#xff0c;其中两方&#xff08;在本例中为机器人及其合法控制器&#xff09;之间的数据流量被拦截&#xff0c;以窃听或…...

运维 | 如何在 Linux 系统中删除软链接 | Linux

运维 | 如何在 Linux 系统中删除软链接 | Linux 介绍 在 Linux 中&#xff0c;符号链接&#xff08;symbolic link&#xff0c;或者symlink&#xff09;也称为软链接&#xff0c;是一种特殊类型的文件&#xff0c;用作指向另一个文件的快捷方式。 使用方法 我们可以使用 ln…...

Jmeter接口测试:jmeter导入和导出接口的处理

JMeter测试导入接口 利用Jmeter测试上传文件&#xff0c;首先可根据接口文档或者fiddler抓包分析文件上传的接口&#xff1b;如下图&#xff1a; 以下是我通过fiddler所截取的文件上传的接口 1、填写导入接口的信息 查看文件上传栏下的填写信息&#xff1a; 文件名称&#x…...

一文了解 Go fmt 标准库的常用占位符及其简单使用

今天分享的内容是 Go fmt 标准库的常用占位符及其简单使用。如果本文对你有帮助&#xff0c;不妨点个赞&#xff0c;如果你是 Go 语言初学者&#xff0c;不妨点个关注&#xff0c;一起成长一起进步&#xff0c;如果本文有错误的地方&#xff0c;欢迎指出 占位符 通过占位符&a…...

Linux命令(94)之history

linux命令之history 1.history介绍 linux命令history会记录并显示用户所执行过的所有命令&#xff0c;也可以对其命令进行修改和删除操作。 2.history用法 history [参数] history参数 参数说明-a将当前会话的历史信息追加到历史文件(.bash_history)中-c删除所有条目从而清…...

做购物网站怎么赚钱/seo和sem的区别与联系

NOIP2018 复盘 前言 在这里立一个可能无法实现的flag&#xff1a; 把NOIP从古至今&#xff08;luogu上有&#xff09;的每一年都写一篇复盘&#xff01;&#xff01;&#xff01; 伏拉格综合征开始了 在复盘就不讲那些伤心的话了。 D1T1 铺设道路 考试时居然不知道这道题是原题…...

安徽省工程建设信息网网站/好口碑关键词优化

对于图片的格式&#xff0c;我们常用的和熟悉的大部分为jpg格式&#xff0c;但jpg格式的图片有时候很难满足我们的需求&#xff0c;这时&#xff0c;我们需要让图片保存成png的格式来满足我们的需求。.Png格式是图像文件存储格式&#xff0c;在网页设计中已经不是一个陌生的名词…...

简单网站制作教程/超链接友情外链查询

删除 node_modules包 然后npm install 然后再deploy d即可 这个问题真是闹心死我了 https://github.com/npm/npm/issues/17444 网上又有人说是vs code占用了&#xff0c;所以最好把vs code也暂时关掉 我这样做之后就好使了 还有说加环境变量的&#xff0c;也就是把博客地址…...

网页设计与网站建设第4章在线测试/app怎么推广运营

转载请注明出处:http://blog.csdn.net/snailbaby_soko/article/details/69524380 *本篇文章已授权微信公众号 guolin_blog &#xff08;郭霖&#xff09;独家发布 Android热更新方案Robust 相信很多人都认识了解过 热修复、热更新、热补丁(对于这个技术也没有特别标准的一种叫法…...

临沂网站建设费用/信息流广告公司一级代理

vs2017自安装以后就没怎么打开过&#xff0c;虽然12出的时候用10&#xff0c;15出的时候用13&#xff0c;17出的时候用15&#xff0c;但我依然坚持不用也装上再说的理念。 1、vs2017开发IOS和Android安装所必不可少的&#xff0c;uwp和net core也顺便装了吧&#xff0c;作为一个…...

公司注册网站诈骗莫名被起诉/友情链接只有链接

在对一个简单的Hello World工程进行项目结构剖析后&#xff0c;我们接着来学习下一个Android应用程序的生命周期是怎么样的&#xff0c;以便为后面的开发有个垫下良好的基石~ 所谓的应用程序生命周期无非就是应用程序进程从创建到消亡的整个过程。但是&#xff0c;之所有将这一…...