面试宝典

发布时间 2023-12-12 17:59:42作者: AiniIT琦玉
  • 面试宝典
    • 测试基础
      • QA和QC的区别
        • QC主要是发现BUG
        • QA不但要找BUG,更主要的是预防BUG的产生
      • 验收测试的标准
        • 需求说明中都已经实现
        • 性能指标达到要求
        • 没有严重性的BUG
        • 需求文档、设计文档、接口文档、测试用例、测试计划、测试报告
      • 研发流程
        • 需求分析阶段、需求评审阶段、测试用例评审阶段、测试阶段
      • 如何避免漏测
        • 分析清楚需求文档,跟产品沟通清楚
        • 尽可能让用例覆盖面积广泛一些
        • 通过用例评审来丰富用例
      • 测试的顺序
        • 冒烟测试-系统测试-回归测试
      • 测试组长如何保证测试质量
        • 项目流程的规范程度:包括需求管理、开发流程、测试流程
        • 项目资源的充分程度:人效、时间、环境、工具
        • 项目技术的高度:测试计划合理性、设计用例全面性、颗粒度、测试执行的充分性
      • 软件测试的原则
        • bug发现越早越好
        • bug发现的越多,证明还有bug没有发现
        • 不管测试用例覆盖多全面还是会有bug发生
        • 基于需求来测试
      • 开发提测质量差怎么办
        • 通过日报来查看进度,及测试风险
        • 主流程测试堵塞优先修复主流程测试问题
        • 开发进行代码复查
        • 丰富提供的自测用例
      • 测试用例具体方法
        • 等价类
          • 有效等价类
          • 无效等价类
        • 边界值
        • 错误推导法
        • 场景法
        • 因果图法
        • 评定表法
      • 给定一个项目如何进行测试
        • 分析需求
        • 制定测试计划
        • 编写测试用例
        • 执行测试用例
      • 公司日报
      • bug内容
        • 标题、重现步骤、测试结果、期待结果、优先级、严重程度、附件、发起人、截图、环境、模块
      • 提交高质量bug
        • 有效bug:和需求对比
        • 开发人员能看懂,详细的写出bug的内容步骤
      • 如果你认为是bug开发不认为是bug
        • 确实不是的话那就关闭bug
        • 仔细核对需求文档,确实是个bug,再向开发人员详细的描述这个bug的内容,影响,及判断理由
      • bug生命周期
        • 提交-确认-分配-修复-验证-关闭
      • 偶发性bug怎么处理
        • 原则性不能放过,努力让bug重现,并记录
        • 无法复现,则持续跟踪几个迭代周期后加入无法复现中
      • 上线之后发生bug
        • 如果在过程中,严重的我们立即回滚,不严重则下个版本迭代更新
        • 在上线后,判断是否可以回滚修改,如果不可以,就紧急发修复版本,如果可以则回滚处理,并分析问题的产生,加入到缺陷库中,避免以后发生
      • bug优先级严重性
        • 优先级,针对于bug处理的等级
        • 严重性,针对于软件的危害程度
      • 测试计划
        • 制定实现可行的,综合的计划
        • 角色的责任和工作内容
        • 确定测试需要的时间资源
        • 确定每个测试阶段测试成功的标准
        • 指出测试活动中风险
      • http与https区别
        • 区别
          • http协议是以明文方式发送内容,不提供任何方式的数据加密,http协议不适合传输一些敏感信息,比如支付密码,银行卡号等。https是具有安全性的ssl加密传输协议。http与https使用的是完全不同的连接方式,用的端口也不一样,前者是80端口,后者是443。并且https需要到ca申请整数。https协议要比http更安全
        • 实现原理
          • 浏览器发送请求url给服务器,服务器返回一个公钥给浏览器,浏览器根据ca证书验证公钥,浏览器验证成功后,随机生成一个密钥,并用服务器的公钥加密,之后浏览器的请求携带加密后的密钥传输,服务器使用私钥解密得到密钥,并且服务器返回使用密钥加密请求的url的响应报文
      • 状态码
        • 1xx:接受的请求正在处理
        • 2xx:请求成功,处理完毕
        • 3xx:重定向,需要附加操作才可以完成请求
          • 301:指向资源被删除
          • 302:指明临时资源新位置
          • 304:用户发出条件式请求,服务器资源没改变
        • 4xx:客户端错误状态码
          • 401:输入验证方式访问资源
          • 403:请求被禁止
          • 404:无法找到
        • 5xx:服务器错误状态码
          • 502:代理服务器从后端服务器收到一条伪相应,连接不到网关
          • 503:服务不可用,临时服务器服务过载,无法处理请求
          • 504:网关超时
      • post和get区别
        • get没有body
        • get请求参数在url中,post在body中
        • post比get安全
        • get参数大小有限制
        • get一般用来查询,post一般发送加密数据
      • cookie与session
        • cookie
          • 是针对每个网站的信息,每个网站只能对应一个,其他网站无法访问,这个文件保存在客户端,每次您拨打相应网站,浏览器都会查找该网站的 cookies,如果有,则会将该文件发送出去。cookies文件的内容大致上包括了诸如用户名、密码、设置等信息。
        • session
          • 是针对每个用户的,只有客户端才能访问,程序为该客户添加一个 session。session中主要保存用户的登录信息、操作信息等等。此 session将在用户访问结束后自动消失(如果也是超时)。
        • 区别
          • 对象不同:cookie针对网站信息,session针对用户信息
          • 存储大小不同:一个cookie最多不超过3k,session在服务器存储
          • 生命周期不同:cookie在浏览器关闭的时候就灭亡了,session生命周期式有时间间隔的
          • 存放位置不同:cookie在客户端,session在服务器
          • 数据类型不同:cookie是字符串类型,session是java中object类型
          • 安全强度不同:cookie弱一些
      • token与session
        • 区别
          • 定义不同:Cookie是在客户端存储的小型文本文件,由服务器在HTTP响应头中设置并发送到客户端,客户端收到Cookie后会自动存储在本地。而Token是一段经过加密处理的字符串,通常存储在客户端的浏览器缓存、localStorage或sessionStorage中,也可以存储在服务器的数据库中。
          • 安全性不同:Cookie存储在客户端,容易被窃取或篡改,因此需要对其内容进行加密或签名保护,以防止信息泄露或被篡改。而Token通常采用加密算法进行加密和签名,确保传输过程中的安全性,并防止信息被篡改。
          • 可扩展性不同:Cookie和Token在可扩展性方面有很大的区别。Cookie只能存储有限的信息,例如用户ID、过期时间、域名等。而Token可以存储更多的信息,例如用户角色、权限、访问时间等,更加灵活,也更加适合大规模的应用程序。
          • 跨域支持不同:Cookie有一个很明显的限制,即只能存储在设置Cookie的域名下,不能跨域使用。而Token可以跨域使用,适用于分布式系统或跨域API请求。
          • 对服务器造成压力不同:由于Cookie存储在客户端,因此每次请求都需要将Cookie发送给服务器,服务器需要验证并响应请求,如果Cookie过多,服务器的压力会非常大;而Token存储在客户端,服务器只需要验证Token的有效性即可,可以大大减轻服务器的压力。
          • 时效性不同:Cookie通常需要设置过期时间,过期后需要重新获取。而Token可以设置长时间的有效期,以减少频繁获取的次数,提高应用程序的性能。
      • 接口测试设计用例时需要关注的点
        • 入参类型长度、业务含义
        • 返回值的准确性
        • 数据库相应改变
        • 上下游数据的特殊场景
        • 数据的来源
        • 前后端兼容性测试
    • 数据库
      • 常用语法
        • create database/table;创建数据库、表

        • alter table class add id primary key;主键约束

        • class_name varchar(10) not null;非空约束

        • class_name date varchar(10) default '1';默认值约束

        • alter table class modify class_name int auto_increment;默认值约束

        • class_name date varchar(10) ssex enum('1','2')检查约束

        • alter table class modify class_name int unique;唯一约束

        • alter table class add foreign key(tno) references teachar(tno) on delete restrict on update cascade;外键约束

        • insert into <表名>(字段列表) values(值列表);插入

        • update 表名称 set 字段名=值,... [where子句];修改表

        • delete from 表名称 [where子句];删除数据

        • inner join,left join, right join,表连接

        • 统计:

          count(字段) 语法: select count(字段) from 表名 条件

          求和: sum(字段) 语法: select sum(字段) from 表名 条件, 只有数字类型的字段才可以进行求和

          求平均值:avg 语法: select avg(字段) from 表名 条件, 只有数字类型的字段才可以进行求平均值

          求最大值:max 语法: select max(字段) from 表名 条件, 只有数字类型的字段才可以进行求平均值

          求最小值:min 语法: select min(字段) from 表名 条件, 只有数字类型的字段才可以进行求平均值

        • group by分组,与having连用,在having后添加条件

        • order by排序

        • -- sql语句执行的顺序 是 从where 开始 --- 分组 --- having ----排序----limit

        • 子查询;select 字段,.... from 表名, where 字段 比较/匹配操作符(select 字段 from 表名 where 条件 )

      • 数据库事务:表的引擎需要是高级引擎,只有高级引擎才支持事物,回滚需要在提交之前
        • 原子性:组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。换句话说,事务是不可分割的最小单元。例:银行转帐过程中,必须同时从一个帐户减去转帐金额,并加到另一个帐户中,只改变一个帐户是不合理的。
        • 一致性:在事务处理执行前后,数据库是一致的。也就是说,事务应该正确的转换系统状态。例:银行转帐过程中,要么转帐金额从一个帐户转入另一个帐户,要么两个帐户都不变,没有其他的情况。
        • 隔离性:一个事务处理对另一个事务处理没有影响。就是说任何事务都不可能看到一个处在不完整状态下的事务。例:银行转帐过程中,在转帐事务没有提交之前,其他的操作都可以进行,不会互相影响。
        • 持久性:事务处理的效果能够被永久保存下来。反过来说,事务应当能够承受所有的失败,包括服务器、进程、通信以及媒体失败等等。例:银行转帐后帐户的状态要能被保存下来
    • Linux
      • 常用语法
        • pwd显示当前目录
        • mkdir创建目录
        • mv重命名文件、剪切
        • cp文件拷贝
        • vi编辑文件
        • rm删除文件目录
        • touch创建空白文件
        • find遍历当前系统文件或目录
        • grep根据文本内容指定查找
        • cat显示文件内容
        • head、tail从文件首尾进行查看
        • more分页显示文件内容、适用于大文件查看
        • chromd修改文件权限
        • chown修改文件所有者
        • chgrp修改文件所属用户组
        • >:新建重定向,清除源文件内容写入新内容
        • >>:追加重定向,追加写入内容
        • netstat -tunlp | 端口/查找名称,查看占用端口
        • ps查看进程信息
        • kill杀死进程
        • tar-zcf压缩文件
        • tar -zxf解压缩文件
        • zip压缩解压文件;需要自行安装;压缩必须添加-r参数
        • unzip解压缩zip结尾文件
      • rpm包
        • 是官方提供的编译包,很多centos系统中的包或工具都以来rpm包进行升级和安装
        • rpm -ivh安装
        • rpm -e卸载
        • rpm -uvh升级
      • 安装包
        • yum instal -y zip安装zip
    • 性能测试
      • 实现接口测试的流程
        • 添加线程组
        • 添加http请求
        • 添加信息头管理器
        • cookie管理器
        • 请求默认值
        • 正则表达式提取器
        • 调试取样器
        • 查看结果树
        • 统一随机定时器:设置思考时间
        • 事务控制器
        • 阶梯式压测插件
        • 聚合报告
        • 汇总报告
        • ServerAgent服务器监控插件
      • 正则表达式
        • 点-匹配所有字符
        • 星号-重复匹配任意次
        • 加号-重复匹配多次
        • 问号-匹配0-1次
        • 花括号-匹配指定次数
        • 贪婪模式和非贪婪模式
        • 对元字符的转义\
        • 括号-组选择器
      • 指标
        • 响应时间:2s
        • tps:40
        • 并发:20
        • 错误率:1%
        • 资源利用率:70%
        • 内存:可用空间不能低于40%
        • 子主题 7
      • 关注内容
        • 并发人数
        • 错误率
        • 吞吐量
        • 响应时间
        • 90,95line
        • 服务器内存
        • cpu
    • 安全测试
    • 持续集成
      • 步骤
        • 在系统设置中,配置管理员邮箱
        • 设置邮箱信息
        • 利用email extension插件
        • 添加邮管理邮箱配置信息
        • 点击添加 配置管理员邮箱账户和授权码
        • 定制发送的邮件模板内容
        • 邮箱配置中HTML内容
        • 配置邮件发送策略,选择 总是(Always) 发送
        • 点击创建job
        • 设置名称、选择风格
        • 填写一下描述信息
        • 配置Git从码云拉取代码
        • 构建触发器和构建环境
        • 安装allure插件
        • 全局工具中配置jdk和allure
        • job中对于allure的配置
    • python
      • python基础
        • 不可变数据(3个):Number(数字),String(字符串),Tuple(元组) 可变元素(3个):List(列表),Sat(集合),Dictionary(字典)

        • 列表和元组(字典)的区别:

          (1)获取元素的方式不同。列表通过索引值获取,字典通过键获取。

          (2)数据结构和算法不同。字典是 hash 算法,搜索的速度特别快。

          (3)占用的内存不同。

        • 进程线程区别?什么情况下用进程?什么情况下用线程?

          (1)区别:

          ① 地址空间和其它资源(如打开文件):进程之间相互独立,同一进程的各线程之间共享。某进程内的线程在其它进程不可见。

          ② 通信:进程间通信 IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。 ③ 调度和切换:线程上下文切换比进程上下文切换要快得多。 ④ 在多线程操作系统中,进程不是一个可执行的实体。

          (2)使用场景:同时操作一个对象的时候,比如操作的是一个全局变量,我用线程,因为全局变量是所有线程共享的。

        • 说说接口测试的流程,介绍一下request有哪些内容。

          (1)流程:获取接口文档,依据文档设计接口参数,获取响应,解析响应,校验结果,判断测试是否通过。

          (2)request 内容:

          ① 封装了各种请求类型,get、post 等;

          ② 以关键字参数的方式,封装了各种请求参数,params、data、headers、token 等;

          ③ 封装了响应内容,status_code、json()、cookies、url 等; ④ session 会话对象,可以跨请求。

        • 使用分布式执行测试的库xdist,执行命令pytest -sv -n auto .\test_case\

        • 迭代器、生成器、装饰器简述:

          迭代器是通过重复执行的代码处理相似的数据集的过程,并且本次迭代的处理数据要依赖上一次的产生的结果为下一次产生结果的初识状态,如果中途中有任何停顿,都不能算是迭代。

          生成器是种一边循环一边计算的机制,称为生成器generator

          装饰器在程序中不会对原来的函数进行改变,还要添增新的功能,调用函数时接口没有变化。装饰器可以基于函数实现,也可以基于类实现。

        • 字符串转换为数字:使用int强制转换配合try、except语句防止报错,加入if语句判断是否为空

        • webdriver核心是什么:是一个基于HTTP的协议,它提供了一系列的接口用于发现和控制 Web 文档中的 DOM 元素

        • .selenium1 和 selenium2 的区别是什么?selenium1.0是需要启动一个服务器启动代理浏览器去操作页面。而selenium2.0是使用了webdriver去驱动浏览器操作的,省去了代理。

        • 常见的元素定位方法有哪些:id、name、class_name、tag_name、link_text、partial_link_text、XPath、CSS

        • Python 中 args 和 **kwargs 的作用? 都是不定长参数,解决参数不固定问题。 args是非关键字参数,用于元组;kwargs是关键字参数 (字典) 也就是说args表示任何多个无名参数,然而kwags表示一个有着对应关系的关键字参数。 在使用的时候需要注意,args要在**kwags之前,不然会发生语法错误。

        • Python 中的垃圾回收机制是什么? 简称GC在定义一个变量时,会申请内存空间,当该变量使用完毕,也应该释放掉该变量所占用的内存空间,Python则由GC机制进行回收。

        • 什么是垃圾 1)当一个变量调用完毕,且后续不再需要时,便是垃圾。 2)当指向该变量地址的变量名指向另一个地址时,原变量内存地址无法被访问,此时该变量也是垃圾。

        • selenium中如何定位JS代码? # js 写成字符串 js = "window.scrollTo(300,450);" driver.execute_script(js)

        • 关闭浏览器中quit和close的区别? 简单来说,两个都可以实现退出浏览器session功能。 close只会关闭浏览器,而quit关闭全部浏览器的同时,也会杀掉驱动进程

        • selenium定位举例一下你遇到过那些异常: 元素不能选择异常、元素不可见异常、没有这样属性异常、没有该元素异常、没有该frame异常 、超时异常、在当前点元素不可见

        • 如何处理alert弹窗?

          1)先用switch_to_alert()方法切换到alert弹出框上

          2)可以用text方法获取弹出的文本 信息

          3)通过accept()点击确认按钮

          4)通过dismiss()点击取消按钮,取消弹出框

          5)通过text()获得弹出窗口的文本

        • 在selenium中如何处理多窗口?

          1)先获取当前窗口的句柄driver.current_window_handle

          2)再获取所有的的窗口句柄driver.window_handle

          3)循环判断是否是想要操作的窗口,如果是就可以对窗口进行操作;如果不是就使用driver.switch_to_window方法跳转到新的窗口。

        • selenium中如何判断元素是否存在? Selenium中没有提供原生的方法判断元素是否存在,一般我们可以通过定位元素+异常捕获的方式判断。

        • 自动化中有哪三类等待?他们有什么特点?

          1)线程等待(强制等待)如time.sleep(2):线程强制休眠2秒钟,2秒过后,再执行后续的代码。建议少用。

          2)imlicitlyWait(隐式等待)会在指定的时间范围内不断的查找元素,直到找到元素或超时,特点是必须等待整个页面加载完成。

          3)WebDriverWait(显式等待)通常是我们自定义的一个函数代码,这段代码用来等待某个元素加载完成,再继续执行后续的代码。

        • selenium中如何保证操作元素的成功率?也就是说如何保证点击的元素一定是可以点击的?

          1)使用WebDriverWait()显性等待,等待元素加载出来后,再进行元素操作。

          2)尽量减少不必要的操作:可以直接访问页面的,不要通过点击操作访问

          3)有些页面加载时间过长,可以考虑中断加载

          4)开发人员规范开发习惯,如给页面元素加上唯一的name、id等。