1. 接上回
我们接着上次的内容继续来整理与解析一些比较高频的测试行业面试题,大家可以通过面试题内的一些解析再结合自己的真实工作经验来进行答题思路的提取、整理。友情提示:硬背答案虽可,但容易翻车哦。
2. 题目解析
2.1 请说说进程与线程之间的区别?
出场率非常高的一题,作为测开面试中经常能碰到的经典问题,我们也可以从多个角度来进行回答。进程是OS中一个独立执行的单位,每个进程都有自己的独立内存空间、程序计数器、寄存器集合等,它们不共享这些资源;而线程则是在进程内部的更小的执行单元,共享同一进程的内存空间和资源。因为这题的出现频率太高了,建议在回答中加一些自己的理解,将自己当作一个授业者来对面试官进行讲解,这样既可以表现自己的专业度,也可以让其看到你在工作对于专业知识也是有着自己独特的理解。这里使用举例的方式就比较加分,比如进程就像在不同的电脑上同时运行不同程序的不同用户。每个进程都有自己的空间,可以独立运行,就像每个人有自己的房间。这些进程之间相互独立,一个崩溃不会影响其他进程。但是,不同进程之间的通信需要一些特殊的机制,就像不同房间的人需要通过门或电话来交流;而线程就像在同一台电脑上的不同任务,但是它们共享同一块内存。就像一个人同时在做多个任务,线程可以共享数据和资源,因此它们之间的通信更容易。但是,如果一个线程崩溃,可能会影响其他线程,就像一个人的一个任务出了问题,可能会影响其他任务。
2.2 请说说什么是进程安全,你在开发中会用哪些方法确保进程安全?
在日常的测开工作中,很难不碰到多进程开发的问题,所以在这个问题中我们需要着重的阐述进程安全在开发中的重要意义与确保手段的。我们要知道在开发过程中,存在多线程或多进程的场景,如果不加以控制,多个线程或进程可能会同时访问和修改共享的数据或资源,导致不可预测的行为和错误。而进程安全的目标是确保在这种并发情况下,系统的行为仍然是可预测的、正确的和稳定的。那么常见的进程安全问题包括数据竞争和资源竞争。数据竞争发生在多个线程或进程同时尝试访问和修改相同的内存位置时,可能导致数据损坏或不一致。资源竞争涉及到多个线程或进程争夺有限资源,如文件、网络连接或锁,如果不加以正确的同步和管理,可能导致死锁或资源泄漏而针对这样的情况。正因如此,我们在开发的过程中就需要加入一些方法来确保代码的进程安全,同步机制就是一种非常好的选择,比如如互斥锁、信号量和条件变量等方法来控制对共享资源的访问。这些都可以确保只有一个线程或进程可以访问共享资源,从而避免竞争条件和数据损坏。
2.3 请解释一下Redis集群选举master的大致过程?
Redis相信大家都不陌生,那么能用到redis集群的业务在目前来看也是相当的多,主要还是看所在行业的具体业务,但是既然用到了集群那么也就不能不了解一下其中的一些自动机制。当redis开启集群模式之后就可以通过它来提升可用性与性能,而在集群会都会有一个主节点与多个从节点,主节点一般负责写入操作,从节点用户读取与备份。大致的选举流程如下:当一个Redis集群启动或一个新节点加入集群时,节点会通过广播消息来通知其他节点它的存在。其他节点接收到这个消息后,会对新节点进行验证;当一个Redis集群启动或一个新节点加入集群时,节点会通过广播消息来通知其他节点它的存在。其他节点接收到这个消息后,会对新节点进行验证;如果新节点通过验证,它将发送一个请求,要求成为主节点。其他节点会投票决定是否接受它为主节点。一般来说,需要得到超过一半的投票;如果新节点获得足够的选票,它将被选举为主节点。在此之后,从节点将开始复制主节点的数据,以确保数据的一致性。
2.4 请介绍一下MySQL中的事务隔离级别?
高频,这个就不用太多的铺垫了,平时如果有好好准备或者日常实践的话应该不是问题。READ UNCOMMITTED:最低的隔离级别。一个事务可以读取到另一个事务尚未提交的数据,可能会看到脏读和不可重复读问题。一般不建议使用,隔离性较差;READ COMMITTED:默认的隔离级别。一个事务只能读取到已经提交的数据,避免了脏读,但仍可能会出现不可重复读的问题。大多数情况下,这个级别已经提供了足够的隔离性;REPEATABLE READ:事务开始后,它可以多次读取相同的数据,不会受到其他事务的干扰。这解决了不可重复读的问题,但仍可能出现幻读问题,即一个事务在读取一系列记录时,另一个事务插入了新的记录;SERIALIZABLE:最高隔离级别,确保了事务之间的完全隔离。所有事务串行执行,不会出现脏读、不可重复读和幻读的问题。然而,它的性能开销最大,通常只在需要强制隔离的情况下使用。
2.5 请介绍一下抽象类是什么,工作中是如何实现的?
很基础的一题,做过面向对象开发的应该都知道。它其实就是一种特殊的类,无法被实例化。抽象类可以包含抽象方法,这些方法没有具体的实现,只有方法的声明。子类必须实现这些抽象方法;抽象类也可以包含非抽象方法,这些方法有具体的实现。子类可以选择性地重写这些方法;抽象类可以与多态性结合使用,允许不同的子类实现相同的方法名,但具有不同的实际行为。在日常工作中这个就需要考验大家有没有细心的沉淀与打下良好的基础,基于上面的这些解释,那答案也就异常的明显了。我们一般会用以下这些方法来实现,定义一个抽象类,通过关键字"abstract"标记,包含抽象方法或非抽象方法;创建具体的子类,通过关键字"extends"继承抽象类;在子类中实现抽象方法,提供具体的实现;创建子类的对象,调用父类和子类中的方法,实现多态性和代码复用。
3. 后话
总体来说对于测试开发的面试内容,各个用人单位其实关注的除了相关的技术栈与项目经验之外,其实更需要的是测开人员自身对于项目业务与行业相关的整体解决的认知与思维,这点与软件开发人员的要求会有略微的不同,毕竟作为测试人员来说,整体把握软件质量保障情况是其中的重中之重。