最全的软件测试面试题

1.熟悉软件测试流程,能够独立完成软件测试相关工作。

软件测试流程:首先由公司高层进行立项,产品给出产品说明书,需求人员进行需求分析,接着进行需求评审,
(参加人员:项目组里的人,产品,需求,研发,测试),开发进行概要设计和详细设计,测试人员根据需求文档编写测试用例,测试用例评审,如果改动较大的话还要进行二次评审。评审完成后开发进行编码,测试进行部署测试环境进行测试,首先进行冒烟测试(主功能),然后进行功能测试,遇到bug利用禅道进行跟踪记录,开发进行修改,测试进行验证,然后进行回归测试,然后进行验收测试,最后将各个文档交给运维人员进行部署上线。(交给运维人员的一般有,需求文档,测试报告,前后端代码包,版本号等等)

2.灵活运用各种方法编写测试用例。

等价类划分,边界值,场景法,正交表,错误推测,因果图,判断表

1.等价类划分:注册密码长度在618位数字字母注册:有效等价类:618数字和字母组成的,无效等价类: 小于6位,大于18位,6~18纯数字,纯字母,特殊符号,空格等

2.边界值:注册密码长度6~18位可以选取5,6,18,19位进行边界测试

3.场景法:ATM取款机取钱,梳理流程:插入合法的卡-输入正确密码-输入合法金额-余额充足-ATM金额充 足-取款;插入不合法的卡-退卡;插入合法的卡-输入错误密码-提示输入密码;等

4.错误推测:手机拨号失败:考虑可能是手机没有卡,手机欠费,手机没有信号,手机通讯服务有问题 等

5.因果图和正交表:投币买饮料:投入不同的硬币,选择不同的饮料,最终给你返回硬币和饮料

3.测试用例模板

用例编号,用例模块,用例标题,前置条件,优先级,操作步骤,输入数据,预期结果,实际结果

4.缺陷报告模板

缺陷编号,缺陷状态,缺陷标题,重现步骤,严重程度,优先级,缺陷类型,测试环境

5.禅道的缺陷报告

缺陷报告中包含:所属产品,所属模块,所属项目,指派人员,截至日期,bug类型,测试环境,bug标题,严 重程度,优先级,重现步骤(操作步骤,预期结果和实际结果)

6.测试报告模板

测试目的,测试依据,测试范围,测试环境,实际进度,几轮回归测试 ,遗留缺陷 ,等级,如何解决,测试结论

7.接口测试模板

用例编号,所属模块,用例功能,请求方式,请求头,请求体,请求路径,请求参数,预期结果,实际结果

8.测试计划模板

测试背景,测试目的,确定测试范围,制定测试策略,测试资源安排,人员的分配,时间安排,风险评估

Postman

接口流程

拿到后端开发提供的接口文档,分析接口中的功能,请求方式,请求头,请求参数(参数是否必填,类
型,长度,是否唯一等),编写接口测试用例,最后使用postman工具进行接口测试

1.全局变量

通常情况下,我们共同使用的部分可以存放在全部变量里,调用的时候只需要{{变量名}}即可,适用全部的接 口

2.接口关联

将第一个接口设置断言,拿到返回体内容转成json对象,通过json表达式提取想要的值,将这个值设置全局 变量,在第二个接口中使用{{变量名}}代替,实现接口关联

// 获取响应体的文本内容
var resbody = responseBody;
console.log(resbody)
// 转成json对象
var jsonobj = JSON.parse(responseBody)
// 通过json表达式提取值
var pro = jsonobj.result.province
pm.globals.set("prodes", pro);

3.断言

用于预期结果和实际结果的对比

Tests响应断言的几种方式 :

(1)Status code:code is 200 (校验响应头是否包含某个值)

(2)response body:contains string (校验返回结果中是否包含某个字符串)

(3)response body:Json value check (校验返回结果中某个字段是否等于某个 值)

(4)response header:content-type header check (校验响应头是否包含某个值)

(5)response time is less than200ms (校验响应时间是否少于200ms)

(6)response body:Is equal to string (校验返回结果中是否等于该字符串)使用少

4.用例的批量执行

将测试数据保存本地,一次性进行运行,在参数里面的数据文件值和取全局变量一致,使用{{}},在断言里面 取数据文件的值使用:data.字段名

5.接口自动化测试

我在公司使用的是postman,newman和jenkins做接口自动化测试 首先将接口填充在postman中调试导出脚本(.json脚本) 安装nodejs和Newman,最近在dos命令中通过newman命令执行生成测试报告(newman命令:newman run 脚本.json -r html --reporter-html-export html路径) 最后在Jenkins中新建项目,设置定时任务时间,在调度任务中添加window 命令(Newman命令),最后定时 执行任务生成测试报告

