测试工程师面试宝典Q&A(非编程)

Q:Web测试和APP测试有什么区别?
A:不管是传统行业的web测试,还是app测试,都离不开测试的基础知识,即是不管怎么变,测试的原理依然会融入在这两者当中。

1、Web测试和APP测试相同点

1)设计测试用例时,依然都是依据边界值分析法、等价类划分等; 
2)多数采用黑盒的测试方法,来验证业务功能是否得到正确的应用; 
3)需要检查界面的布局、风格和按钮等是否简洁美观、是否统一等; 
4)测试页面载入和翻页的速度、登录时长、内存是否溢出等; 
5)测试应用系统的稳定性等。 

2、不同点

相对于web测试,手机软件测试,除了要考虑基本的功能测试、性能等,还要考虑手机本身固有的属性特征。所以对比web测试和手机测试,手机测试过程中还需要注意如下几个方面特性: 
1)手机作为通信工具,来电、去电、接收短信等操作都会对app应用程序产生影响,所以app测试第一个要考虑的属性特征是:中断测试。 

中断测试有人为中断、新任务中断以及意外中断等几种情况,主要从以下几个方面进行验证:

a.来电中断:呼叫挂断、被呼叫挂断、通话挂断、通话被挂断 
b.短信中断:接收短信、查看短信 
c.其他中断:蓝牙、闹钟、插拔数据线、手机锁定、手机断电、手机问题(系统死机、重启) 
2)手机用户对app产品的安装卸载操作:从上一个版本/上两个版本直接升级到最新版本。 

全新安装新版本
新版本覆盖旧版本安装
卸载旧版本,安装新版本
卸载新版本,安装新版本
3)web自动化测试使用的工具较常用的是QTP,而android手机自动化测试工具比较常用的是monkey、monkeyrunner。

兼容性测试,web的比较常用考虑到是不同分辨率的电脑、不同浏览器。app考虑的是不同手机型号、厂家、分辨率和屏幕大小等。


Q:什么是ddt
A:ddt是unittest中的一种,数据驱动设计模式,一组数据对应一个测试用例,用例自动加载生成。一般测试数据大多数为多个字典的list,测试类前增加@ddt.ddt,case前加@ddt.data(),运行后会自动加载形成多个测试用例


Q:python中的模块、包、库
A:模块:包含并且有组织的代码片段为模块,一个文件就相当于一个模块
包:包是一个有层次的文件目录结构,它定义了由n个模块或n个子包组成的python应用程序执行环境。包是一个包含__init__.py 文件的目录,该目录下一定得有这个__init__.py文件和其它模块或子包
库:库的概念是具有相关功能模块的集合。这也是Python的一大特色之一,即具有强大的标准库、第三方库以及自定义模块


Q:数据库索引包含哪些
A:按照索引列的唯一性可以分为唯一索引和非唯一索引:非唯一索引create index 索引名 on 表名(列名) tablespace 表空间名
按照索引列的个数分为单列索引和复合索引
使用USER_IND_COLUMNS查询某个TABLE中的相应字段索引建立情况
使用DBA_INDEXES/USER_INDEXES查询所有索引的具体设置情况。


Q:什么是迭代器和生成器?
A:
迭代器:迭代是Python最强大的功能之一,是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

迭代器有两个基本的方法:iter() 和 next()。字符串,列表或元组对象都可用于创建迭代器

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
 
  def __next__(self):
    x = self.a
    self.a += 1
    return x
 
myclass = MyNumbers()
myiter = iter(myclass)
 
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

执行输出结果为:

1
2
3
4
5

StopIteration
StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 next() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
 
  def __next__(self):
    if self.a <= 20:
      x = self.a
      self.a += 1
      return x
    else:
      raise StopIteration
 
myclass = MyNumbers()
myiter = iter(myclass)
 
for x in myiter:
  print(x)

执行输出结果为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

生成器:使用了 yield 的函数被称为生成器(generator)。在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。

调用一个生成器函数,返回的是一个迭代器对象。

以下实例使用 yield 实现斐波那契数列:

#!/usr/bin/python3
 
import sys
 
def fibonacci(n): # 生成器函数 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n): 
            return
        yield a
        a, b = b, a + b
        counter += 1
