测试开发备战秋招面试2

努力了那么多年,回头一望,几乎全是漫长的挫折和煎熬。对于大多数人的一生来说,顺风顺水只是偶尔,挫折、不堪、焦虑和迷茫才是主旋律。我们登上并非我们所选择的舞台,演出并非我们所选择的剧本。继续加油吧!

目录

1.python中列表和元组的区别?

2.深拷贝和浅拷贝的区别?

3.垃圾回收机制?

4.介绍下内连接和外连接,关键字是什么?

5.手写SQL代码:查询平均分低于80的同学的姓名,删除平均分大于60的同学?

6.OSI的7层协议,TCP三次握手四次挥手,为什么?

7.事务的定义和性质?

8.http和https的区别?https加密过程具体怎样实现的?

9.get和 post的区别?

10.linux指令:打开文件夹,打开目录?

11.面试界面有一个上传图片的图标,怎么测试?

12.测试和测开的理解?

13.算法题:最长重复子数组  

14.算法题:二叉树最小深度

15.针对于微信的评论功能设计测试用例?

16.浏览器从输入域名到渲染界面的全过程?详细说一下DNS解析过程?

17.算法题:最⻓无重复字符子串

18.在设计测试用例,编写测试方案需要注意与考虑什么,针对于需求的影响范围,是怎么考虑的?

19.HTTP与HTTPS,HTTPS的原理,建立安全连接的详细步骤?

20.使用Redis来存储商品信息,商品图片等静态⻚面;针对该功能如何设计测试方案?需要考虑哪些点?

验证基本功能

验证特殊场景

21.阻塞队列在线程池中的作用?

22.在做业务测试,接口测试需要考虑的点?

23.算法题:去除重复字母

24.跨域问题?

25.MySQL面经总结

26.操作系统总结


1.python中列表和元组的区别?

列表是动态数组,它们内容可变且可以重设长度(改变其内部元素的个数)。
元组是静态数组,它们不可变,且其内部数据一旦创建便无法改变,它的内容无法被修改或它的大小也无法被改变。
元组缓存于Python运行时环境,这意味着我们每次使用元组时无须访问内核去分配内存。

这些区别结实率两者在设计哲学上的不同:

列表可被用于保存多个互相独立对象的数据集合
元组用于描述一个不会改变的事务的多个属性
 

2.深拷贝和浅拷贝的区别?

  • 浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。
  • 深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。

3.垃圾回收机制?

 垃圾回收机制(Garbage Collction)简称GC,是为了防止内存泄漏

程序的运行必然申请内存资源,如果无效的对象不清理一直占用资源,那么肯定会导致内存溢出,所以内存资源的管理就很重要了。

在类的实例化对象被创建时,JVM会自动给该对象分配内存,调用该对象的构造方法并开始跟踪该对象。当该对象停止使用时,JVM便会通过垃圾回收器回收该对象所占的内存。

系统中每一个对象都有一个引用计数器,若一个对象被引用一次,引用计数器相应加1,减少一次引用,相应的引用计数器减1,以此类推,当引用计数器为0时,说明该对象需要被回收了。

引用计数法:通过引用计数器计数,对象没有引用就可以被回收。

标记清除算法:

标记:从根节点开始标记引用的对象。
清除:未被标记引用的对象就是垃圾对象,可以被清理。
标记压缩(整理)算法:根据老年代的特点提出的一种标记算法,标记过程与标记清除算法一致,在清理阶段则不是简单的清理,而是将存货的对象向一端压缩,然后清理边界以外的垃圾,解决碎片化的问题。

标记-复制算法:为了解决效率问题,标记复制算法出现了。复制算法的核心就是将内存一分为二,每次只用其中的一块,在垃圾回收时,将还存活的对象复制到另一个空间中,然后将内存空间清空,交换两个内存的角色,完成垃圾回收。

垃圾收集器:各种垃圾回收器实现垃圾回收。
 

4.介绍下内连接和外连接,关键字是什么?

1.内连接:只返回两个表中连接字段相等的行。inner join(等值连接) 只返回两个表中联结字段相等的数据
2.左外连接(也称左连接):返回包括左表中的所有记录和右表中连接字段相等的记录。以左表为基表,在from子句中使用关键字left outer join”或关键字“left join”来连接两张表。
3.右外连接(也称右连接):返回包括右表中的所有记录和左表中连接字段相等的记录。以右表为基表,在from子句中使用关键字“right outer join”或关键字“right join”来连接两张表。
4.全外连接:返回左右表中所有的记录和左右表中连接字段相等的记录。在from子句中使用关键字“full outer join”或关键字“full join”来连接两张表。

