ToB企服应用市场:ToB评测及商务社交产业平台

标题: 测试开发面试题汇总 [打印本页]

作者: 诗林    时间: 4 天前
标题: 测试开发面试题汇总
下面是我在练习中协助面试 然后在牛客上挑选了一些完整的面试标题借助豆包完成的面经答案思绪汇总


快手(测试开发,一面)
作者:@露西范皮尔特


快手(测试开发,二面)
作者:@露西范皮尔特



快手(测试开发,三面)
作者:@露西范皮尔特



滴滴(自动驾驶测开,一面)
作者:@蔓越莓在星空岛弹钢琴


滴滴(自动驾驶测开,二面)
作者:@蔓越莓在星空岛弹钢琴


滴滴(自动驾驶测开,三面)
作者:@蔓越莓在星空岛弹钢琴


美团(测试开发, 一面)
作者:@wang1999

美团(测试开发, 二面)
作者:@wang1999

美团(测试开发, HR面)
作者:@wang1999



好的,以下是针对你提供的面试标题,面向校招面试的详细答案输出。这些答案会尽量简便明确,同时涵盖关键知识点,帮助你在面试中更好地展示自己的能力。
1. TestNG怎样实现每个Case前都关闭欣赏器?(面试官要求不在代码中显示)

答案:可以利用TestNG的监听器(Listener)机制来实现。详细来说,可以实现ITestListener接口,在onTestStart方法中关闭欣赏器。这样,每个测试用例开始前都会自动触发关闭欣赏器的操作,而不必要在每个测试用例代码中显式调用。







复制
删除

  1. xxxxxxxxxx
复制代码
20

1
  1. import org.testng.ITestListener;
复制代码
2
  1. import org.testng.ITestResult;
复制代码
3
  1. import org.openqa.selenium.WebDriver;
复制代码
4
复制代码
5
  1. public class CustomListener implements ITestListener {
复制代码
6
  1.    private WebDriver driver;
复制代码
7
复制代码
8
  1.    @Override
复制代码
9
  1.    public void onTestStart(ITestResult result) {
复制代码
10
  1.        // 在每个测试用例开始前关闭浏览器
复制代码
11
  1.        if (driver != null) {
复制代码
12
  1.            driver.quit();
复制代码
13
  1.        }
复制代码
14
  1.        // 初始化浏览器(根据需要)
复制代码
15
  1.        driver = new WebDriver(); // 示例代码,根据实际情况初始化
复制代码
16
  1.    }
复制代码
17
复制代码
18
  1.    // 其他方法可以留空或根据需要实现
复制代码
19
  1. }
复制代码
20
复制代码

在testng.xml中注册这个监听器:







复制
删除

  1. xxxxxxxxxx
复制代码
12

1
  1. <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
复制代码
2
  1. <suite name="TestSuite">
复制代码
3
  1.    <listeners>
复制代码
4
  1.        <listener class-name="com.example.CustomListener"/>
复制代码
5
  1.    </listeners>
复制代码
6
  1.    <test name="Test1">
复制代码
7
  1.        <classes>
复制代码
8
  1.            <class name="com.example.TestClass"/>
复制代码
9
  1.        </classes>
复制代码
10
  1.    </test>
复制代码
11
  1. </suite>
复制代码
12
复制代码

2. 分层设计的好处,每层的详细内容

答案:分层设计是一种常见的软件架构设计方法,其重要好处包罗:

常见的分层设计包罗以下几层:

3. 登录功能的详细实现,怎样验证成功

答案:登录功能的实现通常包罗以下几个步调:
验证登录成功的方法:

测试验证:

4. 用Jenkins完成了哪些工作

答案:Jenkins是一个连续集成和连续摆设(CI/CD)工具,可以完成以下工作:
5. 多线程的创建方法

答案:Java中创建多线程有以下几种方法:
6. 线程池的好处

答案:线程池的好处包罗:
7. 核心线程和最大线程的区别

答案:

8. 添加线程,核心线程未占满,会创建新的线程吗?