协议

Web测试和APP测试相同点:
•设计测试用例时,依然都是依据边界值分析法、等价类划分等
•需要检查界面的布局、风格和按钮等是否简洁美观、是否统一等
web和app测试,单从功能界面测试来说,没有什么差异。有差异的主要是以下几点:
•结构:
web端,是B/S架构的,服务端有修改的话,客户端会同步更新
app,是C/S架构的,如果服务端有修改的话,客户端必须更新,核心版本的客户端都要重新回归测试
•性能指标:
web端:响应时间、CPU、内存、吞吐量
app:响应时间、CPU、内存、吞吐量、手机流量、手机电量
•兼容
web端:浏览器兼容;PC端的操作系统(windows、mac、linux)
app:手机操作系统(安卓、ios、windows);手机型号;分辨率(手机屏幕大小)
•相对于web,app有一些专项测试
中断测试(来电、信息、其他应用)
弱网络测试、网络切换测试
安装、更新、卸载
•自动化测试工具
app:appium
web:selenium
•界面操作
web端:屏幕放大缩小等
app:手势、手机横屏竖屏、触控等测试
•安全测试
web:敏感信息泄露、跨站脚本、sql注入
app:访问通讯录、相册、相机

网络的七层协议

物理层:物理接口规范,传输比特流,网卡是工作在物理层的。

数据层:成帧,保证帧的无误传输,MAC地址,形成EHTHERNET帧

网络层:路由选择,流量控制,IP地址,形成IP包

传输层:端口地址,如HTTP对应80端口。TCP和UDP工作于该层,还有就是差错校验和流量控制。

会话层:组织两个会话进程之间的通信,并管理数据的交换使用NETBIOS和WINSOCK协议。QQ等软件进行通讯因该是工作在会话层的。

表示层:使得不同操作系统之间通信成为可能。

应用层:对应于各个应用软件,应用程序。

三次握手,四次挥手

三次握手
1.客户端向服务端发送请求连接
2.服务端收到请求发出收到请求,可以连接
3.客户端收到请求向服务端发送收到,连接成功
四次挥手
1.客户端向服务端发送请求连接
2.服务端收到请求后发出收到请求,可以连接
……数据传输中
3.数据传输完毕后,服务端请求断开
4.客户端收到请求,发出断开消息。OK

数据库操作

1.数据库分类

关系型数据库:mysql,sql server,oracle,sqlite,db2…

非关系型数据库:redis,mongodb

2.sql的分类

DDL,DML,DQL

3.具体操作

DDL中操作
库操作:
新增库:create database 库名;
查询创建库的语句:show create database 库名;
删除库:drop database 库名;
使用库:use 库名;
表操作:
新增表:create table 表名(字段名 类型(长度),字段名 类型(长度));
查询创建表的语句:show create table 表名;
查询表结构:desc 表名;
删除表:drop table 表名;
表字段的新增:alter table 表名 add 字段名 类型(长度);
表字段的删除:alter table 表名 drop 字段;
表字段的修改:
alter table 表名 MODIFY COLUMN 字段名 类型(长度); ------修改表中字段长度
alter table 表名 change 旧字段名 新字段名 类型 长度-------修改表中字段名
MML中操作
新增数据:
insert into 表名 values (字段值,字段值,字段值,,,);
insert into 表名 values (字段值,字段值,字段值,,,),(字段值,字段值,字段
值,,,),(字段值,字段值,字段值,,,)
修改数据:update 表名 set 字段名= 新值,字段名= 新值 where 条件;
删除数据:
delete from 表名 where 条件
delete from 表名
DQL中操作
查询数据:
select * from 表名 查询全部数据
select * from 表名 where 条件 查询指定数据
查询在某某之间的数据:SELECT * from 表名 where 字段 BETWEEN X and XX;
模糊查询:select * from 表名 where 字段 like '%数据%'
排序:
select * from 表名 order by 字段 正序
select * from 表名 order by 字段 desc 倒序
分组:select * from 表名 group by 字段 having 条件
统计次数; max() 计算最大值; min() 计算最小值; avg() 计算最小值 ; sum() 求和
分页:select * from 表名 limit 起始位置,显示个数
两个表联查
select 表1.字段,表2.字段 from 表1 inner join 表2 on 表1.字段=表2.字段 where 条件
三表联查
select 表1.字段,表2.字段,表3.字段 from 表1 inner join 表2 on 表1.字段=表2.字段
inner join 表3 on 表1.字段=表3.字段 where 条件