5.交叉连接(笛卡尔积):返回被连接的两个表所有数据行的笛卡尔积。返回结果集合中的数据行数等于第一个表中复合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
 


--语法(内连接模板)
select 列名
from 表名1
inner join 表名2
on 条件;

--语法(左外连接模板)
select 列名
from 表名1
left OUTER join 表名2
on 条件;

--语法(右外连接模板)
select 列名
from 表名1
right OUTER join 表名2
on 条件;

5.手写SQL代码:查询平均分低于80的同学的姓名,删除平均分大于60的同学?

create table score(
id varchar(10),
sname varchar(10),
sid varchar(20),
grade tinyint
) ;

select name
from score
group by sid 
having avg(grade) > 60 ;

delete from score 
group by sid 
having avg(grade) > 60 ;

6.OSI的7层协议,TCP三次握手四次挥手,为什么?

参考这篇博客的12和13,服务端开发之Java备战秋招面试3_nuist__NJUPT的博客-CSDN博客

7.事务的定义和性质?

所谓事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。例如,在关系数据库中,一个事务可以是一条SQL语句、一组SQL语句或者整个程序。

事务具有四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持续性(Durability)。这四个特性简称为ACID特性(ACID properties)。
1.原子性
事务是数据库的逻辑工作单位,事务中包括的诸操作要么都做,要么都不做。
2.一致性
事务执行的结果必须是使数据库从一个一致性状态变成另一个一致性状态。因此当数据库指包含成功事务提供的结果时,就说数据库处于一致性状态。如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分一写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。
3.隔离性
一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能相互干扰。
4.持久性
持续性也称永久性(Permanence),指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其执行结果有任何影响。
 

8.http和https的区别?https加密过程具体怎样实现的?

https = http + ssl加密

HTTPS 协议会对传输的数据进行加密,而加密过程是使用了非对称加密实现,准确地说,HTTPS 在内容传输的加密上使用的是对称加密,非对称加密只作用在证书验证阶段。

HTTPS 的整体过程分为证书验证和数据传输阶段,具体的交互过程如下:

  1. 浏览器发送Https请求,服务端返回证书,客户端先从服务器获取到证书,证书中包含公钥
  2. 客户端将证书进行校验,验证证书是否合法
  3. 客户端生成一个对称密钥,用证书中的公钥进行加密,发送给服务器
  4. 服务器得到这个请求后用私钥进行解密,得到该密钥
  5. 客户端以后发出后续的请求,都使用这个对称密钥进行加密。
  6. 服务器收到这个密文也用这个密钥进行解密。

9.get和 post的区别?

POST和GET都是HTTP请求的基本方法。最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。

1)GET请求在浏览器刷新或者回退的时候是无害的。POST的话数据会被重新提交。

2)GET可以存在缓存中。POST不行。

3)GET 编码格式只能用ASCII码,POST没有限制。

4)可见性 参数在URL用户可以看见,POST的参数在REQUSET BODY中不会被用户看见.GET相对不安全 POST相对安全些。

5)GET请求在URL中传送的参数是有长度限制的而POST么有。

6)GET 和POST在请求的时候:
6-1 GET 是将数据中的hearder 和 data 一起发送给服务端,返回200code
6-2 POST 是先将hearder发给服务器返回100continue,再发送data给到服务器,返回200
6-3 GET 就发送了一个TCP数据包给服务器而POST发送了两次TCP数据包给服务器
 

10.linux指令:打开文件夹,打开目录?

打开文件夹的方法使用:cd 文件夹 -----进入文件夹,ll ----查看文件夹里的文件

2、打开文件的方法: 编辑文件用 vi 文件名 或者 vim 文件名。 退出按ESC,输入:wq!回车。

查看文件用 cat 文件名 或 less 文件名

linux在命令行中进入文件夹采用命令cd (Change Directory)

11.面试界面有一个上传图片的图标,怎么测试?

对上传图片进行测试,比如上传微信头像的测试,主要考虑如下:文件类型和文件大小测试、上传时候的网络测试,不同分辨率测试,数据库测试,缓存测试,终端测试,兼容性测试等等 。

12.测试和测开的理解?

软件测试按照技术路线,划分为三个半方向,分别是自动化测试工程师、白盒测试工程师、性能测试工程师和认证测试工程师;前三者适用于通用软件测试领域,认证测试工程师乃嵌入式测试领域职位,至少目前仅出现在嵌入式领域。

