Skip to content

高频面试题

介绍一下项目

我参与了好物坊电商平台项目,我负责订单录入模块的流程测试,订单录入分为手动录入和表格文件录入,登录状态下,进入订单录入页面,选择手动录入订单,填写收件人的姓名、电话、地址、商品的信息、规格,就可以录入;选择表格文件录入,需要上传表格订单文件,并识别订单信息,最后录入订单,录入的订单进入待发货页面。

介绍下项目流程

  1. 我们根据需求文档设计测试用例
  2. 设计完成后和研发产品进行用例评审,补充覆盖不全的用例设计,同时确保三方对需求的预期结果理解一致
  3. 后续等开发提测之后,执行用例,通常先做冒烟测试,冒烟测试通过后再做需求全量测试
  4. 发现bug后,收集日志,然后提交到缺陷管理平台,指给相应的开发
  5. 等开发解决bug后,进行回归测试
  6. 所有项目完成后编写测试报告

Web自动化怎么做的?

(结合业务场景重新写)

从设计的用例中筛选出P0、P1级别的用例,比如手动录入订单的正向用例,基于selenium框架来编写和调试脚本并结合PO设计思想将测试脚本分为5层,使测试脚本变得易读、方便维护,第一步封装公共方法,比如Webdriver的启动、对xpath、css等定位元素的方法的封装,第二步 封装页面中对元素操作的方法,像收件人、地址、商品等输入框的填写,第三步 拼接完整的测试用例,断言测试结果,。。。。断言录入成功,第四步 用pytest和yaml进行数据驱动,比如用pytest.Mark.parametrize和yaml.safelode实现参数化,最后可以使用allure生成测试报告

接口测试怎么做?

  1. 根据接口文档,设计接口用例,覆盖正常、异常、边界值等场景
  2. 使用postman进行参数的构造,涉及登录态的将登录后获得的token配置到测试集变量,在需要的地方进行引用
  3. 校验返回的数据,字段是否和接口文档中一致,数据是否和数据库一致
  4. 确保返回的数据格式正确,使用postman封装的脚本,修改下断言条件,验证测试结果

接口自动化怎么做的?

(结合业务场景重新写)

在订单录入模块,我梳理业务场景,结合接口文档,筛选出核心接口测试用例,如文件订单录入正向用例,.用postman进行调试,调试好之后,基于request框架编写和调试脚本,第一步将requests库进行二次封装,所有接口请求都通过这个方法发送,统一请求处理逻辑,如文件上传、订单录入的接口请求都可以通过调用这个方法发起,第二步 封装请求参数、请求方法、url,像文件上传用POST请求方法、对应的url、需要传入的头信息和要上传的文件,第三步 编写具体的用例,文件订单录入需要先进行文件订单上传、再对文件头信息进行匹配,最后再录入订单,用例中将以上步骤拼接,根据返回的json数据来断言文件订单上传成功。

什么是数据库索引,索引的优缺点

  1. 索引是一种独立于表数据的、特殊的数据结构(如 B-Tree),它包含了表中一列或多列的值以及这些值对应数据行的物理地址(如指针)。通过索引,数据库管理系统可以快速找到并访问特定的数据行,而无需扫描整个表。 例如在 employees 表的 last_name 列上创建一个名为 idx_lastname 的索引 CREATE INDEX idx_lastname ON employees (last_name); SELECT * FROM employees WHERE last_name = 'Smith';
  2. 索引的优点:极大提高查询速度,加速表之间的连接,保证数据的唯一性,优化排序和分组;索引的缺点:占用额外的磁盘空间,降低数据写入(增删改)的速度,索引需要维护,选择不当的索引是徒劳的

举例说明什么是数据库中的事务,事务的优缺点

例如银行转账,假设你要从你的账户(账户A)转账100元给朋友的朋友账户(账户B)。这个操作在数据库中至少需要两步:从账户A扣款 100元,向账户B存款 100元。

现在考虑一个问题:如果第一步执行成功后,第二步执行之前,数据库服务器突然断电了,会发生什么?你的账户已经被扣了100元。但是你朋友的账户并没有收到这100元。这100元钱就“不翼而飞”了!这显然是无法接受的。为了解决这个问题,数据库引入了“事务”的概念。事务是一个不可分割的数据库操作序列,它作为一个逻辑单元被执行。事务内的所有操作,要么全部成功,要么全部失败,不会停留在中间某个状态。对于银行转账,我们可以将这两个步骤定义在一个事务中: START TRANSACTION;开始一个事务,再进行转账操作。此时,我们可以检查是否有错误发生(例如余额不足、账户不存在等)。如果没有问题,则提交事务,COMMIT;

事务的优点:保证数据一致性,提供故障恢复能力,支持并发控制;

事务的缺点:性能开销,增加了应用程序的复杂性,可能引发死锁,长事务带来的风险

联表查询怎么写

