前言:此文专门记载本人平时面试以及收藏的面试题目,如果有错误之处请及时指正,谢谢!
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,都有其独立的私有内存池,对象间不共享他们的内存池。
也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。
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=&wfr=spider&for=pc)
15、项目中能不能只使用SESSION,不使用COOKIE
答:可以,通过重定向的形式,把session id放在url后面,但是这样做直接将把session id暴露出来了,于安全考虑不建议使用这样的方式
(https://blog.csdn.net/weixin_/article/details/)
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/、https://blog.csdn.net/_/article/details/)
17、https是非对称加密还是对称加密
答:Https的加密机制是一种共享密钥加密和公开密钥加密并用的混合加密机制。
握手前使用非对称加密,连接后使用对称加密,因为仅使用非对称加密的话,会影响数据的传输效率
(https://blog.csdn.net/jiangshangchunjiezi/article/details/)
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/_/article/details/)
实际应用中,生产者,消费者可能是两套不同的系统,不会存在于一个进程里,甚至不在同一台设备上;而queue.Queue只能用于线程间通讯,那么该怎么办呢?
采用消息队列,比如rabbitMQ;
最后,上传一篇将进程线程做了很好的类比的一篇文章
- 计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。
- 假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。
- 进程就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。
- 一个车间里,可以有很多工人。他们协同完成一个任务。
- 线程就好比车间里的工人。一个进程可以包括多个线程。
- 车间的空间是工人们共享的,比如许多房间是每个工人都可以进出的。这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。
- 可是,每间房间的大小不同,有些房间最多只能容纳一个人,比如厕所。里面有人的时候,其他人就不能进去了。这代表一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。
- 一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。这就叫“互斥锁”(Mutual
exclusion,缩写 Mutex),防止多个线程同时读写某一块内存区域。- 还有些房间,可以同时容纳n个人,比如厨房。也就是说,如果人数大于n,多出来的人只能在外面等着。这好比某些内存区域,只能供给固定数目的线程使用。这时的解决方法,就是在门口挂n把钥匙。进去的人就取一把钥匙,出来时再把钥匙挂回原处。后到的人发现钥匙架空了,就知道必须在门口排队等着了。这种做法叫做“信号量”(Semaphore),用来保证多个线程不会互相冲突。
- 不难看出,mutex是semaphore的一种特殊情况(n=1时)。也就是说,完全可以用后者替代前者。但是,因为mutex较为简单,且效率高,所以在必须保证资源独占的情况下,还是采用这种设计。
- 操作系统的设计,因此可以归结为三点:
(1)以多进程形式,允许多个任务同时运行;
(2)以多线程形式,允许单个任务分成不同的部分运行;
21、HTTP状态码有哪些?
答:HTTP状态码总的分为五类:1开头:信息状态码、2开头:成功状态码、3开头:重定向状态码、4开头:客户端错误状态码、5开头:服务端错误状态码

讯享网
Web 自动化测试
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 捕捉,处理异常
43、什么是断言?
答:断言的英文是 assertion,断言检查的英文是 assertion checking。
断言是指定一个程序必须已经存在的状态的一个逻辑表达式,或者一组程序变量在程序执行期间的某个点上必须满足的条件。
44、你觉得自动化测试最大的缺陷是什么?
答:
1.不稳定
2.可靠性
3.不易维护
4.成本与收益
APPUI 自动化测试
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.服务端有接口测试、性能测试、安全测试。
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.命令行启动
60、请说明 Android 手机和 IOS 手机,系统有什么区别?
答:
1.两者运行机制不同:IOS 采用的是沙盒运行机制,安卓采用的是虚拟机运行机制。
2.两者后台制度不同:IOS 中任何第三方程序都不能在后台运行;安卓中任何程序都能在后台运行,直到没有内存才会关闭。
3.IOS 中用于 UI 指令权限最高,安卓中数据处理指令权限最高。接口自动化测试
61、按你的理解,软件接口是什么?
答:
就是指程序中具体负责在不同模块之间传输或接受数据的并做处理的类或者函数。
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 方式
66、cookie 和 session 的区别
答:cookie 数据存放在客户的浏览器上,session 数据放在服务器上
cookie 不是很安全,别人可以分析存放在本地的 cookie 并进行 cookie 欺骗,考虑到安全应当使用 session
session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面应当使用 cookie
单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie 可以将登陆信息等重要信息存放为 session;其他信息需要保存,可以放在 cookie
68、请问你们公司是如何做接口测试的?
答:
接口测试实际跟一般测试不同就是测试用例的设计部分。
①获取接口规范。
②设计接口测试功能用例(主要从用户角度出发看接口能否实现业务需求,用例设计就是黑 盒用例那一套)。
③各种入参验证(正常情况,异常情况包括输入参数个数不对,类型不对,可选/必选,还 有考虑参数有互斥或关联的情况)。
④接口返回值各种验证(符合接口文档需求)
⑤了解接口实现逻辑,实现逻辑覆盖(语句/条件/分支/判定/…)
⑥接口能并发执行吗、安全吗,性能满足要求吗?
⑦采用工具或者自写代码来验证。
⑧发现问题跟功能测试一样,该报 bug 报 bug,该跟踪状态的跟踪状态。
69、怎么设计接口测试用例?
答:
通常,设计接口测试用例需要考虑以下几个方面:
①是否满足前提条件
有些接口需要满足前提,才可成功获取数据。常见的,需要登录 Token 逆向用例:针对是否满足前置条件(假设为 n 个条件),设计 0~n 条用例
②是否携带默认值参数
正向用例:带默认值的参数都不填写、不传参,必填参数都填写正确且存在的“常规”值, 其他不填写,设计 1 条用例
③业务规则、功能需求
这里根据时间情况,结合接口参数说明,可能需要设计 N 条正向用例和逆向用例
④参数是否必填
逆向用例:针对每个必填参数,都设计 1 条参数值为空的逆向用例
⑤参数之间是否存在关联
有些参数彼此之间存在相互制约的关系
⑥参数数据类型限制
逆向用例:针对每个参数都设计 1 条参数值类型不符的逆向用例
⑦参数数据类型自身的数据范围值限制
正向用例:针对所有参数,设计 1 条每个参数的参数值在数据范围内为最大值的正向用例
70、你做接口测试,测什么?
答:
可用性测试
根据约定的协议、方法、格式内容,传输数据到接口经处理后返回期望的结果:
接口功能是否正确实现;
返回值测试 - 返回值除了内容要正确,类型也要正确,保证调用方能够正确地解析;
参数值边界值、等价类测试; 错误和异常处理测试
输入异常值(空值、特殊字符、超过约定长度等),接口能正确处理,且按预期响应;
输入错误的参数,接口能正确处理,并按预期响应;
多输入、少输入参数,接口能正确处理,且按预期响应;
错误传输数据格式(如 json 格式写成 form 格式)测试; 安全性测试,主要指传输数据的安全性:
敏感数据(如密码、秘钥)等是否加密传输;
返回数据是否含有敏感数据,如用户密码、完整的用户银行账号信息等;
接口是否对传入的数据做安全校验,如身份 ID 加 token 类似校验;
接口是否防止恶意请求(如大量伪造请求接口致使服务器崩溃);性能测试,如接口的响应时间、并发处理能力、压测处理情况:
并发请求相同的接口(特别为 POST 请求),接口的处理情况(如插入了相同的记录导致数据出错,引发系统故障);

74、依赖于第三方数据的接口如何进行测试?
答:mock
接着面试官会问你,如果 mock 的,然后你就顺着坑继续挖,搭建 mock 服务,参考这篇http://www.51ste.com/share/det-485.html
77、你平常做接口测试的过程中发现过哪些 bug?
面试官出这个题,主要是想知道你是不是真的做过接口测试,毕竟现在很多小伙伴简历经过 包装(不包装连面试机会都没有,没办法,为了生存,能理解)
答:
常规错误,接口没实现,没按约定返回结果,边界值处理出错等。
输入异常值(空值、特殊字符、超过约定长度等),接口抛错,没做封装处理; 输入错误的参数、多输入、少输入参数,接口可能出现的错误;
安全性问题,如明文传输、返回结果含有敏感信息,没对用户身份信息做校验,没做恶意请 求拦截等;
性能问题,如接口并发插入多条相同操作,响应时间过长,接口压测出现瓶颈等;
78、当一个接口出现异常时候,你是如何分析异常的?
答:先抓包,用 fiddler(charles)工具抓包,或者浏览器上 F12 调试工具;APP 上的话,那就用 Fiddler 做代理,通过手机设置代理去看请求和返回报文;
查看后端日志,如 Linux 系统通过 xhell 连上服务器,查看接口日志,查看是否有报错信息
(命令:tail -f 日志文件);
79、如何分析一个 bug 是前端还是后端的?
答:
平常提 bug 的时候,前端开发和后端开发总是扯皮,不承认是对方的 bug。
这种情况很容易判断,先抓包看请求报文,对着接口文档,看请求报文有没问题,有问题就 是前端发的数据不对;
请求报文没问题,那就看返回报文,返回的数据不对,那就是后端开发的问题咯。
81、列出几个 JMeter 监听器?
答:一些 JMeter 监听器是: 集合报告
汇总报告 查看结果树
用表格查看结果图形结果
BeanShell Listener 摘要报告等
82、在 python 中进行数据驱动测试
答:在 unittest 中,没有自带的数据驱动,我们得借助 ddt 来实现,首先,我们得在 python 运行环境中安装 ddt,用下列命令安装
pip install ddt
另 外 一 个 测 试 框 架 pytest , 它 自 带 数 据 驱 动 实 现 , 是 通 过
@pytest.mark.parametrize(argnames,argvalues) 来实现参数化的。也可以根据自己需求用 python 实现数据的读取和驱动。
84、自动化测试怎么校验结果?
答:断言 ,预期结果与实际结果对比
数据库校验,根据测试场景来查询数据库里的数据和请求之前的数据进行比对
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 支持的格式转换成对应的格式
数据驱动:将维护数据与代码分离,接口调用行为一致,针对不同的参数组合驱动不同的测 试场景,减少代码冗余
逻辑层:公用的方法的封装与提取 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、持续集成,定时构建,快速反馈
程序题
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)
讯享网
APP测试面试题
88、web测试和app测试的相同点和区别?
相同点:都离不开测试的基础知识和测试原理。具体包括以下几个方面。
不同点:相对于web测试来说,app测试要考虑手机本身固有的属性,所以app测试还需要注意以下几点。
中断测试(来电去电,短信,蓝牙,NFC支付,闹钟,数据线插拔,锁屏,断电,关机重启等)
安装卸载测试(全新安装,新版本覆盖旧版本,卸载旧版本安装新版本,卸载新版本安装旧版本)
外在因素测试(网络切换,硬件按键,不同分辨率,兼容性,系统,系统版本)web测试更多的是考虑自身功能和浏览器兼容。
89、如何测试一个App的登录场景?
APP登录场景大体从以下几个方面进行: 页面基本元素的操作。 大量字符,特殊字符,边界值,必填项校验。
注册手机号的特殊性验证,注册邮箱的格式验证。 密码大小写是否敏感,密码是否加密展示,密码是否有可见按钮功能,密码框能否使用复制粘贴。
验证码校验:必填项,过期,错误,无网络时获取验证码,多次获取,超过获取次数,输入验证码后,修改手机号。
登录时与系统的交互:锁屏,蓝牙,home,后退,横竖屏,修改字体字号。
逆向思维:已注册账号注册,未注册账号忘记密码,未注册账号登录,注册过程中退出再次注册。 输入法交互,切换输入法,切换输入模式,手写/九宫格。
登录账号的多样性:多个账号轮流登录,同一个账号多角色登录。 第三方登录验证:账号授权,信息正确,取消授权。
登录页面跳转,返回,登录成功及其他页面跳转。 手机兼容性测试:分辨率兼容,系统兼容,系统版本兼容,App版本兼容。
网络切换,网络断开,弱网。
90、Push消息如何测试?
Push消息的测试可以从以下几个方面进行: 检查Push消息是否按照指定的业务规则发送。
检查不接收推送消息时,用户不会再接收到Push消息。
如果用户设置了免打扰的时间段,检查在免打扰时间段内,用户接收不到Push。在非免打扰时间段内,用户能正常收到Push。
当Push消息是针对登录用户的时候,需要检查收到的Push与用户身份是否相符,没有错误的将其他人的消息推送过来。一般情况下,只对手机上最后一个登录用户进行消息推送。
测试Push时,在开关机、待机状态下执行推送,消息及其推送跳转的正确性。 push消息时,会有红点展示,推送消息阅读前后数字的变化是否正确;
应用在开发、未打开状态、应用启动且在后台运行的情况下是push显示和跳转是否正确。 多条推送的合集的显示和跳转是否正确。
91、App的闪退通常是什么原因造成的?
APP闪退的原因可能是: 缓存垃圾太多,Android系统的特性,如果长时间不清理垃圾文件,会导致越来越卡,甚至闪退。
运行程序太多,导致内存不足。 应用版本兼容问题,分辨率兼容问题。 APP中访问网络的地方,组件能否正常下载并显示。
APP的SDK与手机系统不兼容。 系统升级后,新版本不兼容老版本的API,返回对象失败,报空指针。 软件权限未开放。
92、测试过程中遇到app出现crash或者ANR,你会怎么处理?
APP出现Crash或ANR,可以从以下几个方面处理: 可以先把日志过滤出来:adb logcat | findstr xxxxx(过滤日志信息) ; 然后再搜索其中的关键字,比如:exception、crash,看看是哪些方法或者异常导致了问题;初步定位问题原因后,可以交给开发人员去具体查找深层原因并修复。
93、你平常会看日志吗, 一般会出现哪些异常(Exception)?
常见的几种如下: NullPointerException - 空指针引用异常 ClassCastException - 类型强制转换异常
IllegalArgumentException - 传递非法参数异常 ArithmeticException - 算术运算异常
ArrayStoreException - 向数组中存放与声明类型不兼容对象异常 IndexOutOfBoundsException -
下标越界异常 NegativeArraySizeException - 创建一个大小为负数的数组错误异常
NumberFormatException - 数字格式异常 SecurityException - 安全异常
UnsupportedOperationException - 不支持的操作异常
94、APP 测试的内容主要包括哪些,如何开展?
APP测试的进行,可以从以下几个方面展开: 功能测试: 业务逻辑正确性测试:依据产品文档->测试用例编写。
兼容性测试:
1.系统版本:Android:官方版本,定制版本;IOS:官方提供版本。
2.分辨率:720 * 1280 1080* 1920。
3.网络情况:2g 3g 4g 5g Wi-Fi。异常测试:
1.热启动应用:应用在后台长时间待机;应用在后台待机过程中,手机重启。
2.网络切换和中断恢复:网络切换;中断恢复。
3.电话信息中断恢复。升级,安装,卸载测试:
1.升级测试:临近版本升级(1.0->1.1);跨版本(1.0->…->2.2)。
2.安装测试:首次安装;覆盖安装(同版本,不同版本覆盖);卸载后安装。
3.卸载测试:首次卸载;卸载安装后再卸载。健壮性测试:
1.手机资源消耗:cpu,内存。
2.流量消耗:图片,数据,视频。
3.电量测试。
4.崩溃恢复。
95、APP性能测试关注点及常见APP性能测试工具
1.性能关注点
启动时间分为冷启动时间和热启动时间,所谓的“冷启动”,就是一个完全没有运行的应用的启动时间,与热启动(应用已经在后台运行,某个事件将其带至前台)相比,由于此时系统尚未建立缓存,因此冷启动往往要较平时(热启动)耗费更长的时间。
2.app性能测试工具
GT和iTest,Emmagee APT ,DDMS ,手机自带开发者选项中的工具,也可以通过adb命令来查看等
96、如何对app进行弱网测试
一款APP针对不同网络情况下都需要保证不会崩溃,同时尽可能做到在弱网情况下也能达到功能正常使用,或者使用体验达到**。弱网测试可以测试APP的加载时间、可用性、稳定性和健壮性。这时我们就可以借助工具来模拟不同的网络状况,模拟2G、3G或弱网情况进行测试。工具可以选择Fiddler也可以选择Charles也可以选择其他工具。
97、常见的 adb 命令
注:adb 使用的端口号是5037,以下总结工作中常用到的adb命令。
1.查看帮助手册列出所有的选项说明及子命令:
adb help2.获取设备列表及设备状态:
adb devices3.安装应用:adb install 路径\xx.apk, 安装应用;adb install -r 重新安装。
adb install
adb install -r4.获取设备的状态,设备的状态有 device , offline , unknown3种,其中device:设备正常连接,offline:连接出现异常,设备无响应,unknown:没有连接设备。
adb get-state5.卸载应用:adb uninstall <包名>, 后面的参数是应用的包名,区别于 apk 文件名。
adb uninstall6.将 Android 设备上的文件或者文件夹复制到电脑本地:adb pull <远程路径> <本地路径>, 如复制 Sdcard 下的 pull.txt 文件到 D 盘:adb pull sdcard/pull.txt d:\,重命名:adb pull sdcard/pull.txt d:\rename.txt。
adb pull7.推送本地文件至 Android 设备:adb push <本地路径> <远程路径>, 如推送 D 盘下的 ITester.txt 至 Sdcard:adb push d:\ITester.txt sdcard/ (注意sdcard 后面的斜杠不能少)。
adb push8.结束和启动adb服务:adb kill-server /adb start-server , 结束 adb 服务/启动 adb 服务,通常两个命令一起用,设备状态异常时使用 kill-server,运行 start-server 进行重启服务。
adb kill-server adb start-server9.打印及清除系统日志:adb logcat , 打印 Android 的系统日志 ;adb logcat -c,清除日志。
adb logcat
adb logcat -c10.查找包名/活动名
adb logcat | findstr START
11.生成bugreport文件:adb bugreport , 打印dumpsys、dumpstate、logcat的输出,也是用于分析错误,输出比较多,建议重定向到一个文件中,如adb bugreport > d:\bugreport.log。
adb bugreport12.重启 Android 设备:adb reboot , adb reboot recovery,重启到Recovery界面; adb reboot bootloader,重启到bootloader界面。
adb reboot
adb reboot recovery
adb reboot bootloader13.获取 root 权限:adb root , adb remount,可以直接获取 root 权限,并挂载系统文件系统为可读写状态。
adb root adb remount14.返回设备序列号SN值:
adb get-serialno15.获取设备的ID:
adb get-product16.进入设备shell:
adb shell17.列出所有的应用的包名:
adb shell pm list package
18.截屏并保存至 sdcard 目录:
adb shell screencap -p /sdcard/screen.png
19.录制视频并保存至sdcard:adb shell screenrecord sdcard/record.mp4,执行命令后操作手机,ctrl + c 结束录制,录制结果保存至 sdcard:
adb shell screenrecord sdcard/record.mp4
20.获取设备分辨率:
adb shell wm size
21.列出指定应用的 dump 信息,adb shell pm dump 包名。
adb shell pm dump
22.列出对应包名的 .apk 位置,adb shell pm path 包名。
adb shell pm path
23.查看当前终端中的进程信息:
adb shell ps
24.monkey测试:adb shell monkey –p 程序包 –v 测试次数 ,比如“adb shell monkey –p com.htc.Weather –v 20000”意思是对com.htc.Weather
这个程序包单独进行一次20000次的monkey测试。
adb shell monkey –p 程序包 –v 测试次数
25.显示所有程序包:
adb shell ps | grep [process]
26.根据进程pid或包名查看进程占用的内存:
adb shell dumpsys meminfo<pid>
adb shell dumpsys meminfo<package_name>
27.APP 启动:
adb shell am start -n packageName/activity
28.APP 关闭:
adb shell am force-stop 包名
29.监控 APP 启动时间:
adb shell am start -W packageName/activity
98、为什么python的内置模块很多源码里面函数都是直接pass ,pass了什么都没有做?是怎么实现功能的?
python是C语言实现的,它涉及到底层支撑架构的功能其实还是C写的,所以实际调用的时候是python解释器调用C实现的,实现过程直接写pass 是作为占位符保证程序不出错。
99、疑问解答与加群学习交流


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/121077.html