sql优化语句:

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
3.不要写一些没有意义的查询,如需要生成一个空表结构。
4.尽可能的使用 varchar 代替 char ,因为首先变长字段存储空间小,可以节省存储空间,
其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
5.避免使用*,in,not in !=等等,可以较多的使用count。

Linux

1.Linux命令

目录
	新增 mkdir 目录名
	修改 mv 目录名 新目录名     剪切  mv 目录名   路径
	复制 cp 目录名   路径
	删除 rm -rf 目录名
	查看 ls        ls -a          ls -l==ll        find / -name '目录名'
文件
	新增 touch 文件名
	删除 rm -rf 文件名
	修改 vi/vim    i/o/a      Esc     Shift+:         wq保存并退出      q! 强制退出
	查     cat/more/less/tail/head       
	查询底部多少行    tail -n  文件名   
    查看前多少行      head -n 文件名
	过滤查询    grep  error/exeption 文件名     
	动态查询日志   tail -f 日志名	
	打包  tar -zcvf 文件名.tar  目录名/文件名
	解压  tar -xvf  文件名.tar       指定解压路径   tar -xvf  文件名.tar -C 路径
进程
	全都:ps -ef 
	某一个 :ps -ef | grep 进程名(tomcat/mysql)
	杀:kill -9 pid 
端口
	全部:netstat -an
	某一个 :netstat -an | grep 端口号(3306/8080)
网络
	ping www.baidu.com	
	ping 内网ip
查询ip
	ifconfig(linux)   ipconfig(window)
查看资源信息
	cpu:top
	内存:free
	磁盘:df -h
权限
	su root     
	chmod 777(rwx) 文件名	

2.Linux环境部署

安装jdk,tomcat(配置环境)
​	1:从公司的工具库中拿到jdk.tar,tomcat.tar包
​	2:通过远程连接工具(ssh/xshell)连接Linux服务器,将jdk和tomcat上传到服务器上
​	3:首先解压jdk.tar包(tar -xvf),将解压的之后的jdk路径填写在配置文件中
​	4:重启配置文件
​	5:通过Java -version 判断是否安装成功,安装成功则显示jdk的版本信息(1.8.0的版本)
​	6:jdk配置成功之后,接下来解压tomcat.tar包(tar -xvf )
​	7:开放8080端口
​	8:在tomcat中的bin目录在,启动(./startup.sh),
​	9:在游览器中输入ip:8080,可以检验tomcat是否成功启动(如果tomcat没有启动,可以通过ps -ef | 		grep tomcat 查看tomcat进程是否开启,如果没有开启,,再次执行启动tomcat命令)
项目部署(web端项目)
​	1:将开发的压缩包(.tar),解压之后,放到tomcat中的webapps目录下,重启tomcat(./startup.sh)
​	2:在游览器中输入ip:8080/解压后名称,查看项目	
安装MySQL
1:从公司的工具库中拿到mysql.tar包
​	2:通过远程连接工具(ssh/xshell)连接Linux服务器,将mysql压缩包上传到服务器上
​	3:解压mysql.tar包(tar -xvf )
​	4:解压后的rpm文件,分别进行客户端和服务端的安装(rpm -ivh)
​	5:启动mysql(service mysql start)
​	6:将mysql加到系统服务中并设置开机启动
​	7:登录mysql(msyql –u root -p)
​	8:修改密码(set password = password('xxx');)
​	9:需要设置开启远程登录mysql的权限
​	10:开放Linux的对外访问的端口3306
​	11:通过连接MySQL工具(navicat)直接访问 

Charles

1.熟练使用Charles进行抓包,断点等操作。

charles原理

客户端向服务器发送请求,被Charles拦截,charles伪装成客户端向服务器发送请求,拿到服务器返回的证
书,伪装成服务器返回给客户端,客户端用charles的公钥加密对称密钥发给伪装服务器的Charles,
Charles用自己的私钥解密对称密钥,用服务器公钥加密发给服务器,服务器解密对称密钥,发送请求

证书下载

默认情况下,charles不能解析https协议的接口,里面的请求和响应数据都是乱码格式,所以我们需要下载 ssl证书,来获取里面的数据

web端证书下载操作步骤

点击help,选中ssl Proxying(ssl代理),点击Install Charles Root Certificate(下载根 证书), 然后按照证书,将证书指定在受新任的根证书颁发机构,提示"导入成功"; 最后在proxy(代理)中设置ssl proxy setting(ssl代理设置),将host和port写入*号,重启 charles即可