f = fibonacci(10) # f 是一个迭代器,由生成器返回生成
 
while True:
    try:
        print (next(f), end=" ")
    except StopIteration:
        sys.exit()

执行以上程序,输出结果如下:

0 1 1 2 3 5 8 13 21 34 55


Q:进程和线程的区别
A:进程:是程序的一次执行过程,是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间,至少有五种基本状态:初始态/执行态/等待状态/就绪状态/终止状态
线程:是cpu调度和分派的基本单位,它可与同属一个进程的其他线程共享所拥有的全部资源

线程是进程的一部分,一个线程只属于一个进程,但是一个进程可以有多个线程

进程和线程 的区别:
根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位
开销方面:每个进程都有独立的代码和数据空间,进程之间切换开销大。线程可以看作轻量级的进程,同以类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(pc),线程之间切换开销小
所处环境:在操作系统中能同时运行多个进程(程序);同一个进程中有多个线程同时执行(通过CPU调度使每个时间片内只有一个线程执行)
内存分配:系统为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存,线程所使用的资源来自其所属的进程资源。线程组之间只能共享资源
包含关系:线程是进程的一部分,所以线程也被成为轻权进程或轻量级进程

”进程是资源分配的最小单位,线程是CPU调度的最小单位“

做个简单的比喻:进程=火车,线程=车厢
线程在进程下行进(单纯的车厢无法运行)一个进程可以包含多个线程(一辆火车可以有多个车厢)
不同进程间数据很难共享(一辆火车上的乘客很难换到另外一辆火车,比如站点换乘)同一进程下不同线程间数据很易共享(A车厢换到B车厢很容易)
进程要比线程消耗更多的计算机资源(采用多列火车相比多个车厢更耗资源)
进程间不会相互影响,一个线程挂掉将导致整个进程挂掉(一列火车不会影响到另外一列火车,但是如果一列火车上中间的一节车厢着火了,将影响到所有车厢)
进程可以拓展到多机,进程最多适合多核(不同火车可以开在多个轨道上,同一火车的车厢不能在行进的不同的轨道上)
进程使用的内存地址可以上锁,即一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。(比如火车上的洗手间)-“互斥锁”
进程使用的内存地址可以限定使用量(比如火车上的餐厅,最多只允许多少人进入,如果满了需要在门口等,等有人出来了才能进去)-“信号量”


Q:python中如何查找一个字典中的key?
A:
如果知道key名字,使用has_key()方法:
print d.has_key(‘site’)
如果不知道key名字,使用d.key()方法:
print ‘body’ in d.keys()


Q:python中如何使用list中的index进行查找?
A:语法
index()方法语法:
list.index(x[, start[, end]])
参数
x-- 查找的对象。
start-- 可选,查找的起始位置。
end-- 可选,查找的结束位置。


Q:单向链表和数组的区别
A:
(1)存储位置上:
数组逻辑上相邻的元素在物理存储位置上也相邻,而链表不一定;
(2)存储空间上:
链表存放的内存空间可以是连续的,也可以是不连续的,数组则是连续的一段内存空间。一般情况下存放相同多的数
据数组占用较小的内存,而链表还需要存放其前驱和后继的空间。
(3)长度的可变性:
链表的长度是按实际需要可以伸缩的,而数组的长度是在定义时要给定的,如果存放的数据个数超过了数组的初始大
小,则会出现溢出现象。
(4)按序号查找时,数组可以随机访问,时间复杂度为O(1),而链表不支持随机访问,平均需要O(n); 
(5)按值查找时,若数组无序,数组和链表时间复杂度均为O(1),但是当数组有序时,可以采用折半查找将时间复
杂度降为O(logn); 
(6)插入和删除时,数组平均需要移动n/2个元素,而链表只需修改指针即可; 
(7)空间分配方面:
数组在静态存储分配情形下,存储元素数量受限制,动态存储分配情形下,虽然存储空间可以扩充,但需要移动大量
元素,导致操作效率降低,而且如果内存中没有更大块连续存储空间将导致分配失败; 即数组从栈中分配空间,,对
于程序员方便快速,但自由度小。
链表存储的节点空间只在需要的时候申请分配,只要内存中有空间就可以分配,操作比较灵活高效;即链表从堆中分
配空间, 自由度大但申请管理比较麻烦。


