目录
4、MySQL知道什么函数,如order by,count()
8、String是Java的基本数据类型吗,String有什么方法
1、http和https区别
HTTP(HyperText Transfer Protocol:超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议。 简单来说就是一种发布和接收 HTML 页面的方法,被用于在 Web 浏览器和网站服务器之间传递信息。
HTTP 默认工作在 TCP 协议 80 端口,用户访问网站 http:// 打头的都是标准 HTTP 服务。
HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。
HTTPS(Hypertext Transfer Protocol Secure:超文本传输安全协议)是一种透过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。
HTTPS 默认工作在 TCP 协议443端口,它的工作流程一般如以下方式:
- 1、TCP 三次同步握手
- 2、客户端验证服务器数字证书
- 3、DH 算法协商对称加密算法的密钥、hash 算法的密钥
- 4、SSL 安全加密隧道协商完成
- 5、网页以加密的方式传输,用协商的对称加密算法和密钥加密,保证数据机密性;用协商的hash算法进行数据完整性保护,保证数据不被篡改。
HTTP 与 HTTPS 区别
- HTTP 明文传输,数据都是未加密的,安全性较差,HTTPS(SSL+HTTP) 数据传输过程是加密的,安全性较好。
- 使用 HTTPS 协议需要到 CA(Certificate Authority,数字证书认证机构) 申请证书,一般免费证书较少,因而需要一定费用。证书颁发机构如:Symantec、Comodo、GoDaddy 和 GlobalSign 等。
- HTTP 页面响应速度比 HTTPS 快,主要是因为 HTTP 使用 TCP 三次握手建立连接,客户端和服务器需要交换 3 个包,而 HTTPS除了 TCP 的三个包,还要加上 ssl 握手需要的 9 个包,所以一共是 12 个包。
- http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
- HTTPS 其实就是建构在 SSL/TLS 之上的 HTTP 协议,所以,要比较 HTTPS 比 HTTP 要更耗费服务器资源。
2、http请求消息和响应消息的格式
HTTP请求消息和响应消息的格式是HTTP协议中重要的组成部分,它们定义了客户端和服务器之间如何进行通信。
HTTP请求消息格式
HTTP请求消息由请求行、请求头部、空行和请求正文四个部分组成。
- 请求行:包括请求方法、请求的URL和HTTP协议版本。请求方法常见的有GET、POST、PUT、DELETE等。例如,
GET /index.html HTTP/1.1
表示一个使用GET方法请求/index.html
页面的HTTP/1.1请求。 - 请求头部:包含了一些附加信息,如浏览器类型、请求来源、请求时间等。这些信息以键值对的形式存在,每行一个键值对,键值对之间用冒号分隔。例如,
User-Agent: Mozilla/5.0
表示用户代理信息。 - 空行:用于分隔请求头部和请求正文。如果请求没有正文,空行也是必需的。
- 请求正文:可选部分,包含发送给服务器的数据。在POST或PUT请求中,通常会有请求正文。
HTTP响应消息格式
HTTP响应消息由状态行、响应头部、空行和响应正文四个部分组成。
- 状态行:包括HTTP协议版本、状态码和状态描述。状态码用于表示请求的处理结果,如200表示成功,404表示未找到页面等。例如,
HTTP/1.1 200 OK
表示一个HTTP/1.1协议的成功响应。 - 响应头部:类似于请求头部,包含了一些附加信息,如服务器类型、内容类型、内容长度等。
- 空行:用于分隔响应头部和响应正文。
- 响应正文:服务器返回给客户端的数据,可能是HTML页面、图片、视频等。
总结来说,HTTP请求消息和响应消息都遵循一定的格式规范,通过请求行、请求/响应头部、空行和请求/响应正文这几个部分,实现了客户端和服务器之间的通信和数据交换。
3、在浏览器中输入url地址,会发生什么
4、MySQL知道什么函数,如order by,count()
5、进程和线程
6、用的什么语言
7、==和equals()区别
8、String是Java的基本数据类型吗,String有什么方法
10、知道安卓的组件吗(不知道
11、测试流程
12、实习期间遇到印象最深的bug
13、怎么测试前后端
14、UI自动化测试三种等待方式
15、tcp的三次握手
首先,简要介绍TCP(传输控制协议)的作用:TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
接着,详细解释三次握手的过程:
第一次握手:客户端发送一个SYN包(同步序列编号)到服务器,并进入SYN_SEND状态,等待服务器确认。SYN包中包含了客户端的初始序列号。
第二次握手:服务器收到SYN包,必须确认客户的SYN(ACK=客户序列号+1),同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN_RECV状态。
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ACK=服务器序列号+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
在解释过程中,可以强调三次握手的重要性,它确保了客户端和服务器之间的连接是可靠和安全的。同时,也可以提及三次握手过程中可能遇到的情况,如丢包、超时等,以及TCP协议如何处理这些情况。
最后,可以总结TCP三次握手的作用和意义:它确保了数据包的可靠传输,避免了因网络不稳定或其他因素导致的数据丢失或重复发送等问题。同时,通过三次握手建立的连接是双向的,客户端和服务器都可以在这个连接上进行数据的发送和接收。
16、Tcp和udp的区别
TCP(传输控制协议)和UDP(用户数据报协议)是计算机网络传输层中的两个重要协议,它们之间主要存在以下区别:
连接性:TCP是一种面向连接的协议,它要求在数据传输之前先建立一个连接。这个连接建立过程通常被称为“三次握手”。而UDP则是一种无连接的协议,发送方不需要提前与接收方建立连接,可以直接向接收方发送数据。
可靠性:TCP对数据的可靠性要求非常严格。它使用确认和重传机制来确保数据的完整性和正确性。如果数据在传输过程中丢失或损坏,TCP会进行重传。相比之下,UDP对数据的可靠性要求较低,它不提供确认、重传和流量控制机制。如果数据丢失或损坏,UDP不会进行重传。
速度和效率:由于TCP需要建立连接和使用确认重传机制,因此它通常比UDP的速度更慢。UDP没有连接建立和确认重传的开销,因此在数据传输速度方面通常比TCP更快。此外,当网络拥堵时,TCP的拥塞控制机制会导致传输速度进一步下降,而UDP则不受此限制。
数据包大小:TCP将数据划分为较小的数据包进行传输,并根据网络状况进行调整。它没有固定的数据报大小限制。而UDP允许发送方一次性将多个数据包打包成一个较大的数据报进行传输,数据报的大小通常是在应用层自行决定的。
适用场景:TCP因其可靠性高的特点,主要适用于对数据可靠性要求较高的应用场景,如文件传输、电子邮件和网页浏览。而UDP因其传输速度快的特点,更适用于对通信速度要求较高的场景,如视频、音频、直播等。
17、python浅拷贝与深拷贝
浅拷贝(Shallow Copy)
浅拷贝会创建新的对象,这个对象有着原始对象中的一些对象引用,而不是原始对象本身的副本。也就是说,对于原始对象中的可变对象(如列表、字典等),浅拷贝只会拷贝其引用,而不会拷贝对象本身。因此,如果修改了原始对象中的可变对象,那么浅拷贝的对象也会受到影响。
在Python中,可以使用copy模块的copy()函数或切片操作来进行浅拷贝。
示例:
python复制代码
import copy | |
original_list = [1, 2, [3, 4]] | |
shallow_copy_list = copy.copy(original_list) | |
# 修改原始列表中的可变对象 | |
original_list[2].append(5) | |
print(original_list) # 输出: [1, 2, [3, 4, 5]] | |
print(shallow_copy_list) # 输出: [1, 2, [3, 4, 5]] |
在这个例子中,我们可以看到,当修改原始列表中的可变对象时,浅拷贝的列表也受到了影响。
深拷贝(Deep Copy)
深拷贝会递归地复制原始对象中的所有对象,包括对象中的可变对象。这意味着,对于原始对象中的任何可变对象,深拷贝都会创建一个新的对象副本,而不是仅仅复制其引用。因此,修改原始对象中的可变对象不会影响深拷贝的对象。
在Python中,可以使用copy模块的deepcopy()函数来进行深拷贝。
示例:
python复制代码
import copy | |
original_list = [1, 2, [3, 4]] | |
deep_copy_list = copy.deepcopy(original_list) | |
# 修改原始列表中的可变对象 | |
original_list[2].append(5) | |
print(original_list) # 输出: [1, 2, [3, 4, 5]] | |
print(deep_copy_list) # 输出: [1, 2, [3, 4]] |
在这个例子中,我们可以看到,即使修改了原始列表中的可变对象,深拷贝的列表也没有受到影响。
总结
- 浅拷贝只复制对象本身和其包含的不可变对象的引用,对于可变对象,则复制其引用但不复制引用的对象。因此,修改原始对象中的可变对象会影响浅拷贝的对象。
- 深拷贝会递归地复制对象本身及其包含的所有对象,包括可变对象。因此,修改原始对象中的任何对象都不会影响深拷贝的对象。
在选择使用浅拷贝还是深拷贝时,应根据具体需求和场景来判断。如果只需要复制对象本身和不可变对象,且不需要担心修改原始对象中的可变对象,那么可以使用浅拷贝。如果需要完全独立地复制对象及其包含的所有对象,那么应该使用深拷贝。
18、装饰器是什么/作用
19、linux命令
20、什么选择软件测试这个行业
我认为软件测试行业有着广阔的职业发展空间,而且无论什么语言开发的,都需要测试之后才能上线,加上我在校的时候接触测试比较多,对这方面了解比较多。
35. 测试一下微信支付功能
身份:支付者、收款者
条件:二维码实时刷新、绑定扫码人的账号ID、实时性
功能:扫码支付、商家收款码收款、展示支付成功界面、唯一性、完整性、原子性、顺序、金额、数字键盘弹出、中断事件、断电、断网、进度保存、金额限制、支付顺序、账户扣款、实时性
其他方面:性能、兼容性、易用性、可靠性、安全性、可维护、可移植性等
-
21、DNS域名解析的具体过程
-
22、本地DNS在哪里查询
-
23、知道DNS攻击吗
-
24、get和post区别
-
25、get和post发送请求时在tcp层面有什么不同
-
26、进程和线程
-
27、进程间如何通信
-
28、平衡二叉树
-
29、哈希冲突
-
30、list和tuple区别
-
31、 压力测试咋做的?
先需求分析-找QPS高的接口,制定测试计划-啥时候测,写测试用例-衡量测试预期,写脚本-用JMeter,选定接口、加线程组、多少个线程、每个线程每秒请求几次,进行测试-执行脚本,看报告-是否符合预期,分析原因-为啥不符合,改进接口资源-重新测试
需求分析:确定测试的目的、范围和重点。 - 制定测试计划:包括测试的时间、资源、环境等安排。
- 编写测试用例:根据需求和接口特点编写测试用例,包括预期结果和执行步骤。
- 编写测试脚本:使用压力测试工具如 JMeter 编写测试脚本,设置线程组、请求频率等参数。36、执行测试:运行测试脚本,生成测试报告。
- 分析报告:分析测试报告,查看接口性能是否符合预期。
- 改进接口资源:根据分析结果优化接口或增加资源。
- 重新测试:重新执行测试,验证改进效果。
-
-
32、测试脚本要注意哪些内容?
-
- 确保脚本能够覆盖到所有需要测试的接口和场景。
- 设置合理的并发线程数和请求频率,模拟真实的用户行为。
- 编写脚本时考虑到参数化,使得可以灵活地修改请求参数。
- 处理好脚本中的异常情况,如请求超时、服务器错误等。
- 定期更新脚本,适应接口和系统的变化。
-
33、 覆盖率是算的增量还是全量?
-
覆盖率可以是增量的,也可以是全量的。增量覆盖率是指新增的代码或功能被测试覆盖的程度;全量覆盖率是指整个代码或功能的测试覆盖程度。
34. 测试覆盖率如何保障?
- 编写充分的测试用例:编写能够覆盖各种情况和分支的测试用例,包括正常情况、边界情况和异常情况。
- 使用测试覆盖率工具:使用工具如JaCoCo(Java)、Coverage.py(Python)等来分析代码覆盖情况,查看哪些代码行被测试覆盖到了,哪些没有覆盖到。
- 定期执行测试:定期执行测试用例,并分析测试覆盖率报告,确保代码得到充分覆盖。
- 持续集成:将测试集成到持续集成流程中,每次代码提交都自动运行测试用例,并生成测试覆盖率报告。
- 代码审查:进行代码审查,检查代码是否充分测试覆盖,是否存在遗漏的测试场景。
- 测试策略优化:根据测试覆盖率报告的反馈,优化测试策略,增加测试用例覆盖不足的部分。