2.如何定位问题

方式一:

通过抓包工具Charles抓取该接口,查看接口中请求和响应的数据,如果请求中的请求头,请求参数,请求 url有问题那么是前端的问题,如果请求没有问题响应有问题,那么是后端的问题

方式二:

查看日志信息,如果日志中出现:FileNotFoundError(找不到对应的文件),IndexError(下标越界), KeyError(错误的key),ValueError(错误的值),TypeError(类型错误),ZeroDivisionError(逻辑 算术出错)等是后端的报错,找后端的开发进行解决,如果出现类似:undefined(已声明,未赋值)

一、修改request请求参数值

  1. 在接口处鼠标右击 选择breakpoints(断点)
  2. 点击proxy(代理)选择Breakpoint settings(断点设置)
  3. 选中Enanle Breakpoint,清除已有的接口信息,点击Add,点击选中的接口,复制粘贴回车,自动填充 修改query(参数)为* request勾选 输完值 点击ok保存变量
  4. 重新请求接口 在edit request 点击具体值进行修改添加或删除 点击Execute
  5. 关掉 break point(断点) 点击 abort(终止)

场景:

注册中密码长度在6~18位,在界面上操作,如果密码小于6位或者大于18位,那么前端会进行约束,注册是置
灰的,那么需要验证后端是否进行处理
实现步骤:在前端输入用户名和密码点击注册的时候,我这边打开Charles抓取该接口,通过断点调试修改
request中密码长度小于6位,发送请求验证后端是否处理,如果后端显示注册成功,那么需要后端进行修改

二、修改返回值 response

  1. 选中接口右击 选择breakpoints(断点)
  2. 点击proxy(代理)选择breakpoints settings (设置断点)
  3. 选中Enanle Breakpoint,清除已有的接口信息,点击Add,点击选中的接口,复制粘贴回车,自动填充 修改query(参数)为* request勾选 输完值 点击ok保存变量
  4. 重新请求接口 点击edit response 返回值所有的字符都可以修改 点击Execute
  5. 刷新页面 请求接口 点击abort(终止)

三、修改返回值 response (map local 本地存储)

  1. 选中接口点击右键,save response保存为TXT文件 存放到本地 编码的格式为’utf-8’
    否则可能会出现乱码
  2. 选择tools, 选择maplocal功能 query(参数)修改为 *
    (map to 下 local path 填TXT文件的绝对路径)
  3. 修改TXT文件中 需要修改的字段值
  4. 关闭浏览器,重新打开浏览器请求
  5. 完毕后 点击 tools(工具) 点击 map local 取消勾选的 enable map local

场景:
品界面详细信息展示,如果超过三行以小数点省略,抓取该接口,修改响应数使商品信息描述超过三行,看
看在前端的展示是否正确

四、弱网测试

  1. 点击proxy(代理) 选择 throttle settings(节流阀调整) 勾选 enable throttling(使用节流阀) 修改 宽带: 上限值 下限值 带宽的利用率:上限值 下限值 数据传输往返延迟时间值 最大传输字节量 可靠性 网速不稳定性的占比等 点击ok保存
  2. 打开throttle setting 版本3.0是红旗 4.0的是乌龟

五、模拟 404/403 返回值

  1. 点击tools(工具)选择blacklist(黑名单)
  2. 允许启动黑名单功能 选择接口返回值的形式 添加接口地址并保存
  3. 选中需要返回404/403的接口 点击ok再次请求

Jmeter

1.熟练使用Jmeter做接口性能测试。

一:性能测试流程

首先拿到接口文档,梳理业务(登录–搜索商品–添加购物车–支付),将业务中的接口填充在jmeter的 http请求中,然后增加并发量,关注性能指标是否符合要求

二:性能指标

聚合报告:并发量,响应时间(2/5/原则),吞吐量,错误率(0.05%) 服务器:cpu和内存

三:吞吐量

系统吞吐量几个重要参数:QPS(TPS)、并发数、响应时间 TPS:单位时间内处理事务的能力 QPS:每秒查询率 TPS=并发数/响应时间 吞吐量一般设置在100左右

四.性能测试

​ 1.右键——添加——线程——线程组——设置线程数——用时——循环次数

  1. 右键线程组——添加——取样器——HTTP请求, 设置协议——服务器名称或IP端口号,请求方式,路径,内容编码
  2. 右键线程组——添加——监听器——查看结果树和聚合报告
  3. 运行, 查看结果

五.接口关联/依赖