联表查询的核心是 JOIN 子句。最常见的类型是 INNER JOIN(内连接)和 LEFT JOIN(左外连接)。 内连接:返回两个表中连接条件匹配的所有行。如果某行在一个表中没有匹配项,它就不会出现在结果中。例如查询所有员工及其所属的部门名称:

SELECT 
    employees.name,
    departments.department_name
FROM employees
INNER JOIN departments ON employees.department_id = departments.department_id;

左外连接:返回左表(FROM 后面的表) 的所有行,即使在右表(LEFT JOIN 后面的表)中没有匹配的行。如果右表没有匹配,则结果集中右表的部分返回 NULL。例如:查询所有员工信息,并显示他们的部门名称(即使他没有部门)。

SELECT 
    employees.name,
    departments.department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.department_id;

Python中如何把局部变量在全局使用

  1. 使用 global 关键字
def set_global_variable():
    global my_global_var  # 声明:接下来要操作的 my_global_var 是全局变量
    my_global_var = "我在函数内部,但我是全局变量!"
    # 现在这个赋值操作是针对全局作用域的
# 调用函数,它设置了全局变量
set_global_variable()
# 现在可以在全局作用域中访问了
print(my_global_var)  # 输出: 我在函数内部,但我是全局变量!
  1. 使用 globals() 函数(动态设置)
def create_global_vars():
    local_calculated_value = 42
    local_user_name = "Alice"

 # 动态地将局部变量提升为全局变量
    globals()['calculated_result'] = local_calculated_value
    globals()['user'] = local_user_name
    globals()['dynamic_var'] = "任何值"

# 调用函数
create_global_vars()

# 现在这些变量在全局作用域中都可用了
print(calculated_result)  # 输出: 42
print(user)              # 输出: Alice
print(dynamic_var)       # 输出: 任何值

Linux常用命令

常用的 Linux 命令有 ls(列出当前路径下文件)、cd(切换目录)、pwd(显示当前路径)、cp(复制文件)、mv(移动文件)、rm(删除文件)、mkdir(创建目录)、rmdir(删除目录)、touch(创建文件)、less(查看文件内容)、head(查看文件开头)、tail(查看文件末尾)等。

你做项目中遇到印象最深的 bug 是什么

​1. Bug背景与现象​: 在我测试的一个电商项目中,用户下单后会生成一个订单详情页,页面的URL链接里包含了订单ID,格式类似 .../orderid=12345。在测试时,我出于好奇,将浏览器地址栏里的订单ID随意改成了另一个数字(比如12346),然后按下了回车键。结果发现,页面竟然跳转并显示了其他用户的订单详细信息,包括收货地址、购买商品等敏感内容。

​2. 排查与定位过程​: 我立刻意识到这很可能是一个安全问题。我的排查步骤是: ​确认前端​:首先检查前端页面是否有任何过滤或提示,发现没有。 ​抓包分析​:使用Fiddler抓包工具拦截这个修改ID后的请求。我发现请求发送到后端接口后,接口返回了状态码200(表示成功),并且直接返回了其他用户的订单数据。 ​得出结论​:这说明后端接口在处理请求时,​只验证了用户是否登录,但没有校验当前登录的用户是否有权限访问这个特定的订单ID​。也就是说,只要你是登录状态,就可以通过遍历订单ID的方式看到所有订单的内容。

​3. 解决方案与影响​ 我立即将这个问题提交给开发人员,并清晰地描述了复现步骤。我给出的建议是:在查询订单信息的后端逻辑中,​增加权限校验。即在根据订单ID查询数据库之前,先验证该订单是否属于当前登录的用户。 这个Bug如果上线,会导致大量用户隐私数据泄露,属于高严重级别的安全问题。正因为及时发现并修复了它,我得到了团队的表扬。这个经历让我深刻体会到“永远不要信任客户端传来的任何数据”这一安全原则的重要性。

接口测试是测什么?

验证接口能否实现设计的业务逻辑,并校验响应的数据的格式和内容是否正确;

性能测试是测什么?

在高并发、大数据量的情况下,验证系统的响应速度、处理能力、资源占用是否符合预期。

掌握的测试工具和框架?

Postman、xmind、charles、jmeter、禅道、selenium、appium、request

掌握新知识的方法和技巧

首先通过相应的官网进行学习,将重要的地方记录下来,不理解的地方用ai工具进行解析。结合案例进行实践,并快速的掌握。

(非计算机相关专业)为什么跨专业?为什么大学毕业没有从事所学专业相关的工作?

  1. 我通过网上了解到了有软件测试这个行业
  2. 在深入的了解过程中我学会了一些基本的测试方法,发现对这个行业的兴趣愈发浓厚
  3. 所以我决定从事这行业,不再从事自己所学的相关的行业

有什么问题要问的

我入职之后具体负责的工作内容是怎么样的呢?

你在测吧干啥?

我只是在网上学习了一些软件测试的理论知识,想通过真实的企业级项目进行实践,进而提升并加深我的职业技能,所以我选择了测吧。

为什么从上一定离职?(适合实习经历的同学)

暑假实习/日常实习,纯实习无转正机会的