下面是我在实习中协助面试 然后在牛客上挑选了一些完整的面试问题借助豆包完成的面经答案思路汇总
快手(测试开发,一面)
作者:@露西范皮尔特
- 实验室项目:大概问了问方向
- 测试项目:TestNG如何实现Case
- 如果每个Case前都需要关闭浏览器的话,怎么做(我说加标签,但是面试官说能不能不在代码中显示,我:???)
- 分层设计的好处,每层的具体内容
- 登录功能的具体实现,如何验证成功
- 用Jenkins完成了哪些工作
- 八股部分:多线程的创建方法
- 线程池的好处
- 核心线程和最大线程的区别
- 添加线程,核心线程未占满,会创建新的线程吗(我说不会,但是面试官让我下去再想想)
- 饱和策略
- CPU密集型任务如何设计线程池的核心线程
- MySQL索引知道哪些(我说了B+树那些,面试官说不是指底层,然后我说了聚簇索引二级索引,还有唯一主键这些)
- 索引是不是越多越好
- 查询慢可能是什么原因
- 测试场景题:一张大表为了优化划分为多个小表,怎么测试小表
- 手撕代码:合并两个有序数组
- 一些聊天:你觉得自己做测开有什么优势;互联网测试和通信测试的区别
- 反问:开发部分做什么工作,会有纯测试的岗位吗。
快手(测试开发,二面)
作者:@露西范皮尔特
- 八股部分:JVM内存模型;
- 垃圾回收的机制;
- 进入老年代的阈值;
- JVM的可调整的参数;
- server参数;
- 垃圾收集器有哪些,以及gc方式;
- gc调优的工具
- JUC中的类有哪些
- ReentryLock优于sychronized的地方
- 场景题目如何实现,用什么类;场景:五个人并发买票,结束后通知。(考了信号量机制,但是不知道用啥类,对AQS不是很熟)
- Linux用什么杀死进程
- Kill命令的参数(我只知道9)
- Kill本质是什么(不知道)
- 测试项目部分:项目怎么实现;
- 运用到selenium的什么接口;
- 元素定位的方法;
- 如何采用配置文件,为什么要用配置文件;
- 测试场景题部分:对上一面的手撕代码进行测试用例编写;
- 聊天部分:最近看了什么书学了什么;(我说看看测试的书,了解一些测试方法,比如黑盒白盒)
- 黑盒白盒的区别是什么,你更期待做哪个,你的未来规划;
- 反问:其实是面试官问我,juc jvm和测试项目关系不大,为什么还要学习这个。我说,我其实也想问问这个岗位对于这两部分的要求高吗,好像确实关系不大
- 接触到的面试框架在工作中实用吗;
- 一面中面试官提到的不用代码如何统一各个case的执行前的状态,面试官说可以用一下配置文件(下次再问就这么答)。
快手(测试开发,三面)
作者:@露西范皮尔特
- 项目相关问题:登录模块测试用例;
- 异常用例补充;
- 项目中遇到问题,你觉得本质是什么;
- 对于项目当初有没有没有考虑过的问题;
- 除了功能测试还有其他测试方面吗?(我说了性能 追问并发测试)
- 场景题:开发角度考虑一下购买的系统设计;
- 开发角度考虑购物系统的容错设计;
- 聊天:测试工作对开发工作的启发;
- 有没有应聘别的单位,目前流程;
- 选择工作时考虑的问题(我:岗位,公司平台,城市。我:城市喜欢杭州;面试官:我们在北京。直接凉!然后就是长达几分钟的疯狂找补)
- 反问:测开语言;
- 主要业务;(为啥我投的杭州现在你们在北京,然后我再找补几句。。。)
滴滴(自动驾驶测开,一面)
作者:@蔓越莓在星空岛弹钢琴
- 自我介绍一下
- 看你简历做了很多竞赛,简单拿一个比赛介绍一下吧
- 说一下进程和线程的区别
- 进程之间的通讯方法有哪些
- 堆和栈的区别
- 了解计算机网络吗
- 简单说一下五层模型
- 网络层和传输层区别
- TCP工作在哪一层
- 了解TCP的三次握手四次挥手吗(举了打电话的例子)
- 为什么不能两次握手呢,为什么要多挥手四次呢
- 简单介绍一下项目吧(大创的)
- stm32是用的哪个型号的?
- 它的处理内核是什么?
- 你在项目中用到了stm32的哪些通信协议?
- 用到了哪些传感器,传感器型号是什么?
- 反问
滴滴(自动驾驶测开,二面)
作者:@蔓越莓在星空岛弹钢琴
- 简单自我介绍一下
- 重点介绍一下项目实习吧,实习过程中做了什么
- 了解哪些操作系统
- 实习怎么进行测试的
- 在开发安卓软件过程中主要是兼容性测试吗
- 了解虚拟机吗
- 开发APP过程中有没有在虚拟机上进行测试过?
- 虚拟机和真机会有哪些问题
- 虚拟机上虚拟IP地址,网络情况,设备分辨率兼容性
- 如何抓包确定是哪个设备(可以根据Mac地址)
- 怎么确定机型是iPhone或者安卓的小米OPPO这种
- apk文件的头文件信息里包含
- 假设现在有很多机型需要测试,项目打包下载到真机时间很长,如何
- 保证用虚拟机测试的质量?(制定测试策略,分清轻重缓急,首要功能先测)
- 手撕代码:二叉树路径规划,计算任意两个二叉树结点的公共子节点
- 对自动驾驶技术有什么看法?
- 了解哪些自动驾驶技术
- 对自动驾驶的技术了解
- 实验室主要研究方向是什么(答雷达激光雷达)
- 现在做了哪些和自动驾驶有关的东西吗
- 激光雷达和计算机视觉区别是什么
- 你还有什么要问我的?
滴滴(自动驾驶测开,三面)
作者:@蔓越莓在星空岛弹钢琴
- 自我介绍
- 对自动驾驶看法
- 有驾照吗
- 开过车吗
- 设计自动驾驶测试用例怎么去设计
- 从哪些角度考虑
- 根据等价类原则怎么设计
- 了解哪些编程语言
- 平时怎么去学习
- 实体书籍会看吗
- 未来职业生涯规划
美团(测试开发, 一面)
作者:@wang1999
- linux常用命令并解释
- java多线程的实现方式
- 四种访问修饰符
- 索引的概念,优劣和使用注意
- 对测开的了解
- 数据库查询的左外连接,分组,排序(手写)
- 合并有序数组(手写)
- 负载均衡的实现方式
- MQ使用在哪个功能上
- redis怎么使用的
- 限流熔断
- 反问
美团(测试开发, 二面)
作者:@wang1999
- 介绍科研课题
- 介绍研究方法
- 领域内的顶刊,当前研究方向
- 论文创新点
- 依次问项目难点,亮点,以及不足
美团(测试开发, HR面)
作者:@wang1999
- 职业规划测开的认识
- 对互联网企业,传统企业,新兴企业的看法,更愿意加入哪个类型
- 项目背景、亮点、难点
- 家乡
- base
- 薪资期望
- 目前offer情况
- 反问
好的,以下是针对你提供的面试题目,面向校招面试的详细答案输出。这些答案会尽量简洁明了,同时涵盖关键知识点,帮助你在面试中更好地展示自己的能力。
1. TestNG如何实现每个Case前都关闭浏览器?(面试官要求不在代码中显示)
答案:可以使用TestNG的监听器(Listener)机制来实现。具体来说,可以实现ITestListener
接口,在onTestStart
方法中关闭浏览器。这样,每个测试用例开始前都会自动触发关闭浏览器的操作,而不需要在每个测试用例代码中显式调用。
- Plain Text
- C++
- Java
- C
- Python2
- Python3
- Pypy2
- Pypy3
- JavaScript
- PHP
- C#
- R
- Go
- Ruby
- Rust
- Bash
- Shell
- CSS
- HTML
- XML
- ASP/VB
- Perl
- Swift
- Objective-C
- Pascal
- MATLAB
- Scala
- Kotlin
- Groovy
- Typescript
- SQL
- MySQL
- Oracle
- SQLite
- Scheme
- TCL
复制
删除
xxxxxxxxxx
20
1
import org.testng.ITestListener;
2
import org.testng.ITestResult;
3
import org.openqa.selenium.WebDriver;
4
5
public class CustomListener implements ITestListener {
6
private WebDriver driver;
7
8
@Override
9
public void onTestStart(ITestResult result) {
10
// 在每个测试用例开始前关闭浏览器
11
if (driver != null) {
12
driver.quit();
13
}
14
// 初始化浏览器(根据需要)
15
driver = new WebDriver(); // 示例代码,根据实际情况初始化
16
}
17
18
// 其他方法可以留空或根据需要实现
19
}
20
在testng.xml
中注册这个监听器:
- Plain Text
- C++
- Java
- C
- Python2
- Python3
- Pypy2
- Pypy3
- JavaScript
- PHP
- C#
- R
- Go
- Ruby
- Rust
- Bash
- Shell
- CSS
- HTML
- XML
- ASP/VB
- Perl
- Swift
- Objective-C
- Pascal
- MATLAB
- Scala
- Kotlin
- Groovy
- Typescript
- SQL
- MySQL
- Oracle
- SQLite
- Scheme
- TCL
复制
删除
xxxxxxxxxx
12
1
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
2
<suite name="TestSuite">
3
<listeners>
4
<listener class-name="com.example.CustomListener"/>
5
</listeners>
6
<test name="Test1">
7
<classes>
8
<class name="com.example.TestClass"/>
9
</classes>
10
</test>
11
</suite>
12
2. 分层设计的好处,每层的具体内容
答案:分层设计是一种常见的软件架构设计方法,其主要好处包括:
- 解耦:各层之间职责明确,相互独立,便于维护和扩展。
- 可复用性:每一层可以独立开发和复用,减少重复代码。
- 可测试性:每一层可以独立进行单元测试,提高测试效率。
- 可维护性:代码结构清晰,便于理解和维护。
常见的分层设计包括以下几层:
- 控制层(Controller):负责接收用户请求,调用服务层处理业务逻辑,返回结果给用户。
- 服务层(Service):核心业务逻辑处理层,负责调用数据访问层获取数据,并进行业务逻辑处理。
- 数据访问层(DAO):负责与数据库交互,封装数据访问逻辑,提供数据操作接口。
- 实体层(Entity/Model):定义数据模型,通常对应数据库表结构。
3. 登录功能的具体实现,如何验证成功
答案:登录功能的实现通常包括以下几个步骤:
- 前端:用户输入用户名和密码,点击登录按钮。
- 后端: 接收用户输入的用户名和密码。验证用户名和密码是否正确(通常与数据库中存储的用户信息对比)。如果验证成功,生成一个会话标识(如Token或Session ID),返回给前端。如果验证失败,返回错误信息。
验证登录成功的方法:
- 状态码:返回HTTP状态码200表示成功。
- 返回数据:返回包含用户信息和Token的JSON对象。
- 页面跳转:前端根据返回结果跳转到指定页面。
测试验证:
- 正向测试:输入正确的用户名和密码,验证是否跳转到首页。
- 反向测试:输入错误的用户名或密码,验证是否提示错误信息。
4. 用Jenkins完成了哪些工作
答案:Jenkins是一个持续集成和持续部署(CI/CD)工具,可以完成以下工作:
- 代码构建:从版本控制系统(如Git)拉取代码,执行编译和打包。
- 自动化测试:运行单元测试、集成测试和自动化测试脚本,生成测试报告。
- 代码质量检查:使用工具(如SonarQube)检查代码质量,生成质量报告。
- 部署:将构建好的应用部署到开发环境、测试环境或生产环境。
- 通知:在构建成功或失败时,发送通知给开发团队(如邮件、Slack消息)。
5. 多线程的创建方法
答案:Java中创建多线程有以下几种方法:
- 继承Thread类:
- 实现Runnable接口:
- 实现Callable接口(支持返回值和异常处理):
- 使用线程池:通过
ExecutorService
创建线程池,复用线程。
6. 线程池的好处
答案:线程池的好处包括:
- 资源复用:减少线程创建和销毁的开销。
- 提高响应速度:线程池中的线程可以复用,减少等待时间。
- 控制线程数量:避免系统因创建过多线程而耗尽资源。
- 线程管理:提供线程管理功能,如任务队列、线程存活时间等。
7. 核心线程和最大线程的区别
答案:
- 核心线程(corePoolSize):线程池在初始化时创建的线程数量。这些线程会一直存活,即使没有任务也会保留。
- 最大线程(maximumPoolSize):线程池中允许的最大线程数量。当任务队列满了且核心线程也满了时,线程池会创建新的线程,直到达到最大线程数。
8. 添加线程,核心线程未占满,会创建新的线程吗?
答案:不会。只有当核心线程被占满且任务队列也满了时,线程池才会创建新的线程,直到达到最大线程数。
9. CPU密集型任务如何设计线程池的核心线程
答案:对于CPU密集型任务,线程池的核心线程数通常设计为CPU核心数
。因为CPU密集型任务主要占用CPU资源,过多的线程会导致上下文切换增加开销,降低效率。
- Plain Text
- C++
- Java
- C
- Python2
- Python3
- Pypy2
- Pypy3
- JavaScript
- PHP
- C#
- R
- Go
- Ruby
- Rust
- Bash
- Shell
- CSS
- HTML
- XML
- ASP/VB
- Perl
- Swift
- Objective-C
- Pascal
- MATLAB
- Scala
- Kotlin
- Groovy
- Typescript
- SQL
- MySQL
- Oracle
- SQLite
- Scheme
- TCL
复制
删除
xxxxxxxxxx
9
1
int corePoolSize = Runtime.getRuntime().availableProcessors();
2
ExecutorService executor = new ThreadPoolExecutor(
3
corePoolSize,
4
corePoolSize,
5
0L,
6
TimeUnit.MILLISECONDS,
7
new LinkedBlockingQueue<>()
8
);
9
10. MySQL索引的类型和作用
答案:MySQL中常见的索引类型包括:
- B+树索引:默认的索引类型,适用于范围查询和精确查询。
- 聚簇索引:数据行存储在索引的叶子节点中,通常主键是聚簇索引。
- 二级索引:非聚簇索引,叶子节点存储的是主键值。
- 唯一索引:保证列值的唯一性。
- 全文索引:用于全文搜索。
索引的作用:
- 加快查询速度:通过索引快速定位数据。
- 保证数据唯一性:如主键和唯一索引。
- 优化排序和分组:索引可以加速
ORDER BY
和GROUP BY
操作。
11. 索引是不是越多越好?
答案:不是。索引虽然可以加快查询速度,但也会带来以下问题:
- 增加存储空间:索引需要额外的存储空间。
- 降低写操作性能:插入、更新和删除操作需要维护索引,增加开销。
- 维护成本:过多的索引会增加数据库的维护成本。
因此,索引的数量需要根据实际需求合理设计。
12. 查询慢可能是什么原因
答案:查询慢的原因可能包括:
- 缺少索引:查询列没有索引,导致全表扫描。
- 索引失效:查询条件不符合索引使用规则。
- 复杂查询:如多表连接、子查询等。
- 数据量过大:表中数据量过多,查询效率低。
- 服务器性能不足:CPU、内存或磁盘性能瓶颈。
- 锁竞争:多个事务同时操作同一数据,导致锁等待。
13. 一张大表划分为多个小表后,怎么测试小表
答案:
- 数据完整性测试:确保数据在拆分过程中没有丢失或重复。
- 查询性能测试:对比拆分前后查询速度,验证是否优化。
- 关联查询测试:测试小表之间的关联查询是否正常。
- 边界条件测试:验证数据在小表之间的边界是否正确处理。
- 并发测试:模拟高并发场景,验证小表的并发性能。
14. 合并两个有序数组
答案:
- Plain Text
- C++
- Java
- C
- Python2
- Python3
- Pypy2
- Pypy3
- JavaScript
- PHP
- C#
- R
- Go
- Ruby
- Rust
- Bash
- Shell
- CSS
- HTML
- XML
- ASP/VB
- Perl
- Swift
- Objective-C
- Pascal
- MATLAB
- Scala
- Kotlin
- Groovy
- Typescript
- SQL
- MySQL
- Oracle
- SQLite
- Scheme
- TCL
复制
删除
xxxxxxxxxx
23
1
public int[] merge(int[] nums1, int[] nums2) {
2
int[] result = new int[nums1.length + nums2.length];
3
int i = 0, j = 0, k = 0;
4
5
while (i < nums1.length && j < nums2.length) {
6
if (nums1[i] < nums2[j]) {
7
result[k++] = nums1[i++];
8
} else {
9
result[k++] = nums2[j++];
10
}
11
}
12
13
while (i < nums1.length) {
14
result[k++] = nums1[i++];
15
}
16
17
while (j < nums2.length) {
18
result[k++] = nums2[j++];
19
}
20
21
return result;
22
}
23
15. 你觉得自己做测开有什么优势
答案:
- 技术能力:掌握编程语言和测试工具,能够快速定位问题。
- 逻辑思维:善于分析问题,设计全面的测试用例。
- 学习能力:能够快速掌握新技术和新工具。
- 沟通能力:能够与开发团队有效沟通,推动问题解决。
16. 互联网测试和通信测试的区别
答案:
- 互联网测试: 重点:用户体验、性能、兼容性。工具:Selenium、JMeter、Postman等。场景:Web应用、移动应用。
- 通信测试: 重点:网络协议、信号传输、设备兼容性。工具:Wireshark、抓包工具、硬件测试设备。场景:通信设备、网络协议、物联网。
17. JVM内存模型(JMM)
答案:JVM内存模型(JMM)定义了线程之间的内存可见性和操作顺序。主要特点包括:
- 主内存与工作内存:线程之间的共享变量存储在主内存中,每个线程有自己的工作内存,线程对变量的操作必须在工作内存中进行。
- 内存操作:包括读取、写入、锁等操作。
- 内存屏障:用于保证操作的顺序性和可见性。
18. 垃圾回收机制(GC)
答案:Java的垃圾回收机制通过自动回收无用对象的内存,避免内存泄漏。常见的垃圾回收算法包括:
- 标记-清除算法:标记活动对象,清除未标记的对象。
- 复制算法:将活动对象复制到另一个内存区域。
- 标记-压缩算法:标记活动对象后,将它们压缩到内存的一端。
19. 进入老年代的阈值
答案:在Java中,对象进入老年代的阈值通常由以下因素决定:
- Eden区空间不足:当Eden区无法容纳新对象时,触发Minor GC,部分对象会被晋升到老年代。
- 对象年龄:对象在新生代中经历多次GC后,达到一定年龄(默认15次GC)会被晋升到老年代。
- 大对象:直接分配到老年代的大对象。
20. JVM的可调整参数
答案:常见的JVM参数包括:
-Xms
:初始堆大小。-Xmx
:最大堆大小。-XX:NewRatio
:新生代与老年代比例。-XX:MaxPermSize
:最大永久代大小。-XX:+PrintGCDetails
:打印GC详细信息。
21. Server参数
答案:-server
参数用于启动JVM的服务器模式,优化服务器性能。服务器模式会启用更多优化策略,如JIT编译器。
22. 垃圾收集器及其GC方式
答案:常见的垃圾收集器包括:
- Serial GC:单线程垃圾收集器,适合单核CPU。
- Parallel GC:多线程垃圾收集器,适合多核CPU。
- CMS GC:并发标记-清除收集器,适合低延迟场景。
- G1 GC:分区垃圾收集器,适合大堆内存。
- ZGC:低延迟垃圾收集器,适合超大堆内存。
23. GC调优工具
答案:常用的GC调优工具包括:
- VisualVM:可视化监控和分析工具。
- JConsole:JMX监控工具。
- GC日志分析工具:如GCEasy。
24. JUC中的类有哪些
答案:java.util.concurrent
(JUC)包中提供了丰富的并发工具类,包括:
- 线程池:
ExecutorService
、ThreadPoolExecutor
。 - 锁:
ReentrantLock
、ReadWriteLock
。 - 并发集合:
ConcurrentHashMap
、CopyOnWriteArrayList
。 - 同步工具类:
CountDownLatch
、CyclicBarrier
、Semaphore
。
25. ReentrantLock优于synchronized的地方
答案:ReentrantLock
相比synchronized
有以下优点:
- 功能更强大:支持公平锁、尝试加锁、中断加锁等。
- 可扩展性:可以结合
Condition
实现更复杂的线程协作。 - 性能更好:在高并发场景下,
ReentrantLock
的性能通常优于synchronized
。
26. 场景题目:五个人并发买票,结束后通知
答案:可以使用CountDownLatch
来实现。CountDownLatch
是一个同步工具类,用于等待多个线程完成某个操作。
- Plain Text
- C++
- Java
- C
- Python2
- Python3
- Pypy2
- Pypy3
- JavaScript
- PHP
- C#
- R
- Go
- Ruby
- Rust
- Bash
- Shell
- CSS
- HTML
- XML
- ASP/VB
- Perl
- Swift
- Objective-C
- Pascal
- MATLAB
- Scala
- Kotlin
- Groovy
- Typescript
- SQL
- MySQL
- Oracle
- SQLite
- Scheme
- TCL
复制
删除
xxxxxxxxxx
27
1
import java.util.concurrent.CountDownLatch;
2
3
public class TicketBooking {
4
private static final int NUM_THREADS = 5;
5
private static final CountDownLatch latch = new CountDownLatch(NUM_THREADS);
6
7
public static void main(String[] args) throws InterruptedException {
8
for (int i = 0; i < NUM_THREADS; i++) {
9
new Thread(() -> {
10
try {
11
// 模拟购票操作
12
System.out.println(Thread.currentThread().getName() + " is booking a ticket");
13
Thread.sleep(1000);
14
System.out.println(Thread.currentThread().getName() + " has booked a ticket");
15
} catch (InterruptedException e) {
16
e.printStackTrace();
17
} finally {
18
latch.countDown(); // 完成后计数减1
19
}
20
}).start();
21
}
22
23
latch.await(); // 等待所有线程完成
24
System.out.println("All tickets have been booked. Notify everyone.");
25
}
26
}
27
27. Linux用什么杀死进程
答案:在Linux中,可以使用kill
命令杀死进程。
28. Kill命令的参数
答案:常见的kill
命令参数包括:
-9
:强制终止进程。-15
:默认信号,请求进程正常退出。
29. Kill本质是什么
答案:kill
命令的本质是向进程发送信号(如SIGTERM或SIGKILL),通知进程进行相应的操作。
30. 测试项目部分:项目怎么实现,运用到的Selenium接口
答案:项目实现通常包括以下步骤:
- 需求分析:明确测试目标和范围。
- 测试用例设计:根据需求设计测试用例。
- 自动化脚本编写:使用Selenium编写自动化测试脚本。
- 执行测试:运行脚本,生成测试报告。
- 问题跟踪:记录并跟踪问题。
常用的Selenium接口:
WebDriver
:提供浏览器操作接口。WebElement
:提供元素操作接口。By
:用于元素定位。
31. 元素定位的方法
答案:Selenium中常用的元素定位方法包括:
- ID定位:
driver.findElement(By.id("elementId"));
- Class定位:
driver.findElement(By.className("elementClass"));
- XPath定位:
driver.findElement(By.xpath("//div[@class='elementClass']"));
- CSS定位:
driver.findElement(By.cssSelector("div.elementClass"));
- LinkText定位:
driver.findElement(By.linkText("Link Text"));
32. 如何采用配置文件,为什么要用配置文件
答案:可以使用配置文件(如properties
文件)来存储测试数据和参数。例如:
- Plain Text
- C++
- Java
- C
- Python2
- Python3
- Pypy2
- Pypy3
- JavaScript
- PHP
- C#
- R
- Go
- Ruby
- Rust
- Bash
- Shell
- CSS
- HTML
- XML
- ASP/VB
- Perl
- Swift
- Objective-C
- Pascal
- MATLAB
- Scala
- Kotlin
- Groovy
- Typescript
- SQL
- MySQL
- Oracle
- SQLite
- Scheme
- TCL
复制
删除
xxxxxxxxxx
5
1
# test.properties
2
url=https://example.com
3
username=admin
4
password=123456
5
在代码中加载配置文件:
- Plain Text
- C++
- Java
- C
- Python2
- Python3
- Pypy2
- Pypy3
- JavaScript
- PHP
- C#
- R
- Go
- Ruby
- Rust
- Bash
- Shell
- CSS
- HTML
- XML
- ASP/VB
- Perl
- Swift
- Objective-C
- Pascal
- MATLAB
- Scala
- Kotlin
- Groovy
- Typescript
- SQL
- MySQL
- Oracle
- SQLite
- Scheme
- TCL
复制
删除
xxxxxxxxxx
4
1
Properties props = new Properties();
2
props.load(new FileInputStream("test.properties"));
3
String url = props.getProperty("url");
4
使用配置文件的好处:
- 解耦:将测试数据与代码分离,便于维护。
- 可扩展性:方便扩展测试用例,无需修改代码。
- 环境适配:可以针对不同环境(开发、测试、生产)使用不同的配置文件。
33. 测试场景题:对上一面的手撕代码进行测试用例编写
答案:假设手撕代码是合并两个有序数组,测试用例可以包括:
- 正常情况: 输入:[1, 3, 5] 和 [2, 4, 6],预期输出:[1, 2, 3, 4, 5, 6]
- 边界情况: 输入:[] 和 [1, 2, 3],预期输出:[1, 2, 3]输入:[1, 2, 3] 和 [],预期输出:[1, 2, 3]
- 异常情况: 输入:null 和 [1, 2, 3],预期抛出异常。输入:[1, 2, 3] 和 null,预期抛出异常。
34. 黑盒测试和白盒测试的区别
答案:
- 黑盒测试: 定义:不关心内部实现,只关注输入和输出。优点:从用户角度出发,发现功能问题。缺点:无法覆盖内部逻辑。
- 白盒测试: 定义:关注内部实现,测试代码逻辑。优点:覆盖内部逻辑,发现隐藏问题。缺点:无法从用户角度发现功能问题。
35. 未来职业生涯规划
答案:
- 短期目标:熟悉公司业务,掌握核心技能。
- 中期目标:成为团队核心成员,负责重要项目。
- 长期目标:晋升为技术专家或管理岗位,带领团队。
36. 测开语言
答案:常见的测开语言包括:
- Java:广泛应用于企业级开发和测试。
- Python:简洁易用,适合快速开发。
- JavaScript:用于前端测试和自动化。
37. 主要业务
答案:根据公司业务,可能包括:
- 电商:购物、支付、物流。
- 社交:用户互动、内容推荐。
- 金融:交易、风控、数据分析。
38. 测试工作对开发工作的启发
答案:
- 质量意识:开发过程中更注重代码质量。
- 需求理解:从测试角度理解需求,避免误解。
- 问题预防:提前发现潜在问题,减少后期修复成本。
39. 是否有驾照,是否开过车
答案:
- 有驾照:可以结合自动驾驶技术谈自己的理解和体验。
- 没驾照:可以强调对自动驾驶技术的理论研究。
40. 自动驾驶测试用例怎么设计
答案:可以从以下角度设计测试用例:
- 功能测试:验证自动驾驶的基本功能,如车道保持、自动泊车。
- 性能测试:测试系统响应时间和处理能力。
- 安全测试:模拟紧急情况,验证系统反应。
- 兼容性测试:测试与不同车型和传感器的兼容性。
41. 等价类划分怎么设计测试用例
答案:等价类划分是一种黑盒测试方法,将输入划分为有效等价类和无效等价类。例如:
- 有效等价类:输入符合要求的值。
- 无效等价类:输入超出范围或不符合要求的值。
42. 了解哪些编程语言
答案:
- Java:适合企业级开发和测试。
- Python:适合自动化测试和数据分析。
- C++:适合底层开发和高性能应用。
43. 平时怎么学习
答案:
- 在线课程:如Coursera、LeetCode。
- 书籍:如《Effective Java》、《代码大全》。
- 实践项目:通过实际项目提升技能。
44. 实体书籍会看吗
答案:会看实体书籍,因为实体书籍便于深度阅读和反复查阅。
45. 职业规划
答案:
- 短期目标:熟悉公司业务,掌握核心技能。
- 中期目标:成为团队核心成员,负责重要项目。
- 长期目标:晋升为技术专家或管理岗位,带领团队。
46. 对互联网企业、传统企业、新兴企业的看法
答案:
- 互联网企业:发展快,创新能力强,适合追求技术前沿的求职者。
- 传统企业:业务稳定,适合追求稳定发展的求职者。
- 新兴企业:机会多,但风险也高,适合有创业精神的求职者。
47. 薪资期望
答案:根据市场行情和个人能力,期望薪资范围为X-X元。同时,更注重职业发展和学习机会。
48. 目前Offer情况
答案:目前有X家公司的Offer,正在综合考虑公司文化、岗位职责和个人发展等因素。
49. 反问环节
答案:
- 岗位职责:能否详细介绍一下这个岗位的主要工作内容?
- 团队文化:这个岗位所在的团队文化是怎样的?
- 职业发展:公司对员工的职业发展有哪些支持?
- 项目挑战:这个岗位目前面临的最大挑战是什么?
1. pytest的用法
Pytest 是一个强大的 Python 测试框架,具有以下特点:
- 自动发现测试用例:默认识别以
test_
开头的文件、类和方法。 - 简洁的断言:直接使用
assert
语句,无需复杂的断言方法。 - 参数化测试:通过
@pytest.mark.parametrize
装饰器实现参数化。 - 丰富的插件支持:如生成测试报告(Allure、HTML报告)。
示例代码:
- Plain Text
- C++
- Java
- C
- Python2
- Python3
- Pypy2
- Pypy3
- JavaScript
- PHP
- C#
- R
- Go
- Ruby
- Rust
- Bash
- Shell
- CSS
- HTML
- XML
- ASP/VB
- Perl
- Swift
- Objective-C
- Pascal
- MATLAB
- Scala
- Kotlin
- Groovy
- Typescript
- SQL
- MySQL
- Oracle
- SQLite
- Scheme
- TCL
复制
删除
xxxxxxxxxx
7
1
import pytest
2
3
# 参数化测试
4
@pytest.mark.parametrize("a, b, expected", [(1, 2, 3), (4, 5, 9)])
5
def test_add(a, b, expected):
6
assert a + b == expected
7
运行命令:
- Plain Text
- C++
- Java
- C
- Python2
- Python3
- Pypy2
- Pypy3
- JavaScript
- PHP
- C#
- R
- Go
- Ruby
- Rust
- Bash
- Shell
- CSS
- HTML
- XML
- ASP/VB
- Perl
- Swift
- Objective-C
- Pascal
- MATLAB
- Scala
- Kotlin
- Groovy
- Typescript
- SQL
- MySQL
- Oracle
- SQLite
- Scheme
- TCL
复制
删除
xxxxxxxxxx
2
1
pytest test_file.py --html=report.html
2
2. pytest与unittest的区别
安装 | 需手动安装(
) | 内置,无需安装 |
用例识别 | 自动识别以
开头的文件、类和方法 | 需继承
|
断言 | 使用
| 使用
等 |
参数化 | 使用
| 需借助
插件 |
插件支持 | 丰富的插件支持(如 Allure 报告) | 插件较少 |
易用性 | 更简洁,适合快速开发 | 更传统,适合大型项目 |
剪切 Ctrl X
复制 Ctrl C
向上插入
行向下插入
行向左插入
列向右插入
列
删除所选行
删除所选列
删除表格
合并单元格
拆分单元格
清除内容
3. JMeter如何进行压力测试
JMeter 是一款开源的压力测试工具,主要用于性能测试。以下是基本步骤:
- 安装与启动:下载并解压 JMeter。启动 jmeter.bat 或 jmeter.sh。
- 创建测试计划:打开 JMeter,创建一个测试计划。添加线程组(Thread Group),设置并发用户数和循环次数。
- 添加采样器(Sampler):添加 HTTP 请求采样器,配置目标服务器的 URL。
- 添加监听器:添加“查看结果树”或“聚合报告”,用于查看测试结果。
- 运行测试:点击“开始”按钮,运行测试。观察监听器中的性能指标(如响应时间、吞吐量)。
示例:
- 线程数:100
- 循环次数:10
- 目标 URL:
http://example.com
4. Postman如何实现接口关联
在 Postman 中,接口关联通常用于将前一个接口的返回值传递给后一个接口。具体步骤如下:
- 提取返回值:在 Postman 的“Tests”选项卡中,使用 pm 对象提取响应中的值。示例代码:
- 使用全局变量:将提取的值保存为全局变量。示例代码:
- 引用全局变量:在后续请求中,通过 {{token}} 引用全局变量。
示例:
- 第一个接口返回
token
,保存为全局变量。 - 第二个接口的请求头中使用
Authorization: Bearer {{token}}
。
4. 计网问题:输入一个域名,正常加载几秒,但加载了十几秒,可能是什么问题?如何排查?
可能的原因
- DNS解析问题: 域名解析时间过长,可能是DNS服务器响应慢或配置错误。
- 网络延迟: 网络链路不稳定,导致数据传输延迟增加。
- 服务器性能问题: 服务器负载过高,响应慢。
- 页面资源过多: 页面包含大量图片、脚本或外部资源,加载时间长。
- 安全设备或防火墙限制: 防火墙或安全设备对请求进行了额外检查。
排查方法
- 检查DNS解析时间: 使用 ping 或 nslookup 命令检查域名解析时间。示例:
- 检查网络延迟: 使用 ping 或 traceroute 检查网络延迟。示例:
- 检查服务器性能: 使用 curl 或浏览器开发者工具查看服务器响应时间。示例:
- 检查页面资源加载: 使用浏览器开发者工具(如 Chrome DevTools)查看页面资源加载时间。
- 检查安全设备: 检查防火墙或安全设备的日志,确认是否有异常拦截。
5. Linux:如何查看端口并关闭端口?
查看端口
- 使用 netstat 命令:-t:显示TCP端口-u:显示UDP端口-l:显示监听状态的端口-n:显示数字形式的地址和端口-p:显示进程ID和名称
- 使用 ss 命令:
关闭端口
- 通过进程关闭:找到占用端口的进程:杀掉进程:
- 通过防火墙关闭端口:使用 iptables:使用 firewalld:
6. SQL:两个订单表,查询a表中有,b表中没有的订单
SQL查询
假设两个订单表分别为 orders_a
和 orders_b
,且主键字段为 order_id
,可以使用以下方法查询:
方法1:使用 NOT EXISTS
- Plain Text
- C++
- Java
- C
- Python2
- Python3
- Pypy2
- Pypy3
- JavaScript
- PHP
- C#
- R
- Go
- Ruby
- Rust
- Bash
- Shell
- CSS
- HTML
- XML
- ASP/VB
- Perl
- Swift
- Objective-C
- Pascal
- MATLAB
- Scala
- Kotlin
- Groovy
- Typescript
- SQL
- MySQL
- Oracle
- SQLite
- Scheme
- TCL
复制
删除
xxxxxxxxxx
8
1
SELECT a.order_id
2
FROM orders_a a
3
WHERE NOT EXISTS (
4
SELECT 1
5
FROM orders_b b
6
WHERE b.order_id = a.order_id
7
);
8
方法2:使用 LEFT JOIN
- Plain Text
- C++
- Java
- C
- Python2
- Python3
- Pypy2
- Pypy3
- JavaScript
- PHP
- C#
- R
- Go
- Ruby
- Rust
- Bash
- Shell
- CSS
- HTML
- XML
- ASP/VB
- Perl
- Swift
- Objective-C
- Pascal
- MATLAB
- Scala
- Kotlin
- Groovy
- Typescript
- SQL
- MySQL
- Oracle
- SQLite
- Scheme
- TCL
复制
删除
xxxxxxxxxx
5
1
SELECT a.order_id
2
FROM orders_a a
3
LEFT JOIN orders_b b ON a.order_id = b.order_id
4
WHERE b.order_id IS NULL;
5
7. 手撕代码:力扣169(多数元素)
问题描述
给定一个大小为 n
的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋
的元素。
解题思路
- Boyer-Moore投票算法: 初始化计数器为0,候选元素为数组的第一个元素。遍历数组,如果当前元素与候选元素相同,计数器加1;否则减1。如果计数器为0,更换候选元素为当前元素,计数器重置为1。最终的候选元素即为多数元素。
代码实现
- Plain Text
- C++
- Java
- C
- Python2
- Python3
- Pypy2
- Pypy3
- JavaScript
- PHP
- C#
- R
- Go
- Ruby
- Rust
- Bash
- Shell
- CSS
- HTML
- XML
- ASP/VB
- Perl
- Swift
- Objective-C
- Pascal
- MATLAB
- Scala
- Kotlin
- Groovy
- Typescript
- SQL
- MySQL
- Oracle
- SQLite
- Scheme
- TCL
复制
删除
xxxxxxxxxx
11
1
def majorityElement(nums):
2
count = 0
3
candidate = None
4
5
for num in nums:
6
if count == 0:
7
candidate = num
8
count += (1 if num == candidate else -1)
9
10
return candidate
11
携程测试岗位面试问题的详细解答,帮助你更好地准备面试:
1. 项目相关的东西问得比较多
回答思路
- 项目背景:简要介绍项目的目标、业务场景和技术栈。
- 个人贡献:重点讲述你在项目中的角色和具体贡献,例如开发的模块、优化的流程等。
- 技术挑战:分享在项目中遇到的技术难题及解决方案,展示你的问题解决能力。
- 成果与收益:说明项目上线后的效果,如性能提升、用户体验改善等。
示例回答:
我参与的项目是一个电商系统的订单管理模块。项目的目标是优化订单处理流程,提升用户体验。我主要负责后端接口的开发和测试工作。在开发过程中,我们遇到了性能瓶颈问题,通过引入缓存机制和优化数据库查询,最终将接口响应时间从3秒降低到1秒以内。项目上线后,订单处理效率提升了50%,用户投诉率大幅下降。
2. 自动化稳定性怎么保障的
回答要点
- 代码质量:编写高质量的测试代码,遵循编码规范,减少潜在问题。
- 持续集成(CI):使用工具(如Jenkins)进行持续集成,定期运行自动化测试,及时发现并修复问题。
- 监控与报警:设置监控指标,如测试覆盖率、失败率等,一旦发现问题及时报警。
- 版本管理:合理管理测试脚本的版本,避免因版本冲突导致的稳定性问题。
- 测试环境管理:确保测试环境与生产环境一致,减少环境差异带来的问题。
示例回答:
为了保障自动化测试的稳定性,我们采用了以下措施:首先,严格遵循编码规范,编写高质量的测试脚本;其次,通过Jenkins实现持续集成,每天定时运行自动化测试,及时发现并修复问题;此外,我们设置了监控指标,一旦测试覆盖率或失败率出现异常,会立即报警并进行排查。同时,我们还对测试脚本进行版本管理,避免因版本冲突导致的稳定性问题。最后,我们确保测试环境与生产环境一致,减少因环境差异带来的问题。
3. 介绍一下平时测试的项目,服务端测试接触得多吗?
回答要点
- 项目概述:简要介绍你参与的项目类型,如Web应用、移动应用或后端服务。
- 服务端测试经验:重点讲述你在服务端测试中的具体工作,如接口测试、性能测试、安全测试等。
- 工具与技术:介绍你使用的测试工具和框架,如Postman、JMeter、Selenium等。
- 成果与优化:分享你在服务端测试中发现的问题及优化措施。
示例回答:
我参与的项目主要是电商系统的后端服务开发和测试。在服务端测试方面,我主要负责接口测试、性能测试和安全测试。我使用Postman进行接口测试,确保接口的正确性和稳定性;通过JMeter进行性能测试,优化系统性能,将响应时间从5秒降低到2秒以内;同时,我还使用工具进行安全测试,发现并修复了多个潜在的安全漏洞。通过这些工作,我积累了丰富的服务端测试经验。
4. 数据库:左连接、数据库的锁有哪些(写一条给数据库加锁的语句)
左连接(LEFT JOIN)
左连接用于返回左表的所有记录,即使右表中没有匹配的记录。
SQL示例:
- Plain Text
- C++
- Java
- C
- Python2
- Python3
- Pypy2
- Pypy3
- JavaScript
- PHP
- C#
- R
- Go
- Ruby
- Rust
- Bash
- Shell
- CSS
- HTML
- XML
- ASP/VB
- Perl
- Swift
- Objective-C
- Pascal
- MATLAB
- Scala
- Kotlin
- Groovy
- Typescript
- SQL
- MySQL
- Oracle
- SQLite
- Scheme
- TCL
复制
删除
xxxxxxxxxx
4
1
SELECT a.*, b.*
2
FROM table_a a
3
LEFT JOIN table_b b ON a.id = b.id;
4
数据库锁
数据库锁用于控制并发访问,防止数据冲突。常见的锁类型包括:
- 行锁:锁定单行数据,适用于高并发场景。
- 表锁:锁定整个表,适用于批量操作。
- 意向锁:用于表示对表或行的锁定意图。
加锁语句示例:
- Plain Text
- C++
- Java
- C
- Python2
- Python3
- Pypy2
- Pypy3
- JavaScript
- PHP
- C#
- R
- Go
- Ruby
- Rust
- Bash
- Shell
- CSS
- HTML
- XML
- ASP/VB
- Perl
- Swift
- Objective-C
- Pascal
- MATLAB
- Scala
- Kotlin
- Groovy
- Typescript
- SQL
- MySQL
- Oracle
- SQLite
- Scheme
- TCL
复制
删除
xxxxxxxxxx
6
1
-- 行锁示例(使用SELECT FOR UPDATE)
2
SELECT * FROM table_name WHERE id = 1 FOR UPDATE;
3
4
-- 表锁示例(使用LOCK TABLES)
5
LOCK TABLES table_name WRITE;
6
5. 介绍下Redis、MetaQ、消息队列
Redis
Redis是一个高性能的键值存储系统,支持多种数据结构,如字符串、列表、集合等。它常用于缓存、消息队列和分布式锁。
应用场景:
- 缓存:减少数据库压力,提升读取速度。
- 消息队列:实现简单的消息传递。
- 分布式锁:用于分布式系统中的锁机制。
MetaQ(RocketMQ)
MetaQ是阿里巴巴开源的消息中间件,现更名为RocketMQ。它支持高吞吐量、低延迟的消息传递,适用于分布式系统中的异步通信。
特点:
- 高吞吐量:支持高并发消息传递。
- 高可用性:支持集群部署,保证数据可靠性。
- 顺序消息:支持消息的顺序消费。
消息队列
消息队列是一种异步通信机制,允许应用程序之间通过消息进行通信。常见的消息队列包括RabbitMQ、Kafka等。
应用场景:
- 解耦:降低系统模块之间的耦合度。
- 异步处理:提高系统响应速度。
- 负载均衡:合理分配系统负载。
6. 介绍一下幂等的概念
幂等性
幂等性是指一个操作执行多次与执行一次的效果相同。在分布式系统中,幂等性非常重要,可以防止重复操作导致的数据问题。
示例:
- HTTP方法的幂等性: GET、PUT、DELETE:幂等操作,多次执行效果相同。POST:非幂等操作,多次执行可能导致数据重复。
实现幂等性的方法:
- 唯一标识符:为每个请求生成唯一标识符(如UUID),通过数据库或缓存记录操作状态。
- 状态检查:在执行操作前,检查目标状态是否已存在。
示例代码:
- Plain Text
- C++
- Java
- C
- Python2
- Python3
- Pypy2
- Pypy3
- JavaScript
- PHP
- C#
- R
- Go
- Ruby
- Rust
- Bash
- Shell
- CSS
- HTML
- XML
- ASP/VB
- Perl
- Swift
- Objective-C
- Pascal
- MATLAB
- Scala
- Kotlin
- Groovy
- Typescript
- SQL
- MySQL
- Oracle
- SQLite
- Scheme
- TCL
复制
删除
xxxxxxxxxx
7
1
def process_payment(order_id):
2
if is_payment_processed(order_id):
3
return "Payment already processed"
4
# 执行支付逻辑
5
mark_payment_as_processed(order_id)
6
return "Payment processed"
7
7. 英语听说读写怎么样
回答要点
- 自我评估:客观评估自己的英语水平,如CET-4、CET-6成绩或雅思、托福成绩。
- 实际应用:分享在实际工作或学习中使用英语的经历,如阅读技术文档、与国外团队沟通等。
- 提升计划:如果有不足,说明你的提升计划。
示例回答:
我的英语水平还不错,CET-6成绩是550分。在实际工作中,我经常阅读英文技术文档,也与国外团队进行过邮件沟通,能够熟练使用英语进行日常交流和技术讨论。目前我还在通过在线课程进一步提升我的口语和写作能力。
8. 反问
反问问题示例
- 岗位职责:这个岗位的主要工作内容是什么?
- 团队文化:这个岗位所在的团队文化是怎样的?
- 职业发展:公司对员工的职业发展有哪些支持?
- 项目挑战:这个岗位目前面临的最大挑战是什么?
示例反问:
面试官,我想了解一下这个岗位的主要工作内容是什么?另外,公司对员工的职业发展有哪些支持?