前言:此文专门记载本人平时面试以及收藏的面试题目,如果有错误之处请及时指正,谢谢!
1、python的数据类型有哪些
答:Python基本数据类型一般分为:数字、字符串、列表、元组、字典、集合这六种基本数据类型。
浮点型、复数类型、布尔型(布尔型就是只有两个值的整型)、这几种数字类型。列表、元组、字符串都是序列。
2、列表和元组的区别
答:列表是动态的,长度可变,可以随意地增删改元素。列表的存储空间略大于元组,性能略逊于元组。
元组是静态的,长度大小固定,不可以对元组元素进行增删改操作。元组对于列表更加轻量级,性能稍优。
3、字典的原理
答:python中的字典底层依靠哈希表(hash table)实现, 使用开放寻址法解决冲突,
哈希表是key-value类型的数据结构, 可以理解为一个键值需要按照一定规则存放的数组, 而哈希函数就是这个规则
字典本质上是一个散列表(总有空白元素的数组, python至少保证1/3的数组是空的), 字典中的每个键都占用一个单元,
一个单元分为两部分, 分别是对键的引用和对值的引用, 使用hash函数获得键的散列值, 散列值对数组长度取余, 取得的值就是存放位置的索引
哈希冲突(数组的索引相同), 使用开放寻址法解决
这也是python中要求字典的key必须可hash的原因
数组中1/3的位置为空, 增加元素可能会导致扩容, 引发新的散列冲突, 导致新的散列表中键的次序发生变化, 这也是字典遍历时不能添加和删除的原因
字典在内存中开销很大, 实际上是以空间换时间
4、说一下hash算法与哈希冲突
答:哈希算法:根据设定的哈希函数H(key)和处理冲突方法将一组关键字映象到一个有限的地址区间上的算法。也称为散列算法、杂凑算法。
哈希表:数据经过哈希算法之后得到的集合。这样关键字和数据在集合中的位置存在一定的关系,可以根据这种关系快速查询。
非哈希表:与哈希表相对应,集合中的 数据和其存放位置没任何关联关系的集合。
由此可见,哈希算法是一种特殊的算法,能将任意数据散列后映射到有限的空间上,通常计算机软件中用作快速查找或加密使用。
哈希冲突:由于哈希算法被计算的数据是无限的,而计算后的结果范围有限,因此总会存在不同的数据经过计算后得到的值相同,这就是哈希冲突。
5、怎么解决哈希冲突
答:解决哈希冲突的方法一般有:开放定址法、链地址法(拉链法)、再哈希法、建立公共溢出区等方法。(https://www.cnblogs.com/zyyhxbs/p/12408604.html)
6、说下python的内存管理和垃圾回收机制
答:python的内存管理机制有三种:引用计数、垃圾回收、内存池。
引用计数:引用计数是一种非常高效的内存管理手段,当一个pyhton对象被引用时其引用计数增加1,当其不再被引用时引用计数减1,当引用计数等于0的时候,对象就被删除了
垃圾回收:引用计数、标记清除、分代回收(https://www.jianshu.com/p/892aa84e5814)
内存池:Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。
Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的 malloc。
另外Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。
也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。
7、内存过大时你有什么调优手段
答:1.手动垃圾回收 2.避免循环引用(手动解循环引用和使用弱引用)3.调高垃圾回收阈值
8、请简述下python的拷贝
答:1.赋值: 只是复制了新对象的引用,不会开辟新的内存空间。
2.浅拷贝: 创建新对象,其内容是原对象的引用。
浅拷贝有三种形式:切片操作,工厂函数,copy模块中的copy函数。
如: lst = [1,2,3,[4,5]]
切片操作:lst1 = lst[:] 或者 lst1 = [each for each in lst] 要注意:list1=lst 和list1=lst[:]的区别
工厂函数:lst1 = list(lst)
copy函数:lst1 = copy.copy(lst)
浅拷贝之所以称为浅拷贝,是它仅仅只拷贝了一层,在lst中有一个嵌套的list[4,5],如果我们修改了它,情况就不一样了。
3.深拷贝:只有一种形式,copy模块中的deepcopy函数。
和浅拷贝对应,深拷贝拷贝了对象的所有元素,包括多层嵌套的元素。
深拷贝出来的对象是一个全新的对象,不再与原来的对象有任何关联。
#说明如下:
#1.外层添加元素时, 浅拷贝c不会随原列表a变化而变化;内层list添加元素时,浅拷贝c才会变化。
#2.无论原列表a如何变化,深拷贝d都保持不变。
#3.赋值对象随着原列表一起变化
9、请讲一下协程的原理
答:我自己暂时也不清楚,还没有自己的理解,资料如下:
运用协程机制最典型的场景就是异步IO。所谓异步,是指一段程序在执行完成前有能力“暂停”,让其他程序段执行。
从语法上来看,协程和生成器类似,都是定义体中包含yield关键字的函数,所以总体上在协程中把yield看做是控制流程的方式。
协程是一个特殊的生成器,yield有返回值>生成器,yield没有>协程(没返回值就是协程)
(https://www.cnblogs.com/ajianbeyourself/p/11261302.html、https://www.cnblogs.com/yc3110/p/10443108.html)
10、数据库的事务是什么
答:数据库事务是指一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为 ACID(原子性、一致性、隔离性和持久性)属性
(https://www.cnblogs.com/chaojiyingxiong/p/11029406.html、https://blog.csdn.net/x_i_xw/article/details/81408656)
11、sql的多表联查方式
答:内连接:JOIN / INNER JOIN、不等连接:ON 子句中使用了不等于运算符、自连接:一张表连接自身、左(外)连接:LEFT JOIN / LEFT OUTER JOIN、
右(外)连接:RIGHT JOIN / RIGHT OUTER JOIN、全(外)连接:FULL JOIN / FULL OUTER JOIN、交叉连接:CROSS JOIN (可用","代替)、
UNION 、UNION ALL操作符用于合并两个或多个 SELECT 语句的结果集。
12、数据库的存储过程
答:一组为了完成特定功能的SQL语句集(或者自定义数据库操作命令集), 根据传入的参数(也可以没有),
通过简单的调用, 完成比单个SQL语句更复杂的功能, 存储在数据库服务器端,只需要编译过一次之后再次使用都不需要再进行编译:主要对存储的过程进行控制
(https://www.runoob.com/w3cnote/mysql-stored-procedure.html)
13、数据库的存储过程与事务的异同
答:事务是保证多个SQL语句的原子型的,也就是要么一起完成,要么一起不完成
存储过程是把一批SQL语句预编译后放在服务器上,然后可以远程调用
(https://www.jb51.net/article/158051.htm)
14、cookie与session的区别是什么
答:(1)Cookie以文本文件格式存储在浏览器中,而session存储在服务端,因为每次发起 Http 请求,都要携带有效Cookie信息,所以Cookie一般都有大小限制,以防止增加网络压力,一般不超过4k
(2)cookie的存储限制了数据量,只允许4KB,而session是无限量的
(3)我们可以轻松访问cookie值但是我们无法轻松访问会话值,因此它更安全
(4)设置cookie时间可以使cookie过期。但是使用session-destory(),我们将会销毁会话。
(https://baijiahao.baidu.com/s?id=1619095369231494766&wfr=spider&for=pc)
15、项目中能不能只使用SESSION,不使用COOKIE
答:可以,通过重定向的形式,把session id放在url后面,但是这样做直接将把session id暴露出来了,于安全考虑不建议使用这样的方式
(https://blog.csdn.net/weixin_40648117/article/details/78844100)
16、http和https的区别
答:1、https协议需要到CA (Certificate Authority,证书颁发机构)申请证书,一般免费证书较少,因而需要一定费用。(原来网易官网是http,而网易邮箱是https。)
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的。Https协议是由SSL+Http协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息。)
(https://blog.csdn.net/guolin_blog/article/details/104546558、https://blog.csdn.net/qq_38289815/article/details/80969419)
17、https是非对称加密还是对称加密
答:Https的加密机制是一种共享密钥加密和公开密钥加密并用的混合加密机制。
握手前使用非对称加密,连接后使用对称加密,因为仅使用非对称加密的话,会影响数据的传输效率
(https://blog.csdn.net/jiangshangchunjiezi/article/details/88545263)
18、启动shell脚本的方式
答:1、工作目录执行,指的是执行脚本时,先进入到脚本所在的目录(此时,称为工作目录),然后使用 ./脚本方式执行
2、绝对路径中执行,指的是直接从根目录/到脚本目录的绝对路径
3、sh执行,指的是用脚本对应的sh或bash来接着脚本执行
4、shell环境执行,指的是在当前的shell环境中执行,可以使用 . 接脚本 或 source 接脚本
(https://www.jb51.net/article/161001.htm)
19、SQL与ORM的优缺点
答:相对来说,ORM的缺点就是SQL的优势地方,而优点也是SQL的劣势地方。
优点
方便的使用面向对象,语句清晰
防注入『这个其实不算ORM的核心,因为比如Phalcon的SQL形式写法也可以防注入』
方便动态构造语句,对于不同的表的相同操作采用多态实现更优雅
一定程度方便重构数据层『比如改表名,字段名等』
设置钩子函数
缺点
不太容易处理复杂查询语句
性能较直接用SQL差
(https://blog.csdn.net/qq_35443962/article/details/80361987)
20、请讲一下生产者消费者模型
答:生产者消费者模型设计要合理,如果生产者慢了,可以增加生产者,消费者慢了,增加消费者;
实际应用中,生产者,消费者可能是两套不同的系统,不会存在于一个进程里,甚至不在同一台设备上;而queue.Queue只能用于线程间通讯,那么该怎么办呢?
采用消息队列,比如rabbitMQ;
最后,上传一篇将进程线程做了很好的类比的一篇文章
计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。
假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。
进程就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。
一个车间里,可以有很多工人。他们协同完成一个任务。
线程就好比车间里的工人。一个进程可以包括多个线程。
车间的空间是工人们共享的,比如许多房间是每个工人都可以进出的。这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。
可是,每间房间的大小不同,有些房间最多只能容纳一个人,比如厕所。里面有人的时候,其他人就不能进去了。这代表一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。
一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。这就叫“互斥锁”(Mutual
exclusion,缩写 Mutex),防止多个线程同时读写某一块内存区域。还有些房间,可以同时容纳n个人,比如厨房。也就是说,如果人数大于n,多出来的人只能在外面等着。这好比某些内存区域,只能供给固定数目的线程使用。这时的解决方法,就是在门口挂n把钥匙。进去的人就取一把钥匙,出来时再把钥匙挂回原处。后到的人发现钥匙架空了,就知道必须在门口排队等着了。这种做法叫做“信号量”(Semaphore),用来保证多个线程不会互相冲突。
不难看出,mutex是semaphore的一种特殊情况(n=1时)。也就是说,完全可以用后者替代前者。但是,因为mutex较为简单,且效率高,所以在必须保证资源独占的情况下,还是采用这种设计。
- 操作系统的设计,因此可以归结为三点:
(1)以多进程形式,允许多个任务同时运行;
(2)以多线程形式,允许单个任务分成不同的部分运行;
(3)提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。
(https://www.cnblogs.com/deeper/p/7730203.html)
21、HTTP状态码有哪些?
答:HTTP状态码总的分为五类:1开头:信息状态码、2开头:成功状态码、3开头:重定向状态码、4开头:客户端错误状态码、5开头:服务端错误状态码
22、如何保障测试的充分度?
答:从代码覆盖率和业务覆盖率来定义充分度模型,代码覆盖率比较直观,业务覆盖率可以基于流量场景挖掘技术及fuzz技术来补充度量
23、自动化测试用例如何设计?
答:自动化用例的设计依据场景诉求构造合理输入及输出断言,测试用例需要满足健壮性,有效性,可扩展,时效性要求
24、如何对测试用例进行优化与提炼,精简不必要测试用例?
答:等价划分,可从代码路径,业务要素,领域模型三个方面做最大覆盖最小流量用例精简,也可以考虑在变更基础上的精准测试
25、自动化测试框架设计中的分层如何实现,有哪几类分层?
答:自动化框架设计包含数据流,执行流,数据流解决测试数据存储及使用方式,执行流定义标准测试流程,一个标准的测试框架流程应该是数据清理,数据准备(入参,db,外部依赖),结果验证
26、如何准备完整的测试数据?
答:这个问题没啥可答的,要让一个用例能够符合预期就需要构造合理的输入,数据准备,需要依赖对于系统设计及业务的了解,没啥方法,但是可以借助实时流量提供准备数据效率
27、自动化测试执行前后,分别需要进行何种操作,以确保自动化不会影响系统运行?
答:用例运行可独立部署集群或者线下集群,一般很少在生产环境运行
28、如何基于Mock实现数据结果的返回,实现外部接口的测试?
答:mockito这些工具类可以看一下,也可以写拦截器构造返回对象
29、如何评判系统是否具备可测性?
答:这个问题比较广泛,我需要点时间整理出来
30、自动化测试执行中,如何对多个用例进行并发运行?
答:并发运行testng具备,其余的可看一下jenkins的多job或者自己写并发调度
31、在较大自动化用例运行压力下,如何实现自动化测试框架的分布式集群?
答:要做到这个点用例需要具备隔离性,其余的均衡调度就可以了
Web 自动化测试
32、Selenium 中 hidden 或者是 display = none 的元素是否可以定位到?
答:不能,可以写 JavaScript 将标签中的 hidden 先改为 0,再定位元素
33、Selenium 中如何保证操作元素的成功率?也就是说如何保证我点击的元素一定是可以点击的?
答:
1.添加元素智能等待时间 driver.implicitly_wait(30)
2.添加强制等待时间(比如 python 中写 sleep)
3.try 方式进行 id,name,clas,x path, css selector 不同方式进行定位,如果第一种失败可以自动尝试第二种
3.如何提高 Selenium 脚本的执行速度?
代码优化,多任务,分布式部署都是可以提升脚本执行速度的。
34、用例在运行过程中经常会出现不稳定的情况,也就是说这次可以通过,下次就没办法通过了,如何去提升用例的稳定性?
答:
1.time.sleep( )
2.driver.implicitly_wait(30)
3.多用 try 捕捉,处理异常
35、你的自动化用例的执行策略是什么?
答:自动化测试与软件开发本质上是一样的,利用自动化测试工具,经过测试需求分析,设计出自动化测试用例,从而搭建自动化测试的框架,设计与编写自动化脚本,验证测试脚本的正确性,最终完成自动化测试测试脚本(即主要功能为测试的应用软件)并输出测试结果
36、自动化测试的时候是不是需要连接数据库做数据校验?
答:从数据库层面来进行数据校验可以更方便验证系统的数据处理方面是否正确,数据处理逻辑正常后,UI 层面上的校验也是需要做的。
37:id,name,class,xpath, css selector 这些属性,你最偏爱哪一种,为什么?
答:css 、xpath 几乎所有的元素都可以定位到,但是它们的短处在于页面上更改了元素后位置很容易改变,所以首先使用的还是 id 或者 name 等。
38、如何去定位页面上动态加载的元素?
答:触发动态加载元素的事件,直至动态元素出现,进行定位
39、如何去定位属性动态变化的元素?
答:xpath 或者 css 通过同级、父级、子级进行定位
40、点击链接以后,Selenium 是否会自动等待该页面加载完毕?
答:会的
41、什么是 page object 设计模式?
答:简单来说,就是把页面作为对象,在使用中传递页面对象,来使用页面对象中相应的成员或者方法,能更好的体现面向对象语言(比如 java 或者 python)的面向对象和封装特性。
42、如何在定位元素后高亮元素(以调试为目的)?
答:用 JavaScript 等脚本来重置元素属性,给定位的元素加背景、边框
43、什么是断言?
答:断言的英文是 assertion,断言检查的英文是 assertion checking。
断言是指定一个程序必须已经存在的状态的一个逻辑表达式,或者一组程序变量在程序执行期间的某个点上必须满足的条件。
44、你觉得自动化测试最大的缺陷是什么?
答:
1.不稳定
2.可靠性
3.不易维护
4.成本与收益
45、Webdriver 可以用来做接口测试吗?
答:接口测试有现成的模块来处理,WebDriver 是用于做 WebUI 自动化测试的。如果要实现接口测试,可以使用 Requests 模块来实现
APPUI 自动化测试
46、Android APP 内存不足时, 系统如何结束进程获得内存?
答:系统优先结束被挂起(暂停)的进程,释放内存
47、APP 测试常见的严重问题有哪些? 分别引起的原因有哪些?
答:常见的有 crash、ANR(应用无响应、卡死),一般由设备碎片化、网络波动大、内存泄漏、代码编写错误
48、请简单介绍你曾使用过的一款 APP 自动化测试工具 ?
答:开放性问题,带点主观意见
1.对比其他熟悉的自动化工具的优缺点
2.自动化的简要方案(简要的同时关键内容请具体)。(提示: appnium 等)
49、Android 测试与 web 测试有什么区别?
答:相同点:
1.设计测试用例均依据等价类、边界值等方法,测试原理相同;
2.大多数都采用黑盒测试方法来验证业务功能;
3.需要检查界面布局、风格和按钮是否美观、统一等(UI 测试);
4.测试页面载入和翻页的速度、登录时长是否溢出等问题(性能测试)
5.测试应用系统的稳定性; 不同点:
1.手机作为通信工具,通信等一些行为会对 APP 产生(中断测试)
2.手机用户对 app 产品的安装卸载操作:从上一版本/上两个版本直接升级到最新版本(安装卸载测试);
3.web 自动化测试使用的工具较常用的是 selenium,而 android 手机自动化测试比较常用的自动化工具是 monkey、monkeyrunner、Appium(测试工具不一样)
50、app 测试有哪几种环境?
答:
1.本地环境: app 安装的手机环境和电脑搭建的自动化测试环境(比如安卓 SDK 等等) 。
2.服务器环境:war 包部署的服务器,服务器可以通过浏览器访问,也可以通过 app去访问。(访问的是 web 程序的接口)
51、简单介绍一下 Android SDK 的安装步骤:
答:
1.下载 jdk 和安卓 sdk
2.安装 jdk, 配置环境变量(java_home、 classpath、 path)
52、请简要介绍一下移动应用及其服务端的测试点?
答:
1.移动应用主要有权限、安装运行卸载、UI、功能、性能、中断、兼容性、安全性、回归、升级更新、用户体验。(app 的 11 大测试点)
2.服务端有接口测试、性能测试、安全测试。
53、如何判断 app 的 bug 是客户端问题还是后台问题
答:这个要根据业务来,一般数据的问题前端的问题多些,一般做法是有问题提给前端开发, 他们知道是他们自己的问题还是后台返回的数据问题。
54、安卓中如何取出日志信息?
答:
1.把安卓系统日志信息实时导入到本地: adb logcat -v time > d:\mylog.log
2.运行使用某个 app,实时获取该 app 的日志信息(cmd 里面的返回信息) : adb shell monkey -p com.android.calendar -v 1000 > d:\mylog2.log
55、常见的 adb 命令:
答:
1.查看当前连接的设备: adb devices
2.安装软件: adb install 路径\xx.apk
3.卸载软件: adb uninstall <包名>
4.从电脑上发送文件到设备: adb push <本地路径> <远程路径> adb push C:\test1.txt /sdcard/
5.从设备上下载文件到电脑: adb pull <远程路径> <本地路径> adb pull /sdcard/test1.txt D:
6.实时获取日志: adb logcat -v time > D:\mylog.log
7.登录终端设备 shell: adb shell
8.查找包名/活动名: adb logcat | findstr START
(脚本中, cmp= 后面的值就是 包名/activity 名称)
9.启动 APP 启动
adb shell am start -n packageName/activity
10.关闭 app
语法: adb shell am force-stop 包名
11.监控 APP 启动时间
adb shell am start -W packageName/activity
12.Monkey 命令:
adb shell monkey -v -p mypackage 50
56、APP 这么多主流机型如何测试 ?
答:
我们公司就买了, 魅族, 华为, 小米, iphone7、iphone8 、iphone8plus 、iphone
x 测试兼容性,有些没有的机型,先借用同事的手机进行测试,同时申请公司购买,或者采用云真机。
57、App 崩溃(闪退),可能是什么原因导致的?
答:缓存垃圾过多:由于安卓系统的特性,如果长时间不清理垃圾文件.会导致越来越卡.也会出现闪退情况,运行的程序过多,导致内存不足
应用版本兼容问题:如果应用版本太低,会导致不兼容,造成闪退。此外,有些新版本 在调试中,也会造成应用闪退。解决方法:如果是版本太旧,更新为新版本即可;如果是新版本闪退, 可能是应用在改版调试,可卸载后安装旧版。检查 APP 中访问网络的地方,组件中的 ImageView 是否可以正常的下载并显示到 app 页面上。检查 APP 的 sdk 和手机的系统是否兼容。在一些特定情况下的闪退,比如播放视频,在 Android5.0 升级到 Android6.0 的时候, 有些系统 API 老版本有,新版本没有,到时回去对象的时候失败,报空,系统就会出现闪退
58、Appium 都有哪些启动方式
答:
1.客户端启动
2.命令行启动
59、请简单介绍一下使用过的安卓 UI 自动化测试工具?
答:appium:是一个移动端的自动化框架,可用于测试原生应用,移动网页应用和混合型应用,且是跨平台的。robotium:是一款国外的 Android 自动化测试框架,主要针对 Android 平台的应用进行黑盒自动化测试,它提供了模拟各种手势操作(点击、长按、滑动等)、查找和断言机制的 API,能够对各种控件进行操作。
60、请说明 Android 手机和 IOS 手机,系统有什么区别?
答:
1.两者运行机制不同:IOS 采用的是沙盒运行机制,安卓采用的是虚拟机运行机制。
2.两者后台制度不同:IOS 中任何第三方程序都不能在后台运行;安卓中任何程序都能在后台运行,直到没有内存才会关闭。
3.IOS 中用于 UI 指令权限最高,安卓中数据处理指令权限最高。接口自动化测试
61、按你的理解,软件接口是什么?
答:
就是指程序中具体负责在不同模块之间传输或接受数据的并做处理的类或者函数。
62、HTTPS 在哪一层?
答:HTTPS 在应用层。
63、get 和 post 区别是什么?
答:POST 和 GET 都是向服务器提交数据,并且都会从服务器获取数据。区别:
1)传送方式:get 通过地址栏传输,post 通过报文传输
2)传送长度:get 参数有长度限制(受限于 url 长度),而 post 无限制
3)GET 产生一个 TCP 数据包(对于 GET 方式的请求,浏览器会把 http header 和 data 一并发送出去,服务器响应 200 返回数据),POST 产生两个 TCP 数据包(对于 POST,浏览器先发送 header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok 返回数据)
4)get 请求参数会被完整保留在浏览历史记录里,而 post 中的参数不会被保留
5)在做数据查询时,建议用 GET 方式;而在做数据添加、修改或删除时,建议用 post 方式
64、常见的 POST 提交数据方式
答:主要有四种方式:application/x-www-form-urlencoded、multipart/form-data、application/json、text/xml 等。
65、什么是 Http 协议无状态协议?怎么解决 HTTP 协议无状态协议
答:无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服 务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息。HTTP 是一个无状态协议,这意味着每个请求都是独立的,Keep-Alive 没能 改变这个结果。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导 致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。HTTP 协议这种特性有优点也有缺点,优点在于解放了服务器,每一次请求“点到为止”不会造成 不必要连接占用,缺点在于每次请求会传输大量重复的内容信息。客户端与服务器进行动态 交互的 Web 应用程序出现之后,HTTP 无状态的特性严重阻碍了这些应用程序的实现,毕竟交互是需要承前启后的,简单的购物车程序也要知道用户到底在之前选择了什么商品。于是, 两种用于保持 HTTP 连接状态的技术就应运而生了,一个是 Cookie,而另一个则是 Session。
66、cookie 和 session 的区别
答:cookie 数据存放在客户的浏览器上,session 数据放在服务器上
cookie 不是很安全,别人可以分析存放在本地的 cookie 并进行 cookie 欺骗,考虑到安全应当使用 session
session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面应当使用 cookie
单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie 可以将登陆信息等重要信息存放为 session;其他信息需要保存,可以放在 cookie
67、什么是 DNS?
答:DNS 是域名系统 (Domain Name System),DNS 是用来做域名解析的,它会在你上网输入网址后,把它转换成 IP,然后去访问对方服务器;没有它,你想上百度就要记住百度的 IP, 但有了 DNS 的处理,你只需要记住对应网站的域名,即网址就可以了。
68、请问你们公司是如何做接口测试的?
答:
接口测试实际跟一般测试不同就是测试用例的设计部分。
①获取接口规范。
②设计接口测试功能用例(主要从用户角度出发看接口能否实现业务需求,用例设计就是黑 盒用例那一套)。
③各种入参验证(正常情况,异常情况包括输入参数个数不对,类型不对,可选/必选,还 有考虑参数有互斥或关联的情况)。
④接口返回值各种验证(符合接口文档需求)
⑤了解接口实现逻辑,实现逻辑覆盖(语句/条件/分支/判定/…)
⑥接口能并发执行吗、安全吗,性能满足要求吗?
⑦采用工具或者自写代码来验证。
⑧发现问题跟功能测试一样,该报 bug 报 bug,该跟踪状态的跟踪状态。
69、怎么设计接口测试用例?
答:
通常,设计接口测试用例需要考虑以下几个方面:
①是否满足前提条件
有些接口需要满足前提,才可成功获取数据。常见的,需要登录 Token 逆向用例:针对是否满足前置条件(假设为 n 个条件),设计 0~n 条用例
②是否携带默认值参数
正向用例:带默认值的参数都不填写、不传参,必填参数都填写正确且存在的“常规”值, 其他不填写,设计 1 条用例
③业务规则、功能需求
这里根据时间情况,结合接口参数说明,可能需要设计 N 条正向用例和逆向用例
④参数是否必填
逆向用例:针对每个必填参数,都设计 1 条参数值为空的逆向用例
⑤参数之间是否存在关联
有些参数彼此之间存在相互制约的关系
⑥参数数据类型限制
逆向用例:针对每个参数都设计 1 条参数值类型不符的逆向用例
⑦参数数据类型自身的数据范围值限制
正向用例:针对所有参数,设计 1 条每个参数的参数值在数据范围内为最大值的正向用例
70、你做接口测试,测什么?
答:
可用性测试
根据约定的协议、方法、格式内容,传输数据到接口经处理后返回期望的结果:
接口功能是否正确实现;
返回值测试 – 返回值除了内容要正确,类型也要正确,保证调用方能够正确地解析;
参数值边界值、等价类测试; 错误和异常处理测试
输入异常值(空值、特殊字符、超过约定长度等),接口能正确处理,且按预期响应;
输入错误的参数,接口能正确处理,并按预期响应;
多输入、少输入参数,接口能正确处理,且按预期响应;
错误传输数据格式(如 json 格式写成 form 格式)测试; 安全性测试,主要指传输数据的安全性:
敏感数据(如密码、秘钥)等是否加密传输;
返回数据是否含有敏感数据,如用户密码、完整的用户银行账号信息等;
接口是否对传入的数据做安全校验,如身份 ID 加 token 类似校验;
接口是否防止恶意请求(如大量伪造请求接口致使服务器崩溃);性能测试,如接口的响应时间、并发处理能力、压测处理情况:
并发请求相同的接口(特别为 POST 请求),接口的处理情况(如插入了相同的记录导致数据出错,引发系统故障);
接口响应时长在用户可忍受的范围内;
对于请求量大的接口做压测,确定最大的瓶颈点是否满足当前业务需要;
71、平常用什么工具测接口的?
答:常用 http 协议接口测试工具,如:postman、fiddler、jmeter;webService 接口用 SoapUI、jmeter 等。
72、没有接口文档,如果做接口测试?
答:用抓包工具把接口抓取处理,然后针对性进行测试;接口中字段信息不清楚的,找时间 集中寻求开发解答。(常用抓包工具 Fiddler、Charles 等)
73、在手工接口测试或者自动化接口测试的过程中,上下游接口有数据依赖如何处理?
答:用一个全局变量来处理依赖的数据,比如登录后返回 token,其它接口都需要这个 token,那就用全局变量来传 token 参数。
74、依赖于第三方数据的接口如何进行测试?
答:mock
接着面试官会问你,如果 mock 的,然后你就顺着坑继续挖,搭建 mock 服务,参考这篇http://www.51ste.com/share/det-485.html
75、接口测试中,依赖登录状态的接口如何测试?
答:依赖登录状态的接口的本质上是在每次发送请求时需要带上 session 或者 cookie 才能发送成功,在构建 POST 请求时添加必要的 session 或者 cookie
76、如何模拟弱网做测试?
答:Fiddler 和 charles 都可以模拟弱网测试,平常说的模拟丢包,也是模拟弱网测试。具体可以看《几种弱网模拟方法,总有一种适合你》
77、你平常做接口测试的过程中发现过哪些 bug?
面试官出这个题,主要是想知道你是不是真的做过接口测试,毕竟现在很多小伙伴简历经过 包装(不包装连面试机会都没有,没办法,为了生存,能理解)
答:
常规错误,接口没实现,没按约定返回结果,边界值处理出错等。
输入异常值(空值、特殊字符、超过约定长度等),接口抛错,没做封装处理; 输入错误的参数、多输入、少输入参数,接口可能出现的错误;
安全性问题,如明文传输、返回结果含有敏感信息,没对用户身份信息做校验,没做恶意请 求拦截等;
性能问题,如接口并发插入多条相同操作,响应时间过长,接口压测出现瓶颈等;
78、当一个接口出现异常时候,你是如何分析异常的?
答:先抓包,用 fiddler(charles)工具抓包,或者浏览器上 F12 调试工具;APP 上的话,那就用 Fiddler 做代理,通过手机设置代理去看请求和返回报文;
查看后端日志,如 Linux 系统通过 xhell 连上服务器,查看接口日志,查看是否有报错信息
(命令:tail -f 日志文件);
79、如何分析一个 bug 是前端还是后端的?
答:
平常提 bug 的时候,前端开发和后端开发总是扯皮,不承认是对方的 bug。
这种情况很容易判断,先抓包看请求报文,对着接口文档,看请求报文有没问题,有问题就 是前端发的数据不对;
请求报文没问题,那就看返回报文,返回的数据不对,那就是后端开发的问题咯。
80、你们做接口测试自动化吗?
答:现在针对大量应用,普遍推崇做接口测试自动化,维护成本低、收益高。常用的工具有 许多,如 Jmeter、Robot Framework、pytest 等。
81、列出几个 JMeter 监听器?
答:一些 JMeter 监听器是: 集合报告
汇总报告 查看结果树
用表格查看结果图形结果
BeanShell Listener 摘要报告等
82、在 python 中进行数据驱动测试
答:在 unittest 中,没有自带的数据驱动,我们得借助 ddt 来实现,首先,我们得在 python 运行环境中安装 ddt,用下列命令安装
pip install ddt
另 外 一 个 测 试 框 架 pytest , 它 自 带 数 据 驱 动 实 现 , 是 通 过
@pytest.mark.parametrize(argnames,argvalues) 来实现参数化的。也可以根据自己需求用 python 实现数据的读取和驱动。
83、接口自动化中的关联怎么处理?
答:把上一个请求返回的结果传入到下一个请求的参数中,将请求的结果反射到一个类属性(使 用 setattr()函数),下一个请求去调用这个类属性
84、自动化测试怎么校验结果?
答:断言 ,预期结果与实际结果对比
数据库校验,根据测试场景来查询数据库里的数据和请求之前的数据进行比对
85、自动化使用的测试框架是什么?简述自动化框架的设计与维护
答:测试框架:python+unittest+requests+ddt+openpyxl+pymysql+logging
python:入门简单,语法简洁
unittest :定义一个测试用例类,具体的方法来维护测试用例的生命周期,测试场景行为, 测试用例 前置场景,行为,期望结果,实际结果,断言方法,Setup teardown 方法
requests:接口调用 ,支持 http 请求的库,API 简洁,提供不同的 http 请求方法,支持session,cookies,
ddt :数据驱动,ddt 类装饰器,data 测试方法装饰器 unpack 解包可迭代的数据类型普通用户,数据库,配置文件—(基础数据)
openpyxl: 数据管理 excel 管理数据,使用 openpyxl 模块来进行 excel 数据的读和写
(excle,csv, json, yaml, txt 都可以管理测试数据)
pymysql:数据库交互,数据校验
eval,json:数据格式的转换 Eval 将 python 支持的格式转换成对应的格式
logging:日志处理, 统一日志输出格式,渠道,级别,执行结果的记录,便于定位问题jenkins:持续集成
2/框架设计思路:数据驱动+结构分层(可读性,可维护性,可扩展性)
数据驱动:将维护数据与代码分离,接口调用行为一致,针对不同的参数组合驱动不同的测 试场景,减少代码冗余
结构分层:数据层+用例层+逻辑层数据层:测试数据的支撑 data.xls
用例层:用例的执行 test_register.py test_recharge.py
逻辑层:公用的方法的封装与提取 doexcle.py do_mysql.py http_requests.py logger.py 等模块
框架设计步骤:
准备测试数据: EXCEL 表准备测试用例—excel 数据的读取—参数值的替换
发起请求:请求方法(get/post 方法进行封装—URL 的拼接(不同—参数转化为字典拿到请求的返回值:解析返回值 code,status,msg 信息
断 言 好处:
1、自动化测试用例和手工测试用例的完美结合,减少重复工作
2、配置灵活,可以自主切换测试环境,执行测试用例
3、常用功能进行封装,逻辑清晰,易于维护
4、统一执行入口,管理测试用例集:
run.py 模块通过模糊查找来选择需要执行的测试用例
5、持续集成,定时构建,快速反馈
86、具体的在这个项目中自动化怎么应用到实际的,您对自动化结果的分析
答:完成所有的自动化测试框架的设计和实现后,进行接口测试,然后集成到jenkins,配置定时执行,生成 html 报表,查看测试通过率,查看接口的功能每次发版时,进行回归测试,新功能开发未提测前
程序题
87、比较两个版本号的大小
#!/usr/bin/env python # _*_ coding: utf-8 _*_ # @project : dadi-api-platform # @File : test.py # @Date : 2021/2/22 11:23 上午 # @Author : 李文良 def compared_version(ver1, ver2): """ 请传入不带英文的版本号,特殊情况:"9.0.06">"10.0.06" :param ver1: 版本号1 :param ver2: 版本号2 """ list1 = str(ver1).split(".") list2 = str(ver2).split(".") # 循环次数为短的列表的len for i in range(len(list1)) if len(list1) < len(list2) else range(len(list2)): if int(list1[i]) == int(list2[i]): pass elif int(list1[i]) < int(list2[i]): return f"大的版本号为:{ver2}" else: return f"大的版本号为:{ver1}" # 循环结束,哪个列表长哪个版本号高 if len(list1) == len(list2): return f"{ver1}和{ver2}版本号相等" elif len(list1) < len(list2): return f"大的版本号为:{ver2}" else: return f"大的版本号为:{ver1}" result = compared_version("10.0.01", "10.0.0102") print(result)
待更新
最后,为方便大家自学软件测试,特意给大家准备了一份13G的超实用干货学习资源,涉及的内容非常全面。
包括软件学习路线图,50多天的上课视频、16个突击实战项目,80余个软件测试用软件,37份测试文档,70个软件测试相关问题,40篇测试经验级文章,上千份测试真题分享,还有2021软件测试面试宝典,还有软件测试求职的各类精选简历,希望对大家有所帮助…..
关注我的微信公众号:【程序员小濠】就可以免费获取了~
如果你不想再体验一次自学时找不到资料,没人解答问题,坚持几天便放弃的感受的话,可以加入我的软件测试交流群:175317069 大家一起讨论交流,里面也有各种软件测试资料和技术交流
如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。
原文链接:https://blog.csdn.net/qq_52879678/article/details/118734989