Q:dict的底层原理:哈希
A:在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


Q:list的时间复杂度
A:在这里插入图片描述
在这里插入图片描述


Q:
印象深刻的bug
发现线上bug如何处理 ,以及流程
遇到的技术难点
A:可以是一些不容易复现的bug,或者影响比较广泛的bug。例如:最近一次公司H5项目更改了打包方式,导致上到生产环境后所有H5页面的按钮点击后都无响应。这是个P0级bug,特别影响用户的体验。当时是晚上11点多上线后发现的问题。当时RD的提测邮件中没有提到会对H5页面操作产生影响,所以在测试过程中只检查了各个H5页面可以正常访问便上线了。后来的复盘中意识到这里有两个问题:1 是RD在提测邮件中没有准确的预估自己的代码改动会带来的风险和影响范围 2测试没有形成完整的冒烟测试流程。测试这边应该建立一个完整的冒烟测试 测试用例库,可以分模块这样测试用例覆盖用户主路径以及一级页面,减少这种事情的发生
生产环境的bug,要根据验证程度来划分:P0级bug不能过夜,随提随改随上线,如是APP上的问题可以采用热更新或者重新提审的方式解决。P1/P2级bug可以等到第二天上班后再进行解决,这类bug主要是流程有问题或者提示信息有问题,或者页面闪动/加载不完全等问题,虽然影响体验但是不会影响主功能。UI’bug可以评估一下 是随下个版本更改上线还是立即更改上线。
技术难点:公司使用的是Reactnative框架编写的代码,所以在搭建android和iOS编译环境的时候遇到很多坑,比如镜像地址无法访问或者是yarn包没有更新导致iOS打包不成功,再或者是之前的编译脏数据影响到新的编译过程导致android包一直打不成功。这种的都是常见但又有点摸不着头脑的问题,有的时候是自己去查看错误日志根据提示定位,有的时候是问研发同学,看他们有没有遇到过


Q:select简单语句
A:https://www.runoob.com/sql/sql-select.html


Q:Linux常用命令
A:可以百度搜一下~很多


Q:支付场景的测试用例如何设计
A:
转载:https://blog.csdn.net/weixin_30410999/article/details/97747737
转载:https://blog.csdn.net/didi1663478999/article/details/108678972


Q:跳转到空页面的原因是?
A:
网络设置的问题
DNS服务器的问题
IE浏览器本身的问题
网络防火墙的问题
网络协议和网卡驱动的问题
HOSTS文件的问题
系统文件的问题
杀毒软件的实时监控问题
Application Management服务的问题
感染了病毒所致


Q:HTTP请求的请求方式有哪些
A:Get post put delete lock unlock link unlink options copy head purge


Q:dict的底层原理
A:转载https://blog.csdn.net/limengshi138392/article/details/97929500


Q:list的数据结构?
A:
List的结构-线性表
字符—线性
集合—哈希
元组—顺序表


Q:Json转dict的方式
A:
loads():将json数据转化成dict数据
dumps():将dict数据转化成json数据
load():读取json文件数据,转成dict数据
dump():将dict数据转化成json数据后写入json文件


Q:python常用的库
A:
一、时间处理模块:
a)time
b)datetime
strftime() 和 strptime()
由datetime转换成字符串:datetime.strftime()
由字符串转换成datetime:datetime.datetime.strptime()
二、读取Excel的库:openpyxl
三、日志库:logging
四、数据库:pymysql
五、随机数:random
六、字符串:string
七、requests
八、读取配置文件:yaml
九、ddt数据驱动
十、json
十一、unittest


Q:is和==的区别
A:
is也被叫做同一性运算符,这个运算符比较判断的是对象间唯一的身份表示,也就是id是否相同

==是python中标准操作符中的比较操作符,是用来判断比较两个对象的value是否相等


Q:类的继承
A:https://blog.csdn.net/let_life_stop/article/details/80933661


Q:三次握手
A:第一次握手序列号是x;
第二次握手序列号y,确认号x+1;
第三次握手序列号x+1,确认号y+1


Q:TCP的三次握手和四次挥手
A:
在这里插入图片描述
在这里插入图片描述


Q:在这里插入图片描述
A:在这里插入图片描述


