⭐️前言⭐️
本文记录博主面试北京某大厂所记录的面经,回答答案仅供参考。
🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁
🍉博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言
🍉博客中涉及源码及博主日常练习代码均已上传GitHub
📍内容导读📍
- 🍅一面
- 🍅二面
🍅一面
1、为什么选择测试的岗位?
首先,个人对软件测试是比较感兴趣的,我喜欢在软件中发现错误、解决问题和提高软件质量;其次,软件测试岗位需要的一些特质和能力是比较契合我的,比如说沟通能力、耐心和细心等方面;最后,我想谈下我对软件测试的理解,一个产品在完成开发后,不经过我们测试是不敢轻易上线的,那样将会把bug遗留给用户,直接造成公司的损失,这也让我认识到了这个岗位的重要性。
2、用到的测试工具有哪些?
Postman、Fiddler、selenium
3、为什么选择selenium作为web自动化测试工具?
1)开源免费
2)支持多浏览器。如Chrome、Firefox、edge浏览器等
3)支持多系统。如Linux、Windows、MacOS
4)支持多语言。Java、python、CSharp、Roby、JavaScript
5)selenium包提供了很多可供测试使用的API
4、分享一下项目中最有成就感的一个点
5、针对项目的登录模块设计测试用例
6、讲一种设计模式,以及你在什么场景下用到了这种设计模式
代理模式
通过创建一个代理对象来控制另一个对象的访问Spring AOP,Spring AOP的实现关键就是动态代理,有两种方式JDK Proxy 和 CGLIB .
Spring AOP本质就是生成了一个目标对象的代理类,当前端传来请求时,不会将请求直接交给目标对象,而是首先由代理类进行处理,如果满足一定的条件,才会将请求交给目标对象.
比如:如果处理请求前需要登录验证,那么代理类会去验证用户是否登录,如果用户登录了才会将请求交给目标对象并执行核心业务代码,否则代理类将返回响应让用户先登录。
7、如何针对项目去进行接口测试的
根据接口文档分析设计出接口测试用例,利用接口测试工具,比如PostMan输入请求,查看是否能获得预期的响应结果,如果异常可以进一步通过抓包工具Fiddler来获取请求与响应的具体信息(请求的请求头,请求正文;响应的状态码,响应数据格式等信息),进一步排查接口。
8、自动化的稳定性高吗
9、讲一下索引
索引就与书的目录作用相同,是为了提高查询的效率。
主键索引:数据列不允许重复,不允许为NULL,一个表只有一个主键。
唯一索引:数据列不允许重复,允许为NULL,一个表允许多个列创建唯一索引。
普通索引:基本的索引类型,没有唯一性的限制,允许为NULL值。
全文索引:是目前搜索引擎使用的一种关键技术,对文本的内容进行分词、搜索。
复合索引(或称联合索引):复合索引是一种同时包含多个列的索引类型,它可以对多个列进行索引,适用于多条件查询和排序。
聚簇索引:聚簇索引是一种特殊的索引类型,它将数据按照索引列的值进行排序,并将相邻的数据行存储在一起,适用于频繁按照索引列进行查询和排序的情况。
10、索引是越多越好吗?
坏处:
1.索引占用磁盘空间
2.降低插入、更新、删除的效率
3.索引会增加数据库的复杂性,需要对其进行优化和维护。
所以不是越多越好。
11、SpringBoot的核心设计思想
1、约定由于配置:通过一些默认约定来减少配置的复杂性,使得开发者可以更快的搭建一个基于Spring的应用程序。
2、开箱即用:提供一组默认的配置和依赖,使得开发者可以快速地创建一个可用的应用程序,而不必进行大量的手动配置。
3、自动化配置:自动配置Spring框架中的各种组件,如数据源、事务管理、Web应用程序等,开发者可以通过简单的配置文件来进行自定义。
4、模块化设计:讲应用程序分为多个模块,每个模块都有独立的功能和职责,使得应用程序更加灵活和易用。
5、注解驱动:通过注解来驱动应用程序的行为,简化开发过程,提高开发效率。
12、初始化顺序
父类静态代码块-〉子类静态代码块-〉父类代码块-〉父类构造方法-〉子类代码块-〉子类构造方法
13、String a=“ab”,String b=“a”+“b”,a==b true还是false,为什么
false,因为==
比较两个对象的内存地址是否相同,即是否是指向相同一个对象,如果是一个对象才会返回true,否则返回false。
如果是比较内容是否相同,应该用equals
来进行比较。
14、如何进行白盒测试
白盒测试是基于内部代码结构和实现逻辑的测试。
白盒测试的测试用例:
- 语句覆盖:测试执行所有代码,测试用例需要覆盖所有的条件语句、循环语句、异常处理语句、判断语句等,以保证程序的正确性。
- 路径覆盖:测试每个代码的每个路径,以检验程序在不同的路径下的行为是否正确。
- 边界值分析:针对输入参数的边界值进行测试,以检验程序在边界条件下的行为是否正确。
15、左外连接关键字
left join on
16、SQL:一个表中有学生姓名,语数英科目的成绩,找出各科成绩都大于80分的学生姓名
select name from table_name where math_score >80 and chinese_score >80 and english_score >80
17、SQL:一个表中有学生姓名,语数英科目的成绩,找出数学成绩在120~130之间的学生姓名
select name from table_name where math_score >=120 and math_score <=130
18、Linux命令
列举了常见的linux命令
19、查看日志的命令
● tail -f filename:查看日志(默认最后10行)
● cat -n filename | grep “关键字”:查看日志
20、如何分析日志
- tail 命令可以用来查看日志文件的最新内容,例如 tail -f /var/log/syslog 可以实时查看系统日志的更新。
- grep 命令可以用来搜索关键字,例如 grep “error” /var/log/syslog 可以查找系统日志中所有包含 “error” 的行。
- less 命令可以用来分页查看日志文件的内容,例如 less /var/log/syslog 可以打开系统日志文件并分页浏览其中的内容。
21、抽象类和接口、抽象类中的所有方法都需要实现吗
1、抽象类可以包含非抽象方法,但接口中只能包含抽象方法。
2、类只能继承一个抽象类,但可以实现多个接口。
3、抽象类的目的是实现代码重用,而接口则是为了实现多态性和松耦合。
4、抽象类可以包含构造方法,但接口不能包含构造方法。
5、抽象类中的方法可以有访问修饰符,但接口中的方法都是公共的。
抽象类中的非抽象方法不需要实现。
22、算法题:
题目:
第 i 个人的体重为 people[i],每艘船可以承载的最大重量为 limit。
每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。
返回载到每一个人所需的最小船数。(保证每个人都能被船载)。
题解思路:
首先,对体重数组进行排序,然后用双指针来解该题,前指针指向数组头,后指针指向数组尾,如果指针指向的两个数之和<=
limit,就让count++,left++,right–,
如果两个数之和>
limit,那就让让船只乘体重较大的一个人,即right–,count++。
代码实现:
public class Main {
public static int numRescue(int[] people,int limit) {
Arrays.sort(people);
int left=0,right=people.length-1;
int count=0;
while (left<=right) {
if(people[left]+people[right]<=limit){
left++;
}
right--;
count++;
}
return count;
}
public static void main(String[] args) {
int[] people=new int[]{1,2};
int limit=3;
System.out.println(numRescue(people, limit));
}
}
23、期望的测试开发工作的工作内容
七分测试,三分开发
🍅二面
1、项目设计初衷
2、分享一下开发过程中遇到的问题以及它这个难点,难点是如何解决的
3、Spring、Spring Boot、Spring MVC的区别
Spring是包含了众多工具方法的IOC容器
Spring Boot是为了简化Spring开发而产生的脚手架。
Spring MVC是一个基于MVC设计模式和Servlet API实现的Web项目,同时Spring MVC又是Spring框架中的一个Web模块,它是随着Spring的诞生而存在的一个框架。
4、synchronized的缺点
1、性能问题:synchronized会导致线程阻塞,等待获取锁,将会影响程序性能。
2、可能会导致死锁:如果多个线程中使用synchronized同步代码块或方法时,出现了相互等待对方释放锁的情况。就会导致死锁,死锁会导致程序无法执行,甚至整个系统崩溃。
3、无法实现线程协作:synchronized需要等待某个事件完成后再执行后续操作
4、不够灵活:synchronized的同步粒度较粗,只能将整个方法或代码块加锁,不能对方法内部的某些语句块进行加锁或者选择不同的锁策略。
针对这些缺点,Java 提供了一些替代方案,如 ReentrantLock、Semaphore、CountDownLatch 等同步工具类,它们提供了更灵活、更高效、更安全的同步机制,可以根据具体情况选择合适的同步方式。
5、自己用过synchronized吗,项目中遇到过上边出现的问题吗
在多线程制作索引的时候,无法实现线程协作,就通过线程池+CountDownLatch的方式,来共同实现多个线程协同完成解析制作索引的过程。
6、如何对自己的项目进行测试的,第一个项目,详细针对功能方面来设计测试用例
我的第一个项目是一个Java API搜索引擎项目,来针对该项目的搜索功能,可以设计以下方面的测试用例。
功能测试:
1、输入关键字进行搜索:测试搜索结果是否符合预期,包括搜索结果数量、排序、过滤等方面。
2、搜索结果页面展示:测试搜索结果页面是否展示正常,包括页面布局、搜索结果列表、分页、相关推荐等方面
3、大小写支持
性能测试:
测试搜索引擎在不同的搜索请求量、并发数、网络延迟等情况下的响应速度、吞吐量、稳定性等方面。
界面测试:
搜索框大小,搜索按钮布局合理性
易用性测试:
1、搜索历史记录:测试搜索历史记录功能是否正常,包括记录数量、清除历史记录,搜索历史提示等方面。
2、大小写支持
兼容性测试:
浏览器兼容性:测试搜索引擎在不同浏览器、不同版本下的兼容性,包括页面展示、搜索结果展示.
安全性测试:
测试搜索引擎是否存在安全漏洞,包括 SQL 注入、XSS 攻击、CSRF 攻击、敏感信息泄露等方面。
7、map和HashMap
两者都是Java集合中的框架,其中HashMap是Map接口的一种实现。
Map:
Map接口表示映射表,它包含一个键和一个值之间的映射关系。
Map接口提供了键值对的操作方法,如put、get、containsKey、containsValue、remove等。Map接口的常用实现类有HashMap、TreeMap、LinkedHashMap等。
HashMap:
HashMap是基于哈希表实现的,它的底层数据结构是数组和链表(或红黑树),使用哈希函数将键映射为索引,以实现快速的插入、删除和查找操作。
具体的说,哈希函数会将键值对的键映射为一个整数,这个整数可以作为数组的索引。当不同的键值通过哈希函数映射到同一位置时,会产生哈希冲突,这时HashMap使用链表来存储这些键值对,当链表长度超过阈值(8)时,链表会被转化为红黑树。
8、如何遍历HashMap
1、遍历键值对:使用entrySet方法获取Map.Entry的Set视图,然后使用for-each循环遍历Set,再通过Map.Entry的getKey和getValue方法获取键和值。
代码示例:
Map<String,Integer> map=new HashMap<>();
// 添加键值对
map.put("A",1);
map.put("B",2);
map.put("C",3);
// 遍历键值对
for(Map.Entry<String,Integer> entry:map.entrySet()) {
String key=entry.getKey();
Integer value=entry.getValue();
System.out.println(key + ": " + value);
}
2、遍历键或值:使用keySet或values方法获取键或值的集合视图,然后使用for-each循环遍历集合。
代码示例:
Map<String,Integer> map=new HashMap<>();
// 添加键值对
map.put("A",1);
map.put("B",2);
map.put("C",3);
// 遍历键
for(String key:map.keySet()) {
System.out.println(key);
}
// 遍历值
for(Integer value:map.value()) {
System.out.println(value);
}
9、怎样来学习Java的,看书?看什么书
《Java核心技术》
10、Linux命令
11、awk了解吗
12、如何学习selenium的?
结合技术博客和视频
13、如何对项目进行自动化测试的?
通过JUnit+selenium工具,编写了web端的ui自动化脚本代码,做了自动化测试。
14、spring的难点
依赖注入思想的理解,控制反转的颠覆
15、算法题:输出英文字符串中出现频率最高的三个字母
题解思路:
首先通过长度为26的数组,遍历字符串,完成每个字母出现次数的统计,再通过优先级队列,把出现过的字母抽象成类放入优先级队列中,排序规则为次数大小,那么弹出优先级队列的前三个即为前三个字母。
代码实现:
public class Test {
static class Num{
char ch;
int count;
public Num(char ch, int count) {
this.ch = ch;
this.count = count;
}
}
public static void main(String[] args) {
String s="abcdaacc";
char[] chs=s.toCharArray();
PriorityQueue<Num> queue=new PriorityQueue<>(new Comparator<Num>() {
@Override
public int compare(Num o1, Num o2) {
return o2.count-o1.count;
}
});
int[] arr=new int[26];
for(char c:chs) {
arr[c-'a']++;
}
for (int i = 0; i < 26; i++) {
if(arr[i]==0) continue;
char ch=(char)(i+'a');
Num num=new Num(ch,arr[i]);
queue.offer(num);
}
for(int i=0;i<3;i++) {
Num num=queue.poll();
System.out.println(num.ch);
}
}
}
⭐️最后的话⭐️
总结不易,希望uu们不要吝啬你们的👍哟(^U^)ノ~YO!!如有问题,欢迎评论区批评指正😁