第一种方式:json提取器 在第一个接口右键添加后置处理器中的json提取器,在json提取器中设置变量名和json表达式提取的 值,在第二个接口中通过${变量名}引用

第二种方式:正则表达式 在第一个接口右键添加后置处理器中的正则表达式,在正则表达式中设置变量名和正则表达式,在第二个 接口中通过${变量名}引用

六.常见的断言

第一种:响应断言(适用返回文本是json类型或者是xml类型)

第二种:json断言(只适用返回文本是json类型的)

第三种:xpah断言(适用html界面)

七.接口是否有问题

在聚合报告中查看error(错误率) 在察看结果树中的响应数据中查看报错信息 在察看结果树中的导入本地文件,打印错误信息

八.如何操作秒杀

在秒杀的接口中添加定时器中的集合点(Synchronizing Timer),实现在规定的时间点上去一次性执行所有请求

九.参数化/批量

第一种方式:csv文件读取 将测试的数据保存在本地的文件中,在该接口中添加CSV数据文件设置,指定本地文件;设置变量 名,如果文件中有多个接口,需要在变量名中使用英文逗号;在该接口中使用${变量名};接着在该接口中设置 断言,验证预期结果和实际结果。

第二种方式:函数助手 将测试的数据保存在本地的文件中,点击选项中的函数注释对话框,选中jmeter中内置方法 _CsvRead,填写本地文件的路径和对应对的索引值生成对应的函数值,在该接口中使用${变量名};接着在该 接口中设置断言,验证预期结果和实际结果。

Python

1、Python的数据类型

数字、字符串、列表、字典、元祖、集合

2、字符串的常见操作

1)根据下标索引取值,从0开始
2)切片  语法:[起始下标:结束:步长],左闭右开区间    反转字符串[::-1]
常见操作:
	str.find()  查找,没有返回-1
    str.index() 查找,没有报错
    str.count()  计数
    str.replace()  替换
    str.split()   对其进行切片 ,以。。。分割
    str.startwith()  以...开头
    str.endswith()  以...结尾
    str.join()   构造出一个新的字符串

3.列表的常见操作

循环遍历   for i in 列表:
根据下标索引取值
相关操作:
增 list.append() 列表尾部添加元素   append添加的是一个整体
   list.extend() 将另一个集合中的元素逐一添加到列表中  extend将元素逐一添加
   list.insert(index,object) 在指定位置index前插入元素object  没有索引报错
删 del:根据下标进行删除  不加下标,整体删除,会报未定义
   pop:默认珊瑚最后一个元素,也可以根据下标
   remove:根据元素的值进行删除
改  根据下标直接修改
查   in  在...里
	 not in
    index('元素',起始,结束)左闭右开区间
    count  计数
常见操作: 排序 sort方法是将list按特定顺序重新排列,默认由小到大,参数reverse=True可改为倒序
		 反转 reverse 将list逆置
列表的嵌套   根据下标:如[-1][0]
可变   根据id内置方法查看

4.元祖的常见操作

不可变,元素不能修改
内置函数 index和count

5.字典的常见操作

{'key':'value'}
查  根据键取值,没有这个键就会报错
	dict,get('键','自己的描述')    没有回报None,或者根据自己的描述
    dict.keys    取出所有键(元祖)
    dict.values   取出所有值(元祖)
    dict.items    取出所有键值对(元祖)
改: 通过键直接赋值
增   变量名['键'] = 数据  没有直接添加,有就修改
	多条修改(增)  info.update({'name':'laoliu','age':'20'})
删    del 删除指定的元素(删除后不能访问,否则会报错)
	  clear  清空,返回{}
      pop('键')
len()    查看键值对的个数

6.集合的常见操作

例:{2,6,5}
特性:无序、唯一、可变set()
创建空集合必须使用set()
增:  add
    update  把要传入的元素拆分,作为个体传入到集合中
删   remove  使用remove删除集合中的元素  如果有 直接删除 如果没有 程序报错
	 pop     使用pop删除是随机删除集合中的元素 如果没有元素程序报错
     discard  如果元素存在 直接删除 如果元素不存在 不做任何操作
交集  & 或者s.intersection()
并集  | 或者s.union()
差集  - 或者s1.difference(s2)   将集合s1里去掉和s2交集的部分
补集  ^ 或者s.synmetric_difference() 并集里去掉交集的部分

7.变量

type  查看变量的类型
命名规则  1.只能由字母、数字、下划线'_'组成
	     2.不能以数字开头
         3.不能使用python中的关键字
         4.见名知意
格式化输出 % %s匹配字符串
		   %d有符号十进制整数
           %f浮点数
         format    

8.输入输出