Q:什么是事务:
A:
在这里插入图片描述


Q:接口自动化测试框架组成,和包括的模块?
A:
目录结构介绍如下:

config/: 文件路径配置
database/: 测试用例模板文件及数据库和发送邮箱配置文件
db_fixture/: 初始化接口测试数据
lib/: 程序核心模块。包含有excel解析读写、发送邮箱、发送请求、生成最新测试报告文件
package/: 存放第三方库包。如HTMLTestRunner,用于生成HTML格式测试报告
report/: 生成接口自动化测试报告
testcase/: 用于编写接口自动化测试用例
run_demo.py: 执行所有接口测试用例的主程序

常用模块:os,sys,time,json,config,unittest,request,ddt,yaml,HTMLtestrunner,sendmail


Q:get和post的区别?
A:
1、GET在浏览器回退时是无害的,而POST会再次提交请求。
2、GET产生的URL地址可以被Bookmark,而POST不可以。
3、GET请求会被浏览器主动cache,而POST不会,除非手动设置。
4、GET请求只能进行url编码,而POST支持多种编码方式。
5、GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
6、GET请求在URL中传送的参数是有长度限制的,而POST么有。
7、对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
8、GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
9、GET参数通过URL传递,POST放在Request body中。
10、GET和POST还有一个重大区别,简单的说:
GET产生一个TCP数据包;POST产生两个TCP数据包。
长的说:
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。


Q:TCP和UDP的区别
A:TCP的优点: 可靠,稳定 TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。 TCP的缺点: 慢,效率低,占用系统资源高,易被攻击 TCP在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的CPU、内存等硬件资源。 而且,因为TCP有确认机制、三次握手机制,这些也导致TCP容易被人利用,实现DOS、DDOS、CC等攻击。

UDP的优点: 快,比TCP稍安全 UDP没有TCP的握手、确认、窗口、重传、拥塞控制等机制,UDP是一个无状态的传输协议,所以它在传递数据时非常快。没有TCP的这些机制,UDP较TCP被攻击者利用的漏洞就要少一些。但UDP也是无法避免攻击的,比如:UDP Flood攻击…… UDP的缺点: 不可靠,不稳定 因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。 基于上面的优缺点,那么: 什么时候应该使用TCP: 当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。 在日常生活中,常见使用TCP协议的应用如下: 浏览器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ文件传输 ………… 什么时候应该使用UDP: 当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。 比如,日常生活中,常见使用UDP协议的应用如下: QQ语音 QQ视频 TFTP ……

有些应用场景对可靠性要求不高会用到UPD,比如长视频,要求速率

小结TCP与UDP的区别:

1.基于连接与无连接;
2.对系统资源的要求(TCP较多,UDP少);
3.UDP程序结构较简单;
4.流模式与数据报模式 ;
5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。

tcp协议和udp协议的差别

TCPUDP
面向链接面向非链接
可靠不可靠
少量数据传输大量数据
速度慢速度快

Q:浏览器输入url后经历的过程
A:
1、首先,在浏览器地址栏中输入url

2、浏览器先查看浏览器缓存-系统缓存-路由器缓存,如果缓存中有,会直接在屏幕中显示页面内容。若没有,则跳到第三步操作。

3、在发送http请求前,需要域名解析(DNS解析),解析获取相应的IP地址。

4、浏览器向服务器发起tcp连接,与浏览器建立tcp三次握手。

5、握手成功后,浏览器向服务器发送http请求,请求数据包。

6、服务器处理收到的请求,将数据返回至浏览器

7、浏览器收到HTTP响应

8、读取页面内容,浏览器渲染,解析html源码

9、生成Dom树、解析css样式、js交互

10、客户端和服务器交互

11、ajax查询


Q:分析接口返回正确,但是前端页面为空的原因
A:解决方法:

1、在js里面debugger,可以看到后台是否有返回数据。

2、直接console.log(),直接把返回值打印出来,查看返回的数据格式,方便前端进行数据的处理。

   PS:因为后端返回的数据较多,而且数据格式复杂,所以可能是Chrome的Response对数据长度或者大小有控制,而导致没有展示

Q:Python中list,tuple,dict,set的区别和用法
A:转载https://blog.csdn.net/miner_zhu/article/details/81075875


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值