软件测试人员 面试题、面试经验

软件测试人员 面试题、面试经验

个人觉得重点的内容,会在标题或问题前面标记 * 号
一些知识我会加上自己的理解,和面试官预期的结果,各位读者就见仁见智吧
API 测试 与 Web UI 测试,与本人用的框架与经验有直接关系。所以问题与回答都不具备通用性,姑且列出相对通用性的问题作为参考吧。

文章目录

1. 测试理论

理论部分内容是相对客观又较为主观的认知部分。所以每个人理解与概括的阶段名字会有一定的差异。所以你认知中的内容与我认知可能有所不同,欢迎补充和讨论。
另外,这部分内容应该从自己的实际工作中去体会与总结,不应该死记硬背。

软件生命周期?

需求分析阶段、软件设计阶段、软件测试阶段、运行维护阶段

* 软件测试的生命周期?(测试工作流程)

广义:
测试计划、测试需求分析、测试用例设计、测试用例执行、BUG提交

实际工作中:
需求分析、编写测试用例、评审测试用例、冒烟测试、系统测试、缺陷回归、(系统测试与缺陷回归 重复若干轮后)、验收测试、版本上线

* 用例的基本要素?

其实这个 8 要素是以前 Excel 时代写用例的产物。8 要素是说,这 8 个缺了一个就就不是一条完整的用例了。有一点要注意,“重要程度”属于 8 要素,“测试结果” 不属于 8要素。

8 要素:
用例编号、所属模块、用例标题、重要程度、前置条件、测试输入、操作步骤、预期结果

实际工作中:
用例编号、所属模块、用例标题、重要程度、前置条件、测试输入、操作步骤、预期结果、实际结果、作者、创建日期等

* 缺陷的生命周期?有哪些状态?(缺陷流程)

同缺陷管理平台如QC、禅道、Jira、Mantis 都有着不同的状态类型,并且也都支持自定义。加之近几年大家都提倡敏捷,缺陷的状态已经是“十里不同音,百里不同俗”了。所以这部分我只能描述一下我理解的典型缺陷状态了

经典缺陷状态参考 此篇文章
新建(New)、打开(Open) 、 指派(Assign)、 测试(Test)、确认(Verified)、延期(Deferred)、重新打开(Reopened)、重复(Duplicate)、拒绝(Rejected)、关闭(Closed)

QC管理工具中的缺陷状态
新建(New)、打开(Open)、固定(Fixed)、拒绝(Dejected)、暂缓(Deferred)、关闭(Closed)、重新打开(Reopened)

这里我简单绘制了一张流程图,角色就不描述了,自己理解一下。
在这里插入图片描述

有一种认知是已关闭是最终状态,所以已拒绝暂缓 最终也会变成已关闭。这个见仁见智。
还有一些人把已修复当做已关闭来使用、已关闭当成软删除来使用。这个就不太对了。

缺陷的基本要素?

基本要素是比较重要的内容,也是早期的产物。现在缺陷管理工具什么字段都能给你自动记录和选择。所有内容更多了。附件就有截图、录屏、日志等。

基本要素:
缺陷编号、缺陷状态、缺陷标题、重现步骤、预期结果、实际结果、严重程度、优先级

实际工作中:
缺陷编号、缺陷状态、缺陷标题、重现步骤、预期结果、实际结果、严重程度、优先级、缺陷类型、所属模块、提交人、提交时间、附件等

* 请以 xx 功能为例设计一下测试用例

建议从以下几个角度来回答,更全面与讨喜

  • 基于业务场景的测试用例
  • 基于元素的格式、长度、特性用例
  • 基于平台的特性的专项测试
  • 兼容性
  • 安全性
  • 补充这一功能常见的需求或隐性需求
  • 权限 & 未登录

以社区发贴功能举例

这里的元素格式这部分其实是很通用的,平时可以自己整理一份。比如 手机号、邮箱有特殊格式、文本过长是否会导致破板等等。

我觉得比较难的就是常见功能与隐形需求了。因为面试过程中的问题可能不会把需求描述的很具体。所以这时候我们可以补充一些该功能常见的基本功能与一些隐性功能。