输入:input
输出:print

9.运算符

算数运算符 : +(加)-(减)*(乘) /(除) //(取模) **(幂)
赋值运算符: = 
复合赋值运算符: += -= *= /= **=
比较关系运算符: == != 
逻辑运算符:and or not

10.熟练使用单元测试脚本unittest,pytest。

unittest:它是python中自带的单元测试模块,用来做单元测试,它里面封装好了一些校验返回结果方法(断言)和一些用例执行前的初始化操作。
unittest中最核心的部分是:TestFixture、TestCase、TestSuite、TestRunner
TestFixture:用于测试环境的准备,销毁,还原。 主要方法:setUp(),tearDown(),setUpClass(),tearDownClass()
TestCase: 测试用例
TestSuite:组件,测试用例的集合
TestRunner:执行测试用例
pytest
1.pytest的命名规则
pytest单元测试中的类名和方法名必须是以test开头,执行中只能找到test开头的类和方法,比unittest更加严谨。
pytest的模块命名必须以test_开头或者结尾,否则不能找到该模块的测试用例。
2.pytest与unittest的相同点
unittest :Setup>> setupclass , teardown >> teardownclass
Pytest: setup, setup_class和teardown, teardown_class函数(和unittest执行效果一样)
运行于测试方法的始末,即:运行一次测试函数会运行一次setup和teardown
运行于测试方法的始末,但是不管有多少测试函数都只执行一次setup_class和 teardown_class

11.熟练使用selenium+unittest实现PO模型。

PO模型是Page Object Model的简写, 页面对象模型。
PO模型又叫PO设计模式,是selenium自动化测试中最佳的设计模式之一,主要体现在对界面交互细节的封装,将页面定位和业务操作分开,也就是把对象的定位和测试脚本分开,在实际测试中只需要关注业务流程,从而提高可维护性。
PO模型简单来说:就是通过面向对象的方式,封装页面定位和页面动作操作。与测试的逻辑分开。
通俗解释一下就是每个页面当成一个对象,给这些页面写一个类,每一个page class维护着该web页的标签元素集和操作这些元素的方法;至于测试脚本则单独写,需要什么就去这些页面类去调用即可。这样的好处就是如果页面元素发生变化,你去维护页面类即可,测试类你基本不用管。
po 是一种设计思想,不同的人根据这个思想写出来的代码是不一样的。(重点看如何封装)
总结:PO模型实现过程是:通过面向对象的方式,对页面定位和页面操作进行分离封装(解耦合,方便后续维护)。

优点:
提高代码的可读性
减少了代码的重复
提高代码的可维护性, 特别是针对UI界面频繁变动的项目.
(也就是面向对象的优点)
缺点:
造成项目结构比较复杂(因为是根据流程进行了模块化处理)

PO模型一般首先抽象封装一个BasePage类,这个基类拥有一些指向Webdriver实例的属性,然后每一个Page继承基类BasePage,可以通过driver管理每一个Page中的元素,而且在Page中将这些操作封装为一个一个的方法。在测试用例中使用这些page类,进行组织测试步骤的工作。

这样做的好处,就是有元素变化,只需要维护每一个Page就行了,测试步骤变化,只需要维护TestCase即可。

如何使用selenium进行web自动化测试

首先我需要下载selenium,如果是在火狐浏览器上需要下载pip install
selenium==2.48.0,其次下载与浏览器相近的驱动,接着进行三方库的导入 from selenium
inport webdriver,紧接着需要创建一个浏览器对象,进行浏览器尺寸、位置的相关设置,如
窗口最大化maximize_window(),然后获取对应的网址,并结合xpath、css对元素进行定位,
还会使用switch_to_window(handles[n])句柄做多窗口之间的切换,就比如我最近一个项目
标识解析服务这个模块,然后这个里面有一个点击首页标识解析服务跳转的功会跳转至另一个窗口,
这个时候就需要切换句柄,然后通过定位这个页面里的元素,。还有利用switch_to.frame(变量)
进行多表单之间的切换,就比如我上个项目的模式训练模块吧,这个里面有一个添加训练这个功能,
当我点击进去进行定位,然后这个里面有一个“选择训练集”按钮,当点击他的时候又会跳出一个表单,
如果想要对这个里面进行元素定位,就得使用多表单切换进行操作了。当然还会有一些其他的操作,
比如鼠标和键盘的操作,弹框操作,设置浏览器等待等等啦  

### 

结合ant生成测试报告