测试开发:测试开发的核心还是测试工程师,并不是所了解的普通测试工程师,而是融合了测试的工作,以及开发的结合,可以用开发的技术去辅助测试的工作,研发测试的平台,测试的工具,测试的框架等。

13.算法题:最长重复子数组  

题目链接:最长重复子数组

class Solution {
    public int findLength(int[] nums1, int[] nums2) {
        int n = nums1.length, m = nums2.length ;
        //记录长度为n和m的数组的公共子数组长度
        int [][] dp = new int [n+1][m+1] ;
        int max = 0 ;
        for(int i=1; i<=n; i++){
            for(int j=1; j<=m; j++){
                if(nums1[i-1] == nums2[j-1]){
                    dp[i][j] = dp[i-1][j-1] + 1 ;
                    max = Math.max(dp[i][j],max) ;
                }
            }
        }
        return max ;
         
    }
}

14.算法题:二叉树最小深度

题目链接:二叉树的最小深度

思路:使用队列,层次遍历,若当前节点无左右子树,则该层为最小深度。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int minDepth(TreeNode root) {
        if(root == null){
            return 0;
        }
        Queue<TreeNode> queue = new LinkedList<>() ;
        queue.offer(root) ;
        int level = 0 ;
        while(!queue.isEmpty()){
            int x = queue.size() ;
            level ++ ;
            for(int i=0; i<x; i++){
                TreeNode node = queue.poll() ;
                if(node.left == null && node.right == null){
                    return level ;
                }
                if(node.left != null){
                    queue.offer(node.left) ;
                }
                if(node.right != null){
                    queue.offer(node.right) ;
                }
            }
        }
        return level ;
    }
}

15.针对于微信的评论功能设计测试用例?

一.功能测试
1.点击发表评论能否正常弹出输入框,输入框内是否显示默认文字;

2.正常评论的输入内容限制(中文,英文,数字,字符等),能否输入特殊字符,表情,图片,语音评论等;输入长度限制,支持的最短长度和最长长度,输入空;

3.是否对输入评论做过滤前后空格处理;

4.发表评论后对方及两人的共同好友可见,非好友不可见;且对方的朋友圈信息+1;

5.每个人发表评论以及该动态所允许评论个数有没有最大限制;

6.重复点击会不会发表重复的评论;

7.发表过的评论是否支持删除,本人可删除还是发表者可删除;

8.发表者是否可以与评论的好友正常回复消息,二人的共同好友是否可以回复消息;

9.评论之后退出该页面,再次进入朋友圈刷新评论消息是否还存在;

10.发表过的评论是否支持复制;

11.多条评论是否按照发表时间先后顺序显示还是按照最新回复时间显示;

12.评论能否显示评论人的昵称,若能显示是否正确 ;

13.评论后能否实时显示;

二.安全测试
1.是否对输入评论做敏感词汇处理;

2.被拉黑或者删除的好友不能发表评论;

3.未登录情况下能否访问发表评论接口;

4.用非好友的cookie信息,拿到好友的url,能否发表评论;

三.网络测试
1.wifi,热点,4g,5g;

2.不同运营商网络测试;

3.写评论或者点击发表时断网,是否提示友好;

4.网速较低时,是否有提示及响应时间是否可以接受;

5.网速导致的发送失败是否有重传机制;

四.中断测试
1.输入内容后返回,下次再点击评论,输入内容是否保留,以及这个下次有没有限制比如5分钟内?

2.切换到其他app再回到微信,会不会继续显示刚才的页面;

3.退出进程,再次打开微信会不会继续显示刚才的页面;

4.发表评论时有电话或者短信;

五.兼容性测试
1.不同机型,不同版本,不同客户端是否都支持评论;

六.易用性测试
1.页面布局是否与原设计效果图一致;(如输入框有内容,发送按钮高亮;内容清空,发送按钮置灰)

2.从测试和用户角度页面布局是否美观合理,操作是否简便,提示是否易于理解;

七.性能测试
1.大量用户并发评论时,该接口的响应时间是否符合用户期待,tps等性能参数是否合理;
 

16.浏览器从输入域名到渲染界面的全过程?详细说一下DNS解析过程?

1、DNS解析获取Ip地址     2、三次握手建立TCP连接    3、客户端发送请求

4、服务器处理和响应请求    5、浏览器解析并渲染响应内容     6、TCP四次挥手断开连接

DNS域名解析的具体过程:

第一步:客户机提出域名解析请求,并将该请求发送给本地的域名服务器.

第二步:当本地的域名服务器收到请求后,就先查询本地的缓存,如果有该纪录项,则本地的域名服务器就直接把查询的结果返回.