答案:不会。只有当核心线程被占满且任务队列也满了时,线程池才会创建新的线程,直到达到最大线程数。
9. CPU麋集型任务怎样设计线程池的核心线程

答案:对于CPU麋集型任务,线程池的核心线程数通常设计为CPU核心数。由于CPU麋集型任务重要占用CPU资源,过多的线程会导致上下文切换增长开销,降低效率。







复制
删除

  1. xxxxxxxxxx
复制代码
9

1
  1. int corePoolSize = Runtime.getRuntime().availableProcessors();
复制代码
2
  1. ExecutorService executor = new ThreadPoolExecutor(
复制代码
3
  1.    corePoolSize,
复制代码
4
  1.    corePoolSize,
复制代码
5
  1.    0L,
复制代码
6
  1.    TimeUnit.MILLISECONDS,
复制代码
7
  1.    new LinkedBlockingQueue<>()
复制代码
8
  1. );
复制代码
9
复制代码

10. MySQL索引的范例和作用

答案:MySQL中常见的索引范例包罗:

索引的作用:

11. 索引是不是越多越好?

答案:不是。索引虽然可以加速查询速率,但也会带来以下标题:

因此,索引的数量必要根据实际需求合理设计。
12. 查询慢可能是什么原因

答案:查询慢的原因可能包罗:
13. 一张大表分别为多个小表后,怎么测试小表

答案:
14. 合并两个有序数组

答案:







复制
删除

  1. xxxxxxxxxx
复制代码
23

1
  1. public int[] merge(int[] nums1, int[] nums2) {
复制代码
2
  1.    int[] result = new int[nums1.length + nums2.length];
复制代码
3
  1.    int i = 0, j = 0, k = 0;
复制代码
4
复制代码
5
  1.    while (i < nums1.length && j < nums2.length) {
复制代码
6
  1.        if (nums1[i] < nums2[j]) {
复制代码
7
  1.            result[k++] = nums1[i++];
复制代码
8
  1.        } else {
复制代码
9
  1.            result[k++] = nums2[j++];
复制代码
10
  1.        }
复制代码
11
  1.    }
复制代码
12
复制代码
13
  1.    while (i < nums1.length) {
复制代码
14
  1.        result[k++] = nums1[i++];
复制代码
15
  1.    }
复制代码
16
复制代码
17
  1.    while (j < nums2.length) {
复制代码
18
  1.        result[k++] = nums2[j++];
复制代码
19
  1.    }
复制代码
20
复制代码
21
  1.    return result;
复制代码
22
  1. }
复制代码
23
复制代码

15. 你觉得自己做测开有什么优势

答案:

16. 互联网测试和通信测试的区别

答案:

17. JVM内存模型(JMM)

答案:JVM内存模型(JMM)界说了线程之间的内存可见性和操作次序。重要特点包罗:
18. 垃圾接纳机制(GC)

答案:Java的垃圾接纳机制通过自动接纳无用对象的内存,避免内存泄漏。常见的垃圾接纳算法包罗:
19. 进入老年代的阈值

答案:在Java中,对象进入老年代的阈值通常由以下因素决定:
20. JVM的可调解参数

答案:常见的JVM参数包罗:

21. Server参数

答案:-server参数用于启动JVM的服务器模式,优化服务器性能。服务器模式会启用更多优化策略,如JIT编译器。
22. 垃圾收集器及其GC方式

答案:常见的垃圾收集器包罗:
23. GC调优工具

答案:常用的GC调优工具包罗:

24. JUC中的类有哪些

答案:java.util.concurrent(JUC)包中提供了丰富的并发工具类,包罗:

25. ReentrantLock优于synchronized的地方

答案:ReentrantLock相比synchronized有以下优点:
26. 场景标题:五个人并发买票,竣过后通知

答案:可以利用CountDownLatch来实现。CountDownLatch是一个同步工具类,用于等候多个线程完成某个操作。







复制
删除

  1. xxxxxxxxxx
复制代码
27

1
  1. import java.util.concurrent.CountDownLatch;
