1.上来先给我介绍了一下腾讯音乐不是腾讯
2.然后我的一个自我介绍
3.接着是让我介绍了我的项目,然后我一顿介绍大概介绍了有个十分钟
4.然后问我项目中的账号系统怎么测试?(我说了一通的笼统的测试流程,分析需求,找测试点…告诉我让我说具体点,我说了一些根据等价类边界值写测试用例)
5.堆和栈的区别(一时没想到数据结构层面的,太丢人了)
堆(Heap)和栈(Stack)是两种常见的数据结构,它们的区别如下:
存储方式:栈是后进先出(LIFO)的数据结构,而堆是一种完全二叉树,具有最大堆和最小堆两种形式。
内存管理:栈常用于程序调用栈和函数调用,用于管理函数调用和内存分配。堆通常用于动态内存分配。
速度:栈比堆的访问速度快,因为它是连续的内存空间。而堆需要遍历完全二叉树,才能访问到元素,速度较慢。
空间:栈通常在系统栈内存中分配,大小有限,不够用可能会导致栈溢出;堆通常在堆内存中分配,大小比较大,但是随着动态分配的元素数量增多,可能会导致内存泄漏。
6.问了一个场景题(视频网站的弹幕怎么测试,具体说说测试用例,一顿瞎说)
还是根据质量模型来,功能(多想几点)、性能、兼容性、易用性、安全性
以下是一些测试视频弹幕功能的常见用例:
基本功能测试:确保弹幕正常显示、隐藏、暂停和播放。
输入验证测试:确保不能输入非法字符、过长的弹幕等。
文本格式测试:确保弹幕显示正确,包括字体、颜色和大小。
多语言支持测试:确保弹幕支持多种语言,并且显示正确。
兼容性测试:确保弹幕在不同浏览器和设备上正常显示。
性能测试:确保弹幕的加载和显示速度正常,并且不会对视频播放造成影响。
用户权限测试:确保普通用户和管理员可以正常使用弹幕功能。
安全性测试:确保弹幕不会包含恶意代码,并且不会影响视频播放器和用户计算机的安全。
7.手撕一个字符串模拟十分简单的题
类似于展开字符串
输入ab2b2c3...
输出ababbbccc
8.一道智力题,给五分钟让说答案(不会做)
在A城市有4000斤草,有一辆马车,最大载重量1000斤,马车每走1公里,需要消耗掉1斤草,A城市距离B城市1000公里,问最多可运送多少斤草到B城市?
注意:马车无论往哪个方向走,每公里都固定消耗1斤草
9.我问他什么是系统测试,他一顿解释他们的业务
总共时长45分钟左右
十分钟,大家大量排队
自我介绍
项目,问我研究生做的,不让我说django,还问我python有什么优化
前一天我收到的邮件告诉我是下午三点,然后我迟到了十分钟
英文的自我介绍
介绍完问我了一些关于负载均衡的概念,因为我写了nginx,问了我怎么去做负载均衡的一些方法
问了一些操作系统的概念,并行并发的区别,多个线程的时候操作系统中的锁,如果没有申请到这个锁操作系统处于什么状态(操作系统基本不会)
问了一些深度学习的东西,做的项目中是否会衡量部署,轻量化和推理速度。了不了解分布式机器学习系统,他们结点之间的通信过程。(不会)
(
并行和并发是两个常见的并发编程概念,它们都涉及到多个任务同时执行的情况,但是它们的含义是不同的:
并行:指多个任务同时执行的情况。在并行执行中,多个任务可以同时执行,从而提高了系统的处理能力和效率。例如,多核CPU可以同时执行多个任务,这就是并行执行。
并发:指多个任务交替执行的情况。在并发执行中,多个任务交替执行,从而使得多个任务看起来是同时执行的。例如,在单核CPU上,多个线程可以通过时间片轮转的方式交替执行,从而实现并发执行。
因此,可以看出并行和并发的区别在于是否真正实现了同时执行。并行指的是真正同时执行多个任务,而并发指的是多个任务交替执行的情况,看起来像是同时执行。
在实际的应用中,通常需要根据具体的场景来选择并行和并发的方式。如果需要处理大量数据或执行大量计算密集型任务,可以考虑使用并行方式来提高处理效率。而如果需要处理大量的IO操作或交互式任务,可以考虑使用并发方式来提高响应速度和用户体验。
)
自我介绍
问了一些项目有关的东西,但是没让介绍项目,问了一些接口测试的过程,我说用了postman
出了一道接口测试的情景题,有道具id, 道具数num,和一些条件(id, num, 条件),对这个接口你去怎么写用例。(有点懵)
我记得还有一道情景题,忘了
一道手撕,有一些日志文件,包含一些字段,比如日期,时间,报错字段(error/warning),进程名,报错行数…
让挑出来, 报error的这些文件,但是要去重,首先要划分一些不关键字段,比如时间,不管什么时间报相同的error的错就是重复的问题。
实现的时候让我抽象成str数组
之后问了问匹配模块的情况,问我匹配模块怎么样去测。
总共大概问了有三道测试的情景题。
先给四十分钟写两道题
一道是最长不重复子串,用的滑动窗口
def lengthOfLongestSubstring(self, s: str) -> int:
max_len, hashtable = 0, {}
start = 0
for end in range(len(s)):
hashtable[s[end]] = hashtable.get(s[end], 0) + 1
if end - start + 1 == len(hashtable):
max_len = max(end - start + 1, max_len)
while len(hashtable) < end - start + 1:
hashtable[s[start]] -= 1
if hashtable[s[start]] == 0: del hashtable[s[start]]
start += 1
return max_len
一道是63.不同路径2
然后做了自我介绍,问了本科阶段写的两个项目,以及着重问了一下django写的游戏,怎么实现的同步事件来模拟多人联机对战,项目中哪些用到redis了以及常见的数据结构,
为什么要用生产者消费者模式,
(
生产者消费者模式是一种常见的并发编程模式,主要用于解决生产者和消费者之间的协作问题。在该模式中,生产者负责生成数据,并将其放入共享缓冲区中,而消费者则从共享缓冲区中取出数据并进行处理。以下是一些使用生产者消费者模式的优点:
解耦:生产者和消费者之间是通过共享缓冲区进行通信的。这种解耦可以使生产者和消费者之间的耦合度更低,从而使系统更加灵活和可扩展。
并发处理:生产者和消费者可以并行运行,从而提高了系统的并发性和处理能力。在高并发的情况下,使用生产者消费者模式可以提高系统的吞吐量和性能。
缓冲区:共享缓冲区可以存储大量的数据,从而使系统更加高效。通过使用缓冲区,可以减少生产者和消费者之间的等待时间,提高系统的响应速度。
异步处理:生产者和消费者之间是通过共享缓冲区进行通信的。这种异步处理可以使生产者和消费者之间的处理速度更加均衡,从而提高了系统的整体性能。
易于扩展:生产者和消费者模式是一种通用的编程模式,可以应用于许多不同的场景中。由于该模式的灵活性,可以轻松地添加新的生产者和消费者,从而提高了系统的可扩展性。
)
消息队列,消息队列怎么处理重复的请求
(
消息队列是一种常见的应用程序架构模式,用于异步处理消息。在消息队列中,生产者将消息发送到队列中,而消费者则从队列中接收消息并处理它们。由于某些原因(例如网络延迟、故障或系统故障),有时会出现重复的消息。以下是一些常见的处理重复消息的方法:
去重:在生产者端去重。当生产者发送消息时,可以检查此消息是否已经发送过。如果已经发送过,就不再发送,以确保重复消息不会进入队列。
消费端去重:在消费者端去重。当消费者从队列中接收到消息时,可以检查此消息是否已经处理过。如果已经处理过,则不再处理该消息,以确保重复消息不会影响系统的行为。
消息过期:可以给消息设置一个过期时间,当消息过期时,消费者不再处理该消息。这可以确保过期的重复消息不会对系统造成负面影响。
幂等性:在生产者和消费者中实现幂等性。幂等性是指在多次执行相同操作的情况下,结果相同的特性。在消息处理中,可以通过在生产者和消费者中实现幂等性来确保重复消息不会对系统造成负面影响。
人工处理:对于一些极少发生的情况,可以考虑手动处理重复消息。例如,当系统出现故障时,管理员可以手动清理队列中的重复消息。
)
然后问了测试自动贩卖机的支付功能怎么测
(
要测试自动贩卖机的支付功能,可以按照以下步骤进行:
功能测试:测试自动贩卖机的支付功能是否正常工作。测试人员可以尝试使用各种支付方式(例如现金、刷卡、移动支付等)进行支付,检查支付过程是否顺利,自动售货机是否正常发放商品,付款是否准确。
兼容性测试:测试自动贩卖机的支付功能在不同的支付方式、硬件设备(例如刷卡器、硬币器等)和操作系统上的兼容性。
安全测试:测试自动贩卖机的支付功能是否存在安全漏洞。测试人员可以尝试使用各种攻击手段,例如破解密码、非法支付等,以确保支付功能在安全性方面表现良好。
性能测试:测试自动贩卖机的支付功能在高负载和高并发情况下的性能表现。测试人员可以模拟多个用户同时使用自动贩卖机进行支付操作,检查支付过程的响应时间和准确性等性能指标。
用户体验测试:测试自动贩卖机的支付功能是否符合用户期望并提供良好的用户体验。测试人员可以模拟各种用户场景(例如新手用户、老年人、残障人士等)进行测试,以确保支付功能对所有用户都友好易用。
测试自动贩卖机的支付功能需要使用各种测试工具和设备,例如支付卡、移动设备等。在测试完成后,测试人员应该记录测试结果,并及时向开发人员反馈测试结果,以便开发人员进行问题修复和改进。
)
答案都是从chatgpt上搜的
没有手撕,对面噪音太大
首先是自我介绍,问了一些项目的问题,电能表以及我的django那个
问了我项目主要是图像算法的为什么要找测开,我说改写代码一小时改bug一整天
问了网络的tcp三次握手和四次挥手,为什么是三次和四次我一顿解释
问了问基础知识,排序算法有哪些,口撕一下快排,快排是稳定的吗
问了我python相关的基础知识,深拷贝浅拷贝,list和元祖(我把元组当集合了草,但是可变不可变说对了),__init__和__new__的区别
(
__new__方法是用于创建实例对象的,它是一个静态方法,第一个参数是类对象,而后面的参数是用于创建实例对象的参数,它的返回值必须是一个实例对象。在创建一个新的实例对象时,首先会调用__new__方法来创建实例对象,然后再调用__init__方法来初始化实例对象。
__init__方法是用于初始化实例对象的,它是一个实例方法,第一个参数是实例对象本身,而后面的参数是用于初始化实例对象的参数。在__new__方法返回实例对象后,Python 解释器会自动调用__init__方法来初始化实例对象的属性和方法。
因此,__new__方法和__init__方法的区别在于:
__new__方法是用于创建实例对象的,而__init__方法是用于初始化实例对象的。
__new__方法是一个静态方法,而__init__方法是一个实例方法。
__new__方法返回一个实例对象,而__init__方法不返回任何值,它只是用于初始化实例对象的属性和方法。
)
问了一个人脸识别软件的测试大纲
问了一个网页打开之后十秒还没出现内容,请分析一下原因
(
一个网页打开之后十秒还没出现内容,可能有以下几种原因:
网络连接问题:可能是网络连接不稳定,或者网速比较慢,导致浏览器无法及时获取到网页内容。可以尝试刷新网页或者重启网络设备,或者使用其他网络连接方式来测试。
服务器响应慢:可能是网站服务器响应速度比较慢,或者网站的流量比较大,导致浏览器无法及时获取到网页内容。可以等待一段时间后再尝试访问,或者使用其他浏览器或设备来测试。
浏览器缓存问题:可能是浏览器缓存导致的,如果之前访问过该网站,浏览器可能会缓存部分网页内容,导致第二次访问时出现问题。可以尝试清除浏览器缓存后再次访问网站。
网页代码问题:可能是网页代码中存在错误或者大量复杂的脚本,导致浏览器无法及时解析和加载网页内容。可以尝试使用其他浏览器或设备来测试,或者联系网站管理员解决问题。
综上所述,网页打开之后十秒还没出现内容,可能是多种原因造成的,需要根据具体情况进行排查和解决。
)
浑身软弱无力,寄寄寄要洗
先是自我介绍, 我的一些基本背景
对测试的理解,以及流程这些,如何掌握能力的一个具体措施(是不是测试就按照需求文档测就行了回答要有产品思维),问具体的产品思维或者这些能力你觉得怎么样掌握
问了我的django项目,一顿瞎几把介绍
问 websocket协议底层是基于什么协议的,
(
WebSocket 协议底层并不依赖于任何特定的传输层协议,它可以在多种传输层协议之上运行,包括但不限于 TCP、TLS 和 UDP。
在实践中,WebSocket 最常用的传输层协议是 TCP,因为它提供了可靠的、双向的、基于字节流的连接。WebSocket 建立在 TCP 连接之上,通过 HTTP 协议的升级机制进行握手,然后在保持连接的同时允许双向通信。
但是,WebSocket 也可以使用 TLS/SSL 进行加密和身份验证,并使用 UDP 进行高速传输和低延迟通信。这取决于具体应用场景和需求。
)
问nginx是只代理了前端么?就是问前端后端之间的请求是怎么样的。瞎几把解释,反向代理
(
Nginx 可以用于代理前端应用,但这并不是它的唯一用途。
在 Web 应用程序中,Nginx 可以用作反向代理服务器,将客户端的请求转发到不同的后端服务器。这些后端服务器可以是运行不同编程语言或框架的应用程序服务器、数据库服务器或其他服务。在这种情况下,Nginx 会在前端作为代理服务器,为客户端提供一个统一的入口点,从而实现负载均衡、缓存、安全性和可伸缩性等方面的优化。
此外,Nginx 还可以用于静态文件服务、加速器、反向 SSL 代理、HTTP 缓存和网络流媒体等领域。在这些方面,Nginx 提供了高性能、高可靠性和高灵活性,因此被广泛用于 Web 服务器、应用程序服务器和负载均衡器等角色。
)
mysql 查分数前三的学生信息,草 不会
[
Select name, score
From scores
Order by score DESC LIMIT 3
]
问 多线程的问题,多线程之间的通信,死锁等问题,我说我不会
[
在多线程编程中,线程之间需要进行通信,以便共享数据、协调工作和同步操作。常见的线程间通信方式包括:
锁机制:锁是一种同步机制,可以用于控制对共享资源的访问。例如,线程可以使用互斥锁(mutex)来保护对共享变量的访问,以避免多个线程同时修改变量造成的竞争条件(race condition)。
条件变量:条件变量是一种同步机制,可以用于线程之间的通信。线程可以使用条件变量来等待特定条件的发生,例如等待某个共享变量达到某个值。当条件满足时,条件变量可以通知等待的线程继续执行。
信号量:信号量是一种同步机制,用于控制对共享资源的访问。线程可以使用信号量来获取或释放资源,以确保资源被正确地共享和同步。
管道和队列:管道和队列是一种通信机制,用于在线程之间传递数据。线程可以将数据写入管道或队列,并由另一个线程读取。管道和队列可以保证数据的有序性和可靠性,避免数据竞争和死锁。
共享内存:共享内存是一种通信机制,可以用于在线程之间共享数据。线程可以将数据写入共享内存中,并由另一个线程读取。共享内存的优点是快速、高效,但需要特殊的同步机制来保证数据的一致性和安全性。
不同的线程间通信方式各有优缺点,开发者需要根据具体场景选择合适的方式。同时,线程间通信也需要注意避免死锁、数据竞争等问题。
]
[
死锁(Deadlock)是指两个或多个进程(线程)在执行过程中,因争夺资源而造成的一种僵局,它们中的每一个都在等待被其他进程所占用的资源而无法继续执行,导致所有进程都被阻塞,无法继续执行下去。
死锁通常发生在并发系统中,其中包含两个或多个线程、进程或其他执行实体,这些实体都在等待其他实体释放它们所占用的资源。如果没有外部干涉,这种状态可能会持续下去,导致整个系统无法继续运行。
死锁的原因通常是资源的互斥使用和循环等待。例如,当两个线程分别占用某个资源 A 和 B,并且互相等待对方释放资源时,就会发生死锁。如果出现多个线程之间的交叉等待,就可能导致死锁的发生。
为避免死锁,可以采用以下措施:
破坏互斥条件:例如,允许多个线程同时访问某些资源,而不是互斥访问。
破坏占有和等待条件:例如,线程在申请资源之前先释放自己已经持有的资源,避免资源之间出现循环等待。
破坏不可抢占条件:例如,允许操作系统强制撤销某些线程的资源占用权。
破坏循环等待条件:例如,对资源进行编号,规定线程只能按编号顺序访问资源,避免出现循环等待。
以上措施称为避免死锁的四个条件。在实际编程中,开发者需要根据具体场景选择合适的措施来避免死锁的发生。
]
问了一个场景题,一个中控控制两部电梯的情景应该怎么规划测试用例
全程我的网络断了很多次,面试官的态度非常好,还给我抱歉…
自我介绍
问了一些毕业时间的问题
介绍一下项目,简单介绍一下项目模块和为什么要用这些技术
项目中做的不完善的地方,和项目中觉得做的可以的地方
如果项目需要商业化,还需要做哪些改进
你对测试的知识了解吗
反问环节
确认登录页面:确保在正确的页面上进行登录测试,并检查是否存在用户名和密码输入框。
验证用户信息输入:在输入用户名和密码之前,先确保光标是否在用户名输入框中。然后在用户名和密码框中输入正确的信息,确保输入框的输入字符数目是否符合要求。
验证登录:在输入完正确的用户名和密码后,点击“登录”按钮,检查系统是否接受并验证这些信息,并成功登录到系统中。
验证错误输入:在用户名和密码输入框中分别输入错误的信息,然后点击“登录”按钮,确保系统能够正确处理这些错误并给出相应的提示信息。
验证记住我功能:选中“记住我”功能,然后注销登录。再次登录时,确保系统能够自动填写先前的用户名和密码。
验证退出登录:在成功登录后,点击“退出登录”按钮,确保系统能够安全退出,并且不会让用户保留登录状态。
验证账户锁定:尝试多次使用无效的用户名和密码进行登录,确保系统能够在一定次数后锁定账户并提示相应的信息。
验证重置密码:在忘记密码或需要重置密码的情况下,尝试使用“忘记密码”或“重置密码”功能,确保系统能够安全、及时地重置密码并通知用户。
import time
def collect_time(func):
def wrapper(*args,**kwargs):
start = time.time()
res = func(*args,**kwargs)
end = time.time()
print(f"{func.__name__} took {end-start} seconds")
return res
return wrapper
@collect_time