数字马力测开一面凉经
40min左右
1、自我介绍
2、实习
性能关注那些指标
性能脚本如何覆盖不同的操作系统(例如小米,华为鸿蒙等)
功能测试
3、场景:购物到拉起到支付完成异常用例
4、测试用例编写方式
5、测试覆盖率怎么考虑
6、偶现bug怎么处理
linux
7、修改权限
top按cpu、内存排序,查看指定用户cpu
无文件名查关键字
如何输出到文件中
8、死锁如何解决
Java
9、Java内存模型
10、多线程实现原理
11、序列化与反序列化
12、反射以及平时怎么使用
MySQL
13、学生表,课程表。查所有同学的总分
Redis
14、主从延迟怎么处理
15、Redis高性能
16、数据类型,持久化机制,缓存淘汰策略
反问
业务?一面统一面,主要考察基础以及软素质,表示不知道会被分到哪条业务线。
什么时候有结果?很快,两三天。
面试官很好,会对回答进行提示补充,但是你不挑简历上的问我就阿米诺斯了。菜的是我,答的稀巴烂 #牛客创作赏金赛#
第二天感谢信
1、自我介绍
2、实习
性能关注那些指标
性能脚本如何覆盖不同的操作系统(例如小米,华为鸿蒙等)
功能测试
3、场景:购物到拉起到支付完成异常用例
4、测试用例编写方式
5、测试覆盖率怎么考虑
6、偶现bug怎么处理
linux
7、修改权限
top按cpu、内存排序,查看指定用户cpu
无文件名查关键字
如何输出到文件中
8、死锁如何解决
Java
9、Java内存模型
10、多线程实现原理
11、序列化与反序列化
12、反射以及平时怎么使用
MySQL
13、学生表,课程表。查所有同学的总分
Redis
14、主从延迟怎么处理
15、Redis高性能
16、数据类型,持久化机制,缓存淘汰策略
反问
业务?一面统一面,主要考察基础以及软素质,表示不知道会被分到哪条业务线。
什么时候有结果?很快,两三天。
面试官很好,会对回答进行提示补充,但是你不挑简历上的问我就阿米诺斯了。菜的是我,答的稀巴烂 #牛客创作赏金赛#
第二天感谢信
全部评论
为啥我面的贼简单,都是基础八股还有一些场景题题,也是测开一面,你base是哪啊
一、性能关注那些指标
1. 响应时间:用户从发起请求到收到响应的时间,直接影响用户体验。
2. 吞吐量:单位时间内系统能够处理的事务数量,反映系统的处理能力。
3. 资源利用率:包括 CPU 使用率、内存使用率、磁盘 I/O 等,确保系统在合理的资源消耗下运行。
4. 并发用户数:系统能够同时支持的用户数量,特别是在高并发场景下需要重点关注。
5. 错误率:出现错误的请求比例,保证系统的稳定性和可靠性。
二、性能脚本如何覆盖不同的操作系统(例如小米,华为鸿蒙等)
可以使用跨平台的性能测试工具,如 JMeter。在测试计划中设置不同的操作系统参数,或者通过在不同操作系统上安装相同的测试工具并配置相同的测试场景来进行性能测试。同时,要注意不同操作系统可能存在的差异,如网络设置、权限管理等,确保测试的准确性和可比性。
三、购物到拉起到支付完成异常用例
1. 网络异常:在购物、拉起支付过程中网络中断或不稳定,检查系统的处理和提示。
2. 商品库存不足:购物后支付前商品库存发生变化,检查系统是否正确提示并阻止支付。
3. 支付渠道故障:选择的支付方式出现问题,如银行卡余额不足、支付平台故障等,检查系统的反馈和处理。
4. 系统故障:购物或支付过程中系统出现崩溃、卡顿等情况,检查数据的完整性和恢复机制。
5. 非法操作:如恶意攻击、篡改数据等,检查系统的安全防护机制。
四、测试用例编写方式
1. 等价类划分法:将输入数据划分为若干个等价类,从每个等价类中选取一个或多个代表性的数据作为测试用例。
2. 边界值分析法:针对输入数据的边界值进行测试,因为在边界处容易出现问题。
3. 场景法:根据业务流程和用户场景设计测试用例,模拟用户的实际操作。
4. 错误推测法:根据经验和直觉推测可能出现的错误,设计相应的测试用例。
五、测试覆盖率怎么考虑
1. 代码覆盖率:通过工具统计代码被执行的比例,确保关键代码和分支都被覆盖到。可以使用 JaCoCo 等工具进行代码覆盖率分析。
2. 功能覆盖率:确保所有的功能需求都有相应的测试用例覆盖。对每个功能点进行详细的测试用例设计,包括正常情况和异常情况。
3. 场景覆盖率:考虑不同的用户场景和业务流程,确保系统在各种场景下都能正常运行。例如,购物系统的不同支付方式、不同商品类型、不同用户角色等场景都需要进行覆盖。
六、偶现 bug 怎么处理
1. 记录详细信息:包括出现 bug 的环境、操作步骤、错误现象等,尽可能多地收集信息,以便后续分析。
2. 尝试复现:多次尝试相同的操作步骤,看是否能够复现 bug。如果能够复现,进一步分析原因并修复;如果不能复现,也要记录下来,以便后续观察。
3. 分析原因:根据收集到的信息,结合代码和系统架构进行分析,找出可能导致 bug 的原因。
4. 修复 bug:根据分析结果进行修复,并进行回归测试,确保修复后的系统正常运行。
5. 预防措施:对于偶现 bug,要分析是否存在潜在的风险,采取相应的预防措施,避免类似问题再次出现。
七、Linux 相关问题
1. 修改权限:使用 chmod 命令修改文件或目录的权限。例如, chmod 755 filename 将文件的权限设置为所有者有读、写、执行权限,组用户和其他用户有读和执行权限。
2. top 按 CPU、内存排序,查看指定用户 CPU:在 top 命令运行时,按 P 键可以按 CPU 使用率排序,按 M 键可以按内存使用率排序。要查看指定用户的 CPU 使用情况,可以在 top 命令中使用 -U 选项加上用户名。
3. 无文件名查关键字:使用 grep 命令在文件内容中查找关键字。如果不知道文件名,可以使用 find 命令结合 grep 来查找。例如, find /path -type f -exec grep "keyword" {} \; 在 /path 目录及其子目录下的所有文件中查找关键字“keyword”。
4. 如何输出到文件中:可以使用重定向符号 > 或 >> 将命令的输出保存到文件中。例如, command > output.txt 将命令的输出重定向到 output.txt 文件中,如果文件不存在则创建,如果文件存在则覆盖原有内容。 command >> output.txt 则是将输出追加到文件末尾。
八、死锁如何解决
1. 预防死锁:
- 破坏互斥条件:如果资源可以同时被多个进程访问,就不会发生死锁。但在很多情况下,资源的互斥性是必要的,所以这种方法不太实用。
- 破坏占有和等待条件:可以要求进程一次性申请所有需要的资源,而不是逐步申请。如果资源不可用,进程就等待,直到所有资源都可用。
- 破坏不可剥夺条件:允许进程剥夺其他进程占有的资源,但这需要谨慎处理,以避免出现资源分配不公平的情况。
- 破坏循环等待条件:对资源进行编号,要求进程按照编号顺序申请资源,这样就不会形成循环等待。
2. 检测死锁:
- 资源分配图法:通过绘制资源分配图来判断是否存在死锁。如果资源分配图中存在循环等待,则存在死锁。
- 银行家算法:模拟银行系统的资源分配策略,通过判断系统是否处于安全状态来检测死锁。
3. 解除死锁:
- 剥夺资源:从一些进程中剥夺它们占有的资源,分配给其他被阻塞的进程,以打破死锁。
- 撤销进程:终止一些进程,释放它们占有的资源,以解除死锁。选择撤销的进程可以根据进程的优先级、已运行时间、已占用资源等因素来决定。
九、Java 内存模型
Java 内存模型(Java Memory Model,JMM)定义了 Java 程序中变量的访问规则,以及在不同线程之间如何保证变量的可见性和有序性。
1. 主内存和工作内存:Java 内存模型将内存分为主内存和工作内存。主内存是所有线程共享的内存区域,用于存储 Java 程序中的实例变量、静态变量等。工作内存是每个线程私有的内存区域,用于存储该线程从主内存中读取的变量副本。
2. 变量的可见性:当一个线程修改了一个共享变量的值,其他线程能够立即看到这个修改。Java 内存模型通过 volatile 关键字、synchronized 关键字和 final 关键字等机制来保证变量的可见性。
3. 变量的有序性:在 Java 程序中,代码的执行顺序不一定与程序的编写顺序一致。Java 内存模型通过 happens-before 原则来保证变量的有序性。happens-before 原则规定了一些操作之间的先后顺序,例如,对一个 volatile 变量的写操作 happens-before 对这个变量的读操作。
十、多线程实现原理
在 Java 中,多线程可以通过继承 Thread 类或实现 Runnable 接口来实现。
1. 继承 Thread 类:创建一个继承自 Thread 类的子类,并重写 run 方法,在 run 方法中编写线程要执行的任务。然后创建这个子类的实例,并调用 start 方法启动线程。
2. 实现 Runnable 接口:创建一个实现了 Runnable 接口的类,实现 run 方法,在 run 方法中编写线程要执行的任务。然后创建一个 Thread 对象,将实现了 Runnable 接口的类的实例作为参数传递给 Thread 的构造函数,并调用 start 方法启动线程。
多线程的实现原理涉及到操作系统的线程调度机制。操作系统会为每个线程分配一定的时间片,让线程在 CPU 上执行。当一个线程的时间片用完后,操作系统会将 CPU 分配给另一个线程,从而实现多线程的并发执行。
十一、序列化与反序列化
1. 序列化:将对象转换为字节序列的过程称为序列化。在 Java 中,可以通过实现 Serializable 接口来使一个对象可序列化。序列化后的对象可以被存储在文件中、通过网络传输等。
2. 反序列化:将字节序列转换回对象的过程称为反序列化。在 Java 中,可以使用 ObjectInputStream 类的 readObject 方法来进行反序列化。
序列化和反序列化的主要作用是在不同的系统之间传递对象,或者将对象存储在持久化介质中,以便在需要时恢复对象。
十二、反射以及平时怎么使用
反射是 Java 语言提供的一种在运行时动态获取类的信息和调用类的方法、访问类的字段的机制。
1. 获取类的信息:可以使用 Class 类的方法来获取类的名称、包名、父类、实现的接口等信息。例如, Class clazz = Class.forName("com.example.MyClass"); 可以获取名为 com.example.MyClass 的类的 Class 对象。
2. 调用类的方法:可以使用 Method 类的方法来调用类的方法。例如, Method method = clazz.getMethod("methodName", parameterTypes); 可以获取名为 methodName 的方法的 Method 对象,然后使用 method.invoke(object, args); 来调用这个方法。
3. 访问类的字段:可以使用 Field 类的方法来访问类的字段。例如, Field field = clazz.getField("fieldName"); 可以获取名为 fieldName 的字段的 Field 对象,然后使用 field.get(object); 来获取这个字段的值。
在平时的开发中,反射可以用于以下场景:
1. 动态加载类:在运行时根据用户的输入或配置文件来加载不同的类,实现灵活的程序架构。
2. 框架开发:很多框架(如 Spring、MyBatis 等)都使用反射来实现自动装配、动态代理等功能。
3. 单元测试:可以使用反射来访问类的私有方法和字段,进行单元测试。
十三、MySQL 查询所有同学的总分
假设学生表为 students ,课程表为 courses ,成绩表为 scores ,学生表中有 student_id (学生 ID)、 student_name (学生姓名)等字段,课程表中有 course_id (课程 ID)、 course_name (课程名称)等字段,成绩表中有 student_id (学生 ID)、 course_id (课程 ID)、 score (成绩)等字段。可以使用以下 SQL 语句查询所有同学的总分:
sql
SELECT s.student_name, SUM(sc.score) AS total_score
FROM students s
JOIN scores sc ON s.student_id = sc.student_id
GROUP BY s.student_id, s.student_name;
十四、Redis 主从延迟怎么处理
1. 优化主从复制配置:
- 适当调整 repl-backlog-size 参数,增加复制缓冲区的大小,以容纳更多的复制积压数据。
- 合理设置 repl-timeout 参数,避免因为网络延迟等原因导致复制连接超时。
2. 监控主从延迟:
- 使用 Redis 的 INFO replication 命令可以查看主从复制的状态信息,包括主从延迟的时间。可以通过定时任务或监控系统来监控主从延迟,及时发现问题。
3. 避免大事务和大数据量操作:
- 在主库上尽量避免执行大事务和大数据量的写入操作,以免造成主从延迟。可以将大事务拆分成小事务,或者使用流水线技术来提高写入性能。
4. 增加从库数量:
- 可以增加从库的数量,分担主库的读取压力,减少主从延迟。同时,也可以提高系统的可用性和扩展性。
十五、Redis 高性能
1. 内存存储:Redis 将数据存储在内存中,避免了磁盘 I/O 的开销,因此具有非常高的读写性能。
2. 单线程模型:Redis 采用单线程模型,避免了多线程竞争和上下文切换的开销,同时也简化了代码的实现和维护。
3. 高效的数据结构:Redis 提供了多种高效的数据结构,如字符串、哈希表、列表、集合、有序集合等,可以根据不同的应用场景选择合适的数据结构,提高存储和查询效率。
4. 持久化机制:Redis 提供了两种持久化机制,即 RDB(快照)和 AOF(日志),可以将数据持久化到磁盘上,避免数据丢失。同时,也可以通过配置持久化策略来平衡数据的安全性和性能。
5. 集群和分布式架构:Redis 支持集群和分布式架构,可以将数据分布到多个节点上,提高系统的扩展性和可用性。同时,也可以通过主从复制和哨兵机制来实现高可用的架构。
十六、Redis 数据类型,持久化机制,缓存淘汰策略
1. 数据类型:
- 字符串(string):最基本的数据类型,可以存储任何类型的字符串值。
- 哈希表(hash):用于存储键值对的集合,其中键和值都是字符串类型。
- 列表(list):按照插入顺序排序的字符串列表,可以在列表的两端进行插入和删除操作。
- 集合(set):无序的字符串集合,不允许重复的元素。
- 有序集合(sorted set):每个元素都关联一个分数,可以按照分数进行排序的字符串集合。
2. 持久化机制:
- RDB(快照):将 Redis 数据库在某一时刻的数据保存到磁盘上,生成一个 RDB 文件。可以通过配置文件中的 save 参数来设置触发 RDB 快照的条件。
- AOF(日志):将 Redis 执行的所有写命令记录到 AOF 文件中,当 Redis 重启时,可以通过重新执行 AOF 文件中的命令来恢复数据。可以通过配置文件中的 appendonly 参数来开启 AOF 持久化。
3. 缓存淘汰策略:
- noeviction:当内存使用达到上限时,不进行淘汰操作,直接返回错误。
- volatile-lru:在设置了过期时间的键中,使用 LRU(最近最少使用)算法进行淘汰。
- volatile-ttl:在设置了过期时间的键中,优先淘汰剩余时间最短的键。
- volatile-random:在设置了过期时间的键中,随机淘汰。
- allkeys-lru:在所有的键中,使用 LRU 算法进行淘汰。
- allkeys-random:在所有的键中,随机淘汰。
啊,咱们俩面试的好像啊,我也答得稀巴烂😭
昨天视频面试,今天就发感谢信了
吐槽一下,虽然体验很好,但是问题大部分都是简历以外的东西,不太常规,比较细,所以答的稀碎,linux命令精确到参数这种,然后我也是都能答上几个点的,不过后续还是挂了,所以出路究竟在何方?三面三挂,现在无司可投,无笔可做。
真抽象啊 数字问这么多
这确定是测开,不是开发吗?
相关推荐
我从来没想过我会这样做:
点赞 评论 收藏
分享
投票
投递中信百信银行等公司10个岗位
点赞 评论 收藏
分享