复制代码
2
复制代码
3
  1. public class TicketBooking {
复制代码
4
  1.    private static final int NUM_THREADS = 5;
复制代码
5
  1.    private static final CountDownLatch latch = new CountDownLatch(NUM_THREADS);
复制代码
6
复制代码
7
  1.    public static void main(String[] args) throws InterruptedException {
复制代码
8
  1.        for (int i = 0; i < NUM_THREADS; i++) {
复制代码
9
  1.            new Thread(() -> {
复制代码
10
  1.                try {
复制代码
11
  1.                    // 模拟购票操作
复制代码
12
  1.                    System.out.println(Thread.currentThread().getName() + " is booking a ticket");
复制代码
13
  1.                    Thread.sleep(1000);
复制代码
14
  1.                    System.out.println(Thread.currentThread().getName() + " has booked a ticket");
复制代码
15
  1.                } catch (InterruptedException e) {
复制代码
16
  1.                    e.printStackTrace();
复制代码
17
  1.                } finally {
复制代码
18
  1.                    latch.countDown(); // 完成后计数减1
复制代码
19
  1.                }
复制代码
20
  1.            }).start();
复制代码
21
  1.        }
复制代码
22
复制代码
23
  1.        latch.await(); // 等待所有线程完成
复制代码
24
  1.        System.out.println("All tickets have been booked. Notify everyone.");
复制代码
25
  1.    }
复制代码
26
  1. }
复制代码
27
复制代码

27. Linux用什么杀死历程

答案:在Linux中,可以利用kill命令杀死历程。
28. Kill命令的参数

答案:常见的kill命令参数包罗:

29. Kill本质是什么

答案:kill命令的本质是向历程发送信号(如SIGTERM或SIGKILL),通知历程进行相应的操作。
30. 测试项目部分:项目怎么实现,运用到的Selenium接口

答案:项目实现通常包罗以下步调:
常用的Selenium接口:

31. 元素定位的方法

答案:Selenium中常用的元素定位方法包罗:
32. 怎样采用配置文件,为什么要用配置文件

答案:可以利用配置文件(如properties文件)来存储测试数据和参数。例如:







复制
删除

  1. xxxxxxxxxx
复制代码
5

1
  1. # test.properties
复制代码
2
  1. url=https://example.com
复制代码
3
  1. username=admin
复制代码
4
  1. password=123456
复制代码
5
复制代码

在代码中加载配置文件:







复制
删除

  1. xxxxxxxxxx
复制代码
4

1
  1. Properties props = new Properties();
复制代码
2
  1. props.load(new FileInputStream("test.properties"));
复制代码
3
  1. String url = props.getProperty("url");
复制代码
4
复制代码

利用配置文件的好处:
33. 测试场景题:对上一面的手撕代码进行测试用例编写

答案:假设手撕代码是合并两个有序数组,测试用例可以包罗:
34. 黑盒测试和白盒测试的区别

答案:

35. 将来职业生涯规划

答案:
36. 测开语言

答案:常见的测开语言包罗:

37. 重要业务

答案:根据公司业务,可能包罗:

38. 测试工尴尬刁难开发工作的开导

答案:
39. 是否有驾照,是否开过车

答案:

40. 自动驾驶测试用例怎么设计

答案:可以从以下角度设计测试用例:
41. 等价类分别怎么设计测试用例

答案:等价类分别是一种黑盒测试方法,将输入分别为有用等价类和无效等价类。例如:

42. 了解哪些编程语言

答案:

43. 平常怎么学习

答案:

44. 实体书籍会看吗

答案:会看实体书籍,由于实体书籍便于深度阅读和反复查阅。
45. 职业规划

答案:
46. 对互联网企业、传统企业、新兴企业的见解

答案:

47. 薪资盼望

答案:根据市场行情和个人能力,盼望薪资范围为X-X元。同时,更注重职业发展和学习机会。
48. 目前Offer情况

答案:目前有X家公司的Offer,正在综合思量公司文化、岗位职责和个人发展等因素。
49. 反问环节

答案:



1. pytest的用法

Pytest 是一个强大的 Python 测试框架,具有以下特点:

示例代码