.首先配置ANT,Tomcat、Jenkins,配置相应的环境变量
进⾏性能需求分析、⽅案编写、性能脚本编写、执⾏和维护
使⽤Charles进⾏抓包分析数据并进⾏修改
使用ant -v进行验证
配置库文件:将jmeter extras目录下的ant-jmeter-1.1.1.jar文件拷贝到ant安装目录下的lib文件夹中
配置ant的编译文件build.xml
将下图中的build.xml拷贝到Text下的TestAuto目录下的pc目录中
修改build.xml文件中的数据
配置jmeter.propertise文档
在build.xml目录下输入cmd,并执行ant
在本地查看测试报告

11.2appium+unittest实现po模型

首先创建文件

第一层:basepage层:描述每个页面相同的属性及行为

第二层:pageobject层(每个的独有特征及独有的行为)

第三层:testcase层(用例层,描述项目业务流程)

然后basepage页面封装公共的属性和行为,pageobject业务代码页导入封装的公共方法实例化里面的方法下载pip install Appium-Python-Client==1.3.0导入然后在testcase测试层导入要测试的page页实例化里面的方法调用即可然后导入htmltestRunnt生成测试报告

requests是怎么做的自动化测试

我主要是利用requests做接口测试的,首先我需要下载pip install requests,还是以读取
csv文件为例吧,需要在pycharm里面创建读取文件代码的目录、存放单元测试代码的目录、存
放csv文件的目录以及生成测试报告的目录,先读取这个csv文件,然后利用requests请求接口
返回状态码,通常使用get和post方法,在根据pytest断言设置,结合allure生成测试报告

12.掌握移动端测试ADB命令,Monkey测试,testin云测。

查看移动端设备
adb devices
1.开启服务
adb start-server
2.关闭服务 
adb kill-server
安装软件
3.adb install apk路径
覆盖安装
4.adb install -r apk路径(-r 代表如果apk已安装,重新安装apk并保留数据和缓存文件)
:查看(系统)包名
5.系统应用:adb shell pm list packages –s
查看(第三方)包名
6.第三方应用:adb shell pm list packages -3
7查看(全部)包名
全部包名:adb shell pm list packages
8卸载软件
adb uninstall 软件包名
9将电脑文件传输到移动端
adb push 电脑路径 移动端路径
10将移动端文件传输到电脑
adb pull 移动端路径 电脑路径
11截屏
adb shell screencap -p 截图文件路径  四古音卡普
12查看手机CPU情况
adb shell dumpsys cpuinfo  当朴塞斯 
13查看应用内存使用情况
adb shell dumpsys meminfo +包名:应用的内存使用情况
14显示磁盘使用信息
adb shell dumpsys diskstats  地撕开死
15查看电池状态
adb shell dumpsys battery  白催

查询当前应用程序的包名和启动项
adb shell dumpsys window  |findstr \/ |findstr name=
adb shell dumpsys window | findstr mCurrentFocus

16查看手机日志
adb logcat
指定 logcat 的日志输出格式 : -- "-v"选项 : 使用adb logcat -v time 命令, 可以查看日志的输出时间;
将手机日志输出到本地文件中:adb logcat -v time > C:/log/aa.txt
17adb shell monkey 100 执行monkey测试100次 针对rom测试或者

18monkey将只允许系统启动指定的app

adb shell monkey -p 包名 100

19显示日志详细程度

adb shell monkey -p 包名 -v 30 

20将log信息写到本地

adb shell monkey 100 >路径

随机数种子

adb shell monkey –s 10 100

事件间隔

adb shell monkey -p com.example.login --throttle 300 100  服软拉

--pct-touch 触摸事件

adb shell monkey --pct-touch 67 -v 10

调整手势事件motion事件百分比。  

adb shell monkey --pct-motion 67 -v 10

正常操作,忽略异常

--ignore-crashes 银鸽no沃  可挖谁死

忽略超时

--ignore-timeouts(ANR)

 Null指针异常
空指针异常主要是有NullPointerException异常提示,在Monkey测试过程中,该信息一般记录在plog.log (locat中也有该信息)中。
 debug异常
debug异常主要是由于应用程序本身的错误导致的异常。在Monkey测试过程中,该信息同样记录在plog.log (locat中也有该信息)中。一般情况下,出现的该问题,很可能在手动测试时也可以测试到
低内存异常
低内存异常一般情况下,主要表现在出现OutOfMemoryError异常或者提示Out of memory,其后果同样表现为抛出OutOfMemoryError异常或者是通过kill process 来杀掉部分进程以释放内存空间,当然如果被kill点关键的进程的话,也就可能导致部分应用会自动的退出。出现该情况时,主要是在进行频繁的进行大量的操作导致的,所以使用手动的方式也是可能进行重现的
操作无响应异常
操作无响应的问题,主要表现在Monkey运行过程中,出现某功能无响应,提示是否“强制关闭“或“等待“,同时会打印出相应的log信息