第三步:如果本地的缓存中没有该纪录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务器再返回给本地域名服务器一个所查询域(根的子域)的主域名服务器的地址.

第四步:本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自己的缓存,如果没有该纪录,则返回相关的下级的域名服务器的地址.

第五步:重复第四步,直到找到正确的纪录.

第六步:本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时还将结果返回给客户机.

17.算法题:最⻓无重复字符子串

题目链接:无重复的最长字符串

思路:借助队列实现,依次记录连续不相等最长子串即可。

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int max = 0 ;
        Queue queue = new LinkedList<>() ;
        for(int i=0; i<s.length(); i++){
            while(queue.contains(s.charAt(i))){
                queue.poll() ;
            }
            queue.offer(s.charAt(i)) ;
            max = max > queue.size() ? max : queue.size() ;
        }
        return max ;
    }
}

18.在设计测试用例,编写测试方案需要注意与考虑什么,针对于需求的影响范围,是怎么考虑的?

  1、复用率,随产品不断升级,需要涉及更详细些,可一劳永逸;如仅使用一两次,没必要写的太仔细。

  2、项目进度,时间允许可详尽,时间紧可执行即可。

  3、使用对象,如果供多人使用,尤其让后参加测试的工程师来执行,则需要设计的更加详细些。

  4、关注有效功能,大多数情况:我们不太可能在一个测试用例包含全部测试要求,因为众多的功能及不同的路径组合将使测试用例步骤繁多,操作复杂,或者完全不具可操作性。说这些并不是意味为需求中定义的每个功能和特性,编写一个或多个测试用例,只要把握好适度即可。

  如何区分有效功能:

  第一点,这个功能是可以还原到用户原始的手工业务流程中去的。

  第二点,这个功能是否标志用户实际业务的一个阶段性结束,并且这项业务完成后,被完成的业务实体是否可以交付给其他用户或业务供完成下面的工作?

  5、做好需求分析,这里的需求包含显示和隐式需求,根据需求文档将不同需求来源划分成一个个需求点,针对每小点进行测试分析,界定测试范围,并运用多种测试用例设计方法产生测试节点。

  6、注重测试用例评审,评审会以检验功能是否覆盖完全,评审会成员有设计,开发,测试及专家成员。

19.HTTP与HTTPS,HTTPS的原理,建立安全连接的详细步骤?

https = http + ssl加密

HTTPS 协议会对传输的数据进行加密,而加密过程是使用了非对称加密实现,准确地说,HTTPS 在内容传输的加密上使用的是对称加密,非对称加密只作用在证书验证阶段。

HTTPS 的整体过程分为证书验证和数据传输阶段,具体的交互过程如下:

  1. 浏览器发送Https请求,服务端返回证书,客户端先从服务器获取到证书,证书中包含公钥
  2. 客户端将证书进行校验,验证证书是否合法
  3. 客户端生成一个对称密钥,用证书中的公钥进行加密,发送给服务器
  4. 服务器得到这个请求后用私钥进行解密,得到该密钥
  5. 客户端以后发出后续的请求,都使用这个对称密钥进行加密。
  6. 服务器收到这个密文也用这个密钥进行解密。

20.使用Redis来存储商品信息,商品图片等静态⻚面;针对该功能如何设计测试方案?需要考虑哪些点?

可以参考这篇博客:https://www.cnblogs.com/chenxiaomeng/p/16736024.html

验证基本功能

  • 缓存增加:

    • 增加缓存,校验功能和数据是否正确,DB 中的数据跟 Redis 是否一致,缓存过期时间与设计是否一致;

  • 缓存更新:

    • 更新缓存,校验功能和数据是否正确,DB 中的数据跟 Redis 是否一致;缓存过期时间与设计是否一致;

    • 对同一条数据并发执行更新和查询操作,校验功能和数据是否正确,DB 中的数据跟 Redis 是否一致;缓存过期时间与设计是否一致;

  • 缓存删除:

    • 删除缓存,校验功能和数据是否正确,再次请求,缓存是否被正确写入,DB 中的数据跟 Redis 是否一致;

  • 缓存过期:

    • 设置 Redis 过期时间,校验缓存是否正常过期失效。再次写入缓存,缓存过期时间被更新。(可通过修改服务器时间或手动修改缓存的 TTL)

  • 缓存读取:

    • 校验数据在缓存和 DB 中都存在时,系统功能是否正常;

    • 校验数据在 DB 存在,但缓存中不存在时,系统功能是否正常;

    • 校验数据在缓存和 DB 中都不存在时,系统功能是否正常;

    • 验证 DB 返回的数据异常时,没有去缓存;