复制
删除

  1. xxxxxxxxxx
复制代码
7

1
  1. import pytest
复制代码
2
复制代码
3
  1. # 参数化测试
复制代码
4
  1. @pytest.mark.parametrize("a, b, expected", [(1, 2, 3), (4, 5, 9)])
复制代码
5
  1. def test_add(a, b, expected):
复制代码
6
  1.    assert a + b == expected
复制代码
7
复制代码

运行命令







复制
删除

  1. xxxxxxxxxx
复制代码
2

1
  1. pytest test_file.py --html=report.html
复制代码
2
复制代码

2. pytest与unittest的区别


安装
需手动安装(
pip install pytest

内置,无需安装
用例识别
自动识别以
test_
开头的文件、类和方法
需继续
unittest.TestCase
断言
利用
assert
利用
self.assertEqual()

参数化
利用
@pytest.mark.parametrize
需借助
parameterized
插件
插件支持
丰富的插件支持(如 Allure 报告)
插件较少
易用性
更简便,得当快速开发
更传统,得当大型项目
剪切 Ctrl X
复制 Ctrl C
向上插入

行向下插入

行向左插入

列向右插入


删除所选行
删除所选列
删除表格
合并单元格
拆分单元格
扫除内容

3. JMeter怎样进行压力测试

JMeter 是一款开源的压力测试工具,重要用于性能测试。以下是根本步调:
示例

4. Postman怎样实现接口关联

在 Postman 中,接口关联通常用于将前一个接口的返回值传递给后一个接口。详细步调如下:
示例




4. 计网标题:输入一个域名,正常加载几秒,但加载了十几秒,可能是什么标题?怎样排查?

可能的原因

排查方法

5. Linux:怎样查察端口并关闭端口?

查察端口

关闭端口

6. SQL:两个订单表,查询a表中有,b表中没有的订单

SQL查询

假设两个订单表分别为 orders_a 和 orders_b,且主键字段为 order_id,可以利用以下方法查询:
方法1:利用 NOT EXISTS








复制
删除

  1. xxxxxxxxxx
复制代码
8

1
  1. SELECT a.order_id
复制代码
2
  1. FROM orders_a a
复制代码
3
  1. WHERE NOT EXISTS (
复制代码
4
  1.    SELECT 1
复制代码
5
  1.    FROM orders_b b
复制代码
6
  1.    WHERE b.order_id = a.order_id
复制代码
7
  1. );
复制代码
8
复制代码

方法2:利用 LEFT JOIN








复制
删除

  1. xxxxxxxxxx
复制代码
5

1
  1. SELECT a.order_id
复制代码
2
  1. FROM orders_a a
复制代码
3
  1. LEFT JOIN orders_b b ON a.order_id = b.order_id
复制代码
4
  1. WHERE b.order_id IS NULL;
复制代码
5
复制代码

7. 手撕代码:力扣169(多数元素)

标题描述

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
解题思绪

代码实现








复制
删除

  1. xxxxxxxxxx
复制代码
11

1
  1. def majorityElement(nums):
复制代码
2
  1.    count = 0
复制代码
3
  1.    candidate = None
复制代码
4
复制代码
5
  1.    for num in nums:
复制代码
6
  1.        if count == 0:
复制代码
7
  1.            candidate = num
复制代码
8
  1.        count += (1 if num == candidate else -1)
复制代码
9
复制代码
10
  1.    return candidate
复制代码
11
复制代码



携程测试岗位面试标题的详细解答,帮助你更好地准备面试:

1. 项目相干的东西问得比较多

答复思绪


示例答复
<blockquote id="nc-element-508">  我参与的项目是一个电商系统的订单管理模块。项目标目标是优化订单处置惩罚流程,提升用户体验。我重要负责后端接口的开发和测试工作。在开发过程中,我们遇到了性能瓶颈标题,通过引入缓存机制和优化数据库查询,最终将接口相应时间从3秒降低到1秒以内。项目上线后,订单处置惩罚效率提升了50%,用户投诉率大幅下降。
  2. 自动化稳定性怎么保障的

答复要点


示例答复
<blockquote id="nc-element-513">  为了保障自动化测试的稳定性,我们采用了以下措施:首先,严格遵照编码规范,编写高质量的测试脚本;其次,通过Jenkins实现连续集成,每天定时运行自动化测试,及时发现并修复标题;此外,我们设置了监控指标,一旦测试覆盖率或失败率出现非常,会立即报警并进行排查。同时,我们还对测试脚本进行版本管理,避免因版本辩论导致的稳定性标题。最后,我们确保测试环境与生产环境一致,镌汰因环境差异带来的标题。
  3. 介绍一下平常测试的项目,服务端测试打仗得多吗?

答复要点


示例答复
<blockquote id="nc-element-518">  我参与的项目重要是电商系统的后端服务开发和测试。在服务端测试方面,我重要负责接口测试、性能测试和安全测试。我利用Postman进行接口测试,确保接口的正确性和稳定性;通过JMeter进行性能测试,优化系统性能,将相应时间从5秒降低到2秒以内;同时,我还利用工具进行安全测试,发现并修复了多个潜伏的安全漏洞。通过这些工作,我积聚了丰富的服务端测试经验。
  4. 数据库:左连接、数据库的锁有哪些(写一条给数据库加锁的语句)

左连接(LEFT JOIN)

左连接用于返回左表的全部记载,纵然右表中没有匹配的记载。
SQL示例







复制
删除

  1. xxxxxxxxxx
复制代码
4

1
  1. SELECT a.*, b.*
复制代码
2
  1. FROM table_a a
复制代码
3
  1. LEFT JOIN table_b b ON a.id = b.id;
复制代码
4
复制代码

数据库锁

数据库锁用于控制并发访问,防止数据辩论。常见的锁范例包罗:

加锁语句示例







复制
删除

  1. xxxxxxxxxx
复制代码
6

1
  1. -- 行锁示例(使用SELECT FOR UPDATE)
复制代码
2
  1. SELECT * FROM table_name WHERE id = 1 FOR UPDATE;
复制代码
3
复制代码
4
  1. -- 表锁示例(使用LOCK TABLES)
复制代码
5
  1. LOCK TABLES table_name WRITE;
复制代码
6
复制代码

5. 介绍下Redis、MetaQ、消息队列

Redis

Redis是一个高性能的键值存储系统,支持多种数据结构,如字符串、列表、集合等。它常用于缓存、消息队列和分布式锁。
应用场景

MetaQ(RocketMQ)

MetaQ是阿里巴巴开源的消息中心件,现更名为RocketMQ。它支持高吞吐量、低耽误的消息传递,适用于分布式系统中的异步通信。
特点

消息队列

消息队列是一种异步通信机制,允许应用程序之间通过消息进行通信。常见的消息队列包罗RabbitMQ、Kafka等。
应用场景

6. 介绍一下幂等的概念

幂等性

幂等性是指一个操作执行多次与执行一次的结果相同。在分布式系统中,幂等性非常重要,可以防止重复操作导致的数据标题。
示例

实现幂等性的方法

示例代码







复制
删除

  1. xxxxxxxxxx
复制代码
7

1
  1. def process_payment(order_id):
复制代码
2
  1.    if is_payment_processed(order_id):
复制代码
3
  1.        return "Payment already processed"
复制代码
4
  1.    # 执行支付逻辑
复制代码
5
  1.    mark_payment_as_processed(order_id)
复制代码
6
  1.    return "Payment processed"
复制代码
7
复制代码

7. 英语听说读写怎么样

答复要点


示例答复
<blockquote id="nc-element-552">  我的英语水平还不错,CET-6结果是550分。在实际工作中,我经常阅读英文技能文档,也与国外团队进行过邮件沟通,可以或许熟练利用英语进行一样平常交换和技能讨论。目前我还在通过在线课程进一步提升我的口语和写作能力。
  8. 反问

反问标题示例


示例反问
<blockquote id="nc-element-557">  面试官,我想了解一下这个岗位的重要工作内容是什么?另外,公司对员工的职业发展有哪些支持?
  


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4