常见其他面试题

项目相关

1.印象最深的bug。

1.maplocal本地存储出现html5页面,在我确定我的操作步骤没有任何问题的时候,已经向jmeter客服反馈。
2.之前做开发的时候前端登录的时候必须要验证本地的ip是否在范围内,只有在范围内才可以登录,然后前端在页面加载之前就对ip进行了验证,导致输入网址的时候如果ip不在范围内就会出现白屏。
3.之前在测试检索的时候,会对检索进行过滤,就是不符合要求的内容是不能检索出的。但是就会出现检索过于绝对,比如说:“镰刀”是要过滤掉的,但是“镰刀会”不能过滤掉,这就会导致镰刀会也会过滤掉。

2.测试认为是bug,开发认为不是bug。

问题评估确认——明确开发不修改的原因——具体问题具体分析——沟通记录44

1.找到需求文档或者是原型图进行匹配
2.尝试多种测试环境和多种测试方法来确认是否为bug
3.整理bug的复现的步骤和出现的频率
4.开发坚持不认为是bug的时候找项目经理测试经理进行沟通来确认是否为bug
5.将客户经理 测试 测试经理和项目经理进行确认会来判定是否为bug
6.测试人员需要将bug整理并写入测试总结中

3.遇到bug不能定位如何解决

A.首先考虑环境问题,看是否能够还原原来的环境
B.遇到问题就要提,不能放过任何一个Bug,在提交的Bug描述中加上一句话,那就是复现概率,尝试20次,出现一次或尝试10次,交给开发,开发会根据Bug的复现概率,调整改Bug的优先级。
C.尽量回想发生问题时的复现步骤,不要漏掉任何一个细节,按照步骤的组合尝试复现
D.与开发人员配合,让开发人员对相应的代码检查,看是否通过代码层面检查出问题
E.保留发生bug时的log,附加到提交的Bug中,希望可以通过log中找到一些蛛丝马迹。
F.查看代码,也许是代码变更,引起的Bug

4.bug定位。

首先————日志,返回码,异常值
然后————各种观察工具(request,chalars,jmeter等)
最后————单元测试(代码查)

5.测试过程中突然需求添加一个需求,你怎么做

1.确认需求的准确性。
找项目经理确认
2.找开发进行沟通,给出项目的预计完成时间
3.判断项目周期是否需要延期处理,找项目经理协商。
4.编码,编写测试用例,测试
5.测试新需求是否会给之前带来新的问题。

6.响应码

1xx(临时响应)
101(切换协议) 请求者已要求服务器切换协议,服务器已确认并准备进行切换。

2xx(成功)
200:正确的请求返回正确的结果,如果不想细分正确的请求结果都可以直接返回200。

3xx(已重定向)
300:请求成功,但结果有多种选择。
301:永久重定向
302:临时重定向

4xx(请求错误)
400:请求出现错误,比如请求头不对等。
401:没有提供认证信息。请求的时候没有带上 Token 等。
403:请求的资源不允许访问。就是说没有权限。
404:请求的内容不存在。

5xx(服务器错误)
500:服务器错误。
501:请求还没有被实现。
502:网关错误。
503:服务暂时不可用。服务器正好在更新代码重启。

7.公司专业名称

RD: Research and Development engineer,研发工程师,对某种不存在的事物进行系统的研究和开发
并具有一定经验的专业工作者(开发)
PM: Product Manager,产品经理,又称品牌经理。举凡产品从创意到上市,所有相关的研发、调研、生
产、编预算、广告、促销活动等等,都由产品经理掌控。
QA: Quality Assurance,品质保证。QA的主要职责就是质量保证工作(测试)
OP: Operator,操作员,管理员
case:测试用例  

8.给你一个新产品,你需要从那些方面考虑

1.查看需求文档
2.向开发要详细概要
3.测试用例
4.参考类似的产品

9.云测平台

登录Testin云测平台
2.选择标准兼容测试并点击开始测试
3.上传要测的apk文件
4.选择待测应用、补充测试选项、提交测试
5.查看测试任务状态
6.查看报告
7.下载报告并查看里面的信息
8# 报告里面都有哪些内容?
手机型号(通过的、未通过的)、分辨率、CPU、内存、兼容性、日志信息、安装、启动、卸载
时间、温度、流量、FPS等等

你可能感兴趣的:(软件测试)