在这里插入图片描述

2. 网络知识 与 HTTP

网络的7层协议/ 4层协议

详情网络协议可以参考此篇文章

7 层协议

  • 应用层
  • 表示层
  • 会话层
  • 传输层
  • 网络层
  • 数据链路层
  • 物理层

7 层 与 4 层对照关系

7 层4 层常用协议
应用层
表示层
会话层
应用层HTTP/ FTP/ SMTP/ DNS
传输层传输层TCP/ UDP
网络层网络层IP
数据链路层
物理层
链路层

HTTP Code 301、302、304的区别

300系是重定向

  • 301 Moved Permanently 永久移动
  • 302 Found 临时移动
  • 304 Not Modified 未修改。此时浏览器会读取缓存数据。

HTTP Code 403、404、405的区别

400系是请求出错

  • 403 Forbidden 拒绝执行。一般是权限不足
  • 404 Not Found 页面不存在。一般是URL地址错误
  • 405 Method Not Allowed 方法不被允许。比如 用 get 方式请求 post 接口

HTTP Code 502、503、504的区别

500系是服务器出错

  • 502 Bad Gateway 错误网关。可能应用服务出现问题,或者依赖服务出问题,例: sql 慢查询、大量并发请求。此时请求与后端已建立连接。
  • 503 Service Unavailable 无法服务。临时维护或过载,例如大量并发请求时,服务端可能返回一部分用户503无法服务,以保证另外一部分用户能继续使用。
  • 504 Gateway Timeout 网关超时。一般是配置出错或 Nginx 代理服务出现问题、或应用服务出现问题。此时请求与后端并未建立连接。

3. API 测试

常见的请求方法?

  • GET
  • POST
  • PUT
  • DELETE
  • OPTIONS

* GET 与 POST 的区别?

这是一道比较常见的面试问题,但这道题目我有自己的理解和看法…

网上常见答案:

  • get 请求服务器资源,post 提交表单
  • post 请求数据量更大
  • get 不安全、post更安全。
  • get 可以被缓存、post不会被缓存

这里的差异只有一个差异,就是参数在url地址栏中就是数据量小、不安全。而参数放在body中,就是数据量大、安全。而 get 可以被缓存,这只是浏览器的功能,不同浏览器之间也有差异。

这里的区别都是基于 get 只能请求 url query 参数,post 只能请求 body 体的误区。其实get 也可以传递body体,只是一般后端不会这么接收。post 请求url query就更常见了。一般链路日志中的post接口就会用url query参数传递一个链路标识串。

我和这几位同学的观点是一致的 移步1 移步2

但我仍然建议你们按网上的答案来回答,只是加上“在平常工作中…”

GET 和 POST 哪个更快?

既然要对比某一属性,就要用控制变量法,既:
相同网络、相同请求参数、相同后端逻辑等等,除了Method外其他全一样

那么我实际跑下来100~10000次,有时get快,有时post快。我不敢说他们速度完全没区别,至少差异比程序运行&网络波动的误差还小。
在这里插入图片描述
甚至我自己瞎写一个协议

from flask import Flask

app = Flask(__name__)

@app.route('/ping', methods=["GET", "POST", "HAHAHA"])
def ping():
    return {'success': True}

if __name__ == "__main__":
    app.run()

也是可以成功请求并获取到数据的

response = requests.request(method='HAHAHA', url='http://127.0.0.1:5000/ping')
print(response.text)

因为协议这个东西本就是约定俗成的一种格式,服务端收到的是一段包含协议格式,再进行解析。个人觉得 get 和 post没啥区别。区别是浏览器、web服务器、应用服务器、后端业务逻辑带来的。

简单介绍一下你是如何做 API 测试的 [待更新]

API 自动化如何做数据准备和传递数据?[无答案]

目前项目中 API 用例数量是多少?多久维护一次?维护成本是多少?[无答案]

4. Web UI测试

本人常用的 Web UI 测试框架是 Cypress,比较小众。所以这一块就不写了,因为常见的 Selenium 框架并不适用。

目前项目中 Web UI 用例数量是多少?多久维护一次?维护成本是多少?[无答案]

