文章已被51测试网收录:https://mp.weixin.qq.com/s/Mdbyvu-C0WVCfGsYVxTRGA
一、 为什么从开发转测试
笔者从2019年5月开始从一名java开发女程序猿正式转为测试开发工程师,原因 除了机缘凑巧之外,当然是因为这个行业对测试工程师的要求已经越来越高,简单做 些UI脚本录制和回放的自动化,参考度娘写出框架demo却不知道问题出在哪里的测试 人员,已经不能满足企业快速迭代产品,保证产品质量的需求。当一个产品越来越庞 大、用例越来越多,用例如何设置、脚本如何规划、代码结构如何优化,当需求变动 时又如何做到高可维护、高健壮性的问题会接踵而来。所以,一名优秀的测试开发工 程师是必须具备优秀的代码能力,甚至知识面是需要比普通的开发人员更广的,比如 他需要熟悉自动化测试、服务器部署、网络架构、软件性能、软件安全等等方面的知 识。 所以开发工程师转测试之后可做的内容非常的多,测试这块领域也需要更多有开 发背景的人员加入。
二、 前言
背景唠嗑完,我们来说说面试题,由于是开发转测试,首先开发的进阶基础知识 是必须要掌握的,面试官也肯定会问(说不定直接是开发组的人面的),接着会问一 些功能测试的知识点,但是一般不会多,然后是比较重要的自动化测试部分,做自动 化测试框架有很多,每个公司用的也不一样,如果没用过面试官说的,就说自己用过 那套的逻辑就好。如果没有在工作中实践过,非常有必要的告诉大家,在面试之前也 一定要多百度熟悉多动手写demo,不要让面试官问的工具和术语你都没听说过,那么 还没开始就结束了的面试只会剩下尬聊(哭晕)。最后前面聊得愉快的话,面试官一 般还会继续考察你的其他能力,比如性能、安全、Linux、数据库、软件架构等。下述 内容为大家准备了每个知识点比较常见的面试题,大家可以参考并且发散准备,最后 记得准备必问题目:为什么从开发转测试?参考我第一章的答案✌
三、 开发基础面试题
自动化常用的语言是 java 和 python,参考面试题:
(1) JAVA知识
Q1:List、Set、Map 之间的区别
List 是一个有序集合,允许元素重复。它的某些实现可以供基于下标值的常量访问 时间,但是这不是 List 接口保证的。Set 是一个无序集合。
Q2:ArrayList 与 LinkedList 的区别?
最明显的区别是 ArrrayList 底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构书链表,不支持随机访问。使用下标访问一个元素,ArrayList 的时间 复杂度是 O(1),而 LinkedList 是 O(n)。
Q3:Hashtable 与 HashMap 有什么不同之处?
这两个类有许多不同的地方,下面列出了一部分: a) Hashtable 是 JDK 1 遗留下来 的类,而 HashMap 是后来增加的。 b)Hashtable 是同步的,比较慢,但 HashMap 没有同步策略,所以会更快。 c)Hashtable 不允许有个空的 key,但是 HashMap 允许出现一个 null key。d)HashMap 线程不安全
Q4:Java 中 ++ 操作符是线程安全的吗? 不是线程安全的操作。它涉及到多个指令,如读取变量值,增加,然后存储回内存,
这个过程可能会出现多个线程交差。
Q5:int 和 Integer 哪个会占用更多的内存?
Integer 对象会占用更多的内存。Integer 是一个对象,需要存储对象的元数据。但是 int 是一个原始类型的数据,所以占用的空间更少
Q6:Java 中 sleep 方法和 wait 方法的区别?
虽然两者都是用来暂停当前运行的线程,但是 sleep() 实际上只是短暂停顿,因为它 不会释放锁,而 wait() 意味着条件等待,这就是为什么该方法要释放锁,因为只有这 样,其他等待的线程才能在满足条件时获取到该锁。
Q7:解释 Java 堆空间及 GC?
当通过 Java 命令启动 Java 进程的时候,会为它分配内存。内存的一部分用于创建 堆空间,当程序中创建对象的时候,就从对空间中分配内存。GC 是 JVM 内部的一 个进程,回收无效对象的内存用于将来的分配。
(2) Python知识
Q1:python 基本数据类型? int、str、float、list、bool、tuple 元组、dict 字典、set 集合
Q2:列出 python 中可变数据类型和不可变数据类型,并简述原理
不可变数据类型:数值型、字符串 string、元组 tuple: 如果改变了变量的值,相当于 是新建了一个对象,如果是相同的值,只用一个内存地址保存
可变数据类型:列表 list、字典 dict:允许变量的值发生变化,即如果对变量进行 append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的 对象的地址也不会变化
Q3:python 字典和 json 字符串相互转化方法 字典转 json:json.dumps() json 转字典:json.loads()
Q4:Python 中@staticmethod 和@classmethod 的区别
在类中总共有三种方法:普通方法:需要参数,使用时默认将类的实例对象传进去, 类调用的时候需要传递实例对象@staticmethod 装饰的静态方法与普通函数相同:实 例和类均可调用,没有默认的参数传递进去@classmethod 装饰的类方法:需要参 数,使用时将调用的类传进去
Q5:什么是装饰器? 装饰器的本质是一个闭包函数,实现的功能是在不修改原函数及调用方式的情况下对
原函数进行功能扩展的,是开放封闭原则的典型代表。
Q6:python 中常见的异常举例 Exception 所有异常类的基类 AssertionError assert 语句失败 FileNotfoundError 文件打开失败 AttributeError 试图访问对象没有属性
Q7:Python 是如何进行内存管理的?
1.对象的引用计数机制 Python 内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数。
2.垃圾回收机制 当一个对象的引用计数归零时,它将被垃圾收集机制处理掉。
3.内存池机 Python 供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而 不是返回给操作系统制
(3) 数据库知识
Q1:数据表 student 有 name 字段,其中 name 中的名字可有重复,需要消除重复行select distinct name from student Q2:什么是内链接、左链接、右链接、全链接?
(1)INNER JOIN 产生的结果集中,是左和右的交集 (2)LEFT JOIN 返回左表的 全部行和右表满足 ON 条件的行,其他 null 替代 (3)RIGHT JOIN 返回右表的全部 行和左表满足 ON 条件的行,其他 null 替代 (4)FULL JOIN 会从左表 和右表 那里返回所有的行,如果其中一个表的数据行在另一个表中没有匹配的行,那么对面的数 据用 NULL 代替
Q3:某个字段被建立索引后,数据的什么操作会使用到该索引?
(1)对建立了索引的字段做 where 条件查询时
(2)多表做 join 操作时会使用索引 (3)对建立了索引的字段做 min()或 max()时 (4)对建立了索引的字段做 sort 或 group 操作时
(4) http知识
Q1:http 协议是不是安全的?如果不是,如何确保传输安全?
HTTP 的连接很简单,是无状态的,所以不安全,HTTPS 协议是由 SSL+HTTP 协议 构建的可进行加密传输、身份认证的网络协议,是 HTTP 的安全版。(SSL 协议的对 称密钥加密、非对称密钥加密 Google 查资料)
Q2: 简述 cookie 和 session 的区别
session 在服务器端,cookie 在客户端(浏览器),session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同 时 session 也会失效,存储 Session 时,键与 Cookie 中的 sessionid 相同,值是开 发人员设置的键值对信息,进行了 base64 编码,过期时间由开发人员设置
Q3: 什么是socket?
socket 是在应用层和传输层之间的一个抽象层,它把 TCP/IP 层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。
(5) Git 知识
Q1: gitpull和gitfetch之间有什么区别?
简单来说,git pull 是 git fetch + git merge。
1.git pull 会把所有拉取的交合并到当前处理的分支中,如果没有细心管理分支,可 能会频繁遇到冲突。
2.git fetch 会收集目标分支中的所有不存在的交,并将这些交存储到本地仓库 中。但 Git 不会把这些交合并到当前分支中
Q2: git如何进行版本回退 git reset --hard HEAD^
Q3: gitlab 如何进行分支保护和代码审查
四、 测试开发面试题
Q1: 接口测试如例如何设计
Q2: 自动化框架的搭建思路,分别有什么模块,作用是什么?
用例模块、发送请求、全局配置文件、数据自动采集、读取数据、接口断言、日志记 录、测试报告
Q3: 测试数据有几种,分别放哪里?
全局数据:写入配置文件 一次性消耗数据:从随机函数生成 需要被接口多次读取数 据:参数化,放入 excel、json、或者从数据库读取 接口数据文件:数据驱动、使用 excel 管理测试接口
Q4: 影响数据流的接口如何处理,比如删除这种接口如何测试 方法一:最后单独处理这个接口,单独造独立的数据去删除,丰富数据 方法二:连接到数据库中操作
Q5: 测试脚本数据如何规划设计
V1.0:跑通一个流程的接口(约 10 个),常量数据脚本 V2.0:跑通一个流程的接口(约 10 个),数据参数化,数据与脚本分离 V3.0:跑通所有接口,数据参数化,数据与脚本分离 V4.0:多组有效数据,保证所有接口能全部跑通且高覆盖率 V5.0:多组无效数据,加强测试覆盖率
Q6: 使用什么框架完成自动化?讲述使用过程 unittest、pytest、postman、jmeter、Selenium、Appnium 等
Q7: unittest、pytest 框架对比
pytest 相较于 unittest 最为跳跃的一点应该就是 fixture 机制。对于 unittest 来说, 每个用例的类中都需要去写入 setUp 和 tearDown。也就是我们所说的前置和后置,而 不可避免的,很多用例的前置和后置都是一样,重复的复制粘贴致工作量增加,代码 量也增加。
Q8:pytest 的@pytest.mark.parametrize 装饰器作用是什么?
@pytest.mark.parametrize 装饰器可以让我们每次参数化 fixture 的时候传入多个项 目。回忆上一节,我们参数化的时候只能传入 1 个字符串或者是其他的数据对象, parametrize 每次多个参数,更加灵活。
Q9:postman + Newman 相关问题 是否会使用 postman 完成接口的基本调试? 变量有几种,作用域分别是什么? 如何使用变量?
sandbox 如何使用,如何实现断言 如何实现接口参数化,以及接口传递 Newman 的作用是什么,如何使用 如何输出 html 格式的测试报告
Newman 是否可以改造
Q10:selenium 常用的八大定位法 Id、name、link_text、partial_link_text、tag_name、class_name、css_selector、
xpath
Q11:GUI 测试如何高脚本的稳定性
不要右键复制 xpath(十万八千里那种路径,肯定不稳定),自己写相对路径,多用 name 定位,sleep 等待尽量少用(影响执行时间)、使用 WebDriverWait,结合 WebDriverWait 和 expected_conditions 判断元素方法,自己封装一套定位元素方法
五、 扩展问题
Q1: 安全测试有哪些方面?
Q2: 简述性能测试、负载测试、压力测试 性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。负载测试- 核实在保持配置不变的情况下,测试对象在不同操作条件(如不同用户 数、事务数等)下性能行为的可接受性压力测试:压力测试主要是为了测试硬件系统是否达到需求文档设计的性能目标,譬 如在一定时期内,系统的 cpu 利用率,内存使用率,磁盘 I/O 吞吐率,网络吞吐量 等,压力测试和负载测试最大的差别在于测试目的不同。
Q3: 常用的性能指标的名称与具体含义。 响应时间、并发用户数,吞吐量,性能计数器,TPS,HPS、XSS、CSRF 攻击、SQL 注入攻击、web 木马攻击、文件上传攻击、账密暴力破解、验证码缺陷、用户权限、端口扫、服务检测、中间件安全。对这块有要求的小伙伴找本书看看,推荐《web 安全防护指南基础篇》