验证特殊场景

  • 缓存超时:

    • 校验缓存查询达到超时时间后,未返回指定的数据,对系统的影响。

  • 缓存穿透:

    • 不断查询一个 DB 和缓存中一定不存在的数据,验证返回数据为空。

  • 缓存雪崩:

    • 校验缓存是否采用了相同的过期时间。如果缓存大指量同时失效,验证系统功能是否正常,性能指标是否正常。

  • 缓存击穿:

    • 缓存中的数据没有人查询过 ,第一次就大并发的访问;

    • 缓存中的某条数据刚好失效后,就进行大并发访问,校验功能是否正常,各项性能指标是否正常。

  • 缓存预热:

    • 大批量缓存在同一时间点过期,验证缓存预热耗时及预热时机。

    • 在缓存预热期间请求更新接口和查询接口,验证返回数据的正确性。

  • 缓存上限:

    • 校验缓存淘汰参数配置与预期一致:增加缓存至达到 maxmemory 限制时(可修改 redis.conf 配置文件中配置的最大可用内存值),再次请求查询,数据返回正确,且缓存淘汰正确。

  • 缓存停服:

    • 校验关闭缓存服务后,系统功能和性能的运行情况。

    • 验证重启 Redis 服务后,请求查询返回的数据正确,DB 中的数据跟 Redis 一致。

  • 测试并发:

    • 并发请求缓存中有的数据,校验返回数据是否正确,各项性能指标是否正常。

    • 并发请求缓存中没有但 DB 中有的数据,校验返回数据是否正确,各项性能指标是否正常。

    • 并发请求缓存中没有 DB 中也没有的数据,校验返回数据是否为空,各项性能指标是否正常。

  • 性能测试:一般用 redis-benchmark 测试一些场景的性能基准,比如:

    • 对比单机和集群 Redis 吞吐量;

    • 评估不同类型的存储性能;

    • 对比开启和关闭持久化的吞吐量;

    • 对比调优前后的吞吐量;

    • 对比不同版本的 Redis 的吞吐量;

21.阻塞队列在线程池中的作用?

阻塞队列通过阻塞可以保留住当前想要继续入队的任务,因为相对于普通队列,阻塞队列具有阻塞的作用,就是让当前请求阻塞,当队列中有空地方则加入。

1. 阻塞队列通过阻塞可以保留住当前想要继续入队的任务。

2. 阻塞队列可以保证任务队列中没有任务时阻塞获取任务的线程,使得线程(当没有任务时,阻塞核心线程)进入wait状态,释放cpu资源。

3. 阻塞队列自带阻塞和唤醒的功能,不需要额外处理,无任务执行时,线程池利用阻塞队列的take方法挂起,从而维持核心线程的存活、不至于一直占用cpu资源。

22.在做业务测试,接口测试需要考虑的点?

是否有依赖业务,比如查看订单,需要用户登录

逻辑业务测试:传递正确的参数,接口对数据库进行查询操作,需要去验证数据库查询是否正确,接口对数据库进行增删改操作也需要验证数据库是否同步了这些操作。

23.算法题:去除重复字母

题目链接:去除重复字母

思路:用一个栈维护答案字符,本题三个目标:去重、保持相对位置、字典序。

class Solution {
    public String removeDuplicateLetters(String s) {
        Stack<Character> stack = new Stack<>() ;
        for(int i=0; i<s.length(); i++){
            if(stack.contains(s.charAt(i))){
                continue ;
            }
            while(!stack.isEmpty() && s.charAt(i) < stack.peek() && s.indexOf(stack.peek(),i) != -1){
                stack.pop() ;
            }
            stack.push(s.charAt(i)) ;
        }
        String res = "" ;
        for(char ans : stack){
            res += ans ;
        }
        return res ; 
    }
}

24.跨域问题?

跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。

例如:a页面想获取b页面资源,如果a、b页面的协议、域名、端口、子域名不同,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源。注意:跨域限制访问,其实是浏览器的限制。理解这一点很重要!!!

同源策略:是指协议,域名,端口都要相同,其中有一个不同都会产生跨域;


解决跨域问题:nginx实现跨域,就是把web项目和后端接口项目放到一个域中,这样就不存在跨域问题,然后根据请求地址去请求不同服务器(真正干活的服务器)。

25.MySQL面经总结

参照这篇博客:MySQL面经_mysql后端面经_wink22的博客-CSDN博客

26.操作系统总结

参照这篇博客:操作系统总结_wink22的博客-CSDN博客

猜你喜欢

转载自blog.csdn.net/nuist_NJUPT/article/details/129677355