如何切换页签? [无答案]

如何定位iframe?[无答案]

5. 性能测试(针对 JMeter)

简单介绍一下你是如何做性能测试的 [待更新]

一般用什么线程组?

插件中的并发线程组(bmz - Concurrency Thread Group)
可以设目标总线程数、总持续时间、步骤阶段数量
在这里插入图片描述

性能测试你会关注哪些指标?

  • 每秒活动线程数
  • 响应时间
  • 每秒事务处理个数(TPS)
  • 服务器资源使用情况

性能测试的场景是什么?基准是什么?[待更]

TPS 和 QPS的区别是什么?[待更]

JMeter 如何传递参数 [待更]

6. 测试框架(针对 Pytest)

Pytest 如何让断言失败时不中断测试

使用 assume 插件,可以让所有断言执行完成后才输出断言结果
详细参考 这篇文章

import pytest
 
class Test(object):
 
    def test_01(self):
        """用例1"""
        print('执行test_01断言1')
        pytest.assume(0 == 1)
        print('执行test_01断言2')
        pytest.assume(1 == 2)
 
    def test_02(self):
        """用例2"""
        print('执行test_02断言1')
        pytest.assume(3 == 3)
        print('执行test_02断言2')
        pytest.assume(4 == 4)
 
if __name__ == '__main__':
    pytest.main(['-s', 'test_C_01.py'])

7. 数据库

* Mysql 连接查询有哪些?

mysql 有三种,left join、right join、inner join(简写 join);
sqlserver 有额外 full join
区别就不写了,参考 这篇

select 
* 
from table_a a 
join table_b b 
on a.id = b.id  

where 和 having 的区别?

where 和 having都是条件语句
不同的是,having是放在group by下方的,可以使用函数

select 
sex, count(1)
from student
where age >= 18 
group by sex
having count(1) > 0 

如何去重?

DISTINCT

select 
distinct name
from student

8. Linux

* 常用 Shell 命令

# 新建文件
touch xxxx.txt

# 新建文件夹
mkdir xxxx

# 查看文件
cat xxxx.txt

# 编辑文件
vim xxxx.txt

# 查看日志 -f 循环读取 -n 1000 指定最后多少行
tail -f xxx.log
tail -n 1000 xxx.log

# 查询进程,aux 和 -ef区别请自行百度
ps aux
ps -ef
ps aux

# 杀死进程 pid是进程号,-9是强制杀死,-15是自行退出(也是不带参数的默认方式)
kill -9 pid
kill -15 pid

# 管道 | ,就是把左侧的命令输出,作为右侧命令的输入。 文本搜索 grep
ps aux | grep xxxx

# 输出重定向 > ,就是把左边的命令输出内容写入文件,不显示在屏幕
ps aux > 1.txt

9. 其他

印象深刻的 bug [无答案]

线上问题处理流程 [无答案]

* 在最近的一个项目中,你的主要工作内容是? [无答案]

* 你有什么想问我的吗?

参考这篇 知乎文章

  • 这个岗位是新开设的还是原岗位上的人离职了?
  • 关于这个岗位,您觉得最重要的工作内容是什么?
  • 您觉得,这份工作所需的能力,我还有哪些不具备?
    「您可能觉得我没有表现出 xxx 能力,其实……(补充一下)」

一般面试刚开始都会有点紧张,可能回答的不太好、不全面。第三个问题如果面试官指出你的问题,可以适当做一些补充。如果真的能力有限,以后也有个自我提升的大概方向。也挺好的。

自我介绍

我目前在使用的范本是这样的,最早是没有业务方面的内容的。后来有一次面试。面试官问我,你的工作70%是系统测试,30%是自动化,为什么自我介绍里只着重讲那30%而没有讲那70%呢。我觉得很有道理,所以就加上了。XD

你好,我叫xxxx。来自xxx。xxxx专业。我从事xxxx有xx年了。业务方面,过去几年主要从事xxxx行业,熟悉xx、xx、xx等相关业务测试。技术方面擅长的是xxxx与xxxx。xxxx年考取了xxxx证书。以上就是我的个人介绍,谢谢。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值