1、Android 测试与 web 测试有什么区别?
答:
相同点:
- 设计测试用例均依据等价类、边界值等方法,测试原理相同;
- 大多数都采用黑盒测试方法来验证业务功能;
- 需要检查界面布局、风格和按钮是否美观、统一等(UI 测试);
- 测试页面载入和翻页的速度、登录时长是否溢出等问题(性能测试);
- 测试应用系统的稳定性。
不同点:
- 手机作为通信工具,通信等一些行为会对 APP 产生(中断测试);
- 手机用户对 app 产品的安装卸载操作:从上一版本/上两个版本直接升级到最新版本(安装卸载测试);
- web 自动化测试使用的工具较常用的是 selenium,而 an droid 手机自动化测试比较常用的自动化工具是 monkey、monkeyrunner、Appium(测试工具不一样)。
2、app 测试有哪几种环境?
答:
- 本地环境:app 安装的手机环境和电脑搭建的自动化测试环境(比如安卓 SDK 等等);
- 服务器环境:war 包部署的服务器,服务器可以通过浏览器访问,也可以通过 app 去访问。(访问的是 web 程序的接口)
3、请简要介绍一下移动应用及其服务端的测试点?
答:
移动应用主要有权限、安装运行卸载、UI、功能、性能、中断、兼容性、安全性、回归、升级更新、用户体验(app 的 11 大测试点);
服务端有接口测试、性能测试、安全测试。
4、如何判断 app 的 bug 是客户端问题还是后台问题?
答:这个要根据业务来,一般数据的问题前端的问题多些,一般做法是有问题提给前端开发, 他们知道是他们自己的问题还是后台返回的数据问题。
5、安卓中如何取出日志信息?
答:
把安卓系统日志信息实时导入到本地:
adb logcat -v time > d:mylog.log;
运行使用某个 app,实时获取该 app 的日志信息(cmd 里面的返回信息):
adb shell monkey -p com.an droid.calendar -v 1000 > d:mylog2.log。
6、常见的 adb 命令:
答:
查看当前连接的设备:
adb devices
安装软件:
adb install 路径xx.apk
卸载软件:
adb uninstall <包名>
从电脑上发送文件到设备:
adb push <本地路径> <远程路径> adb push C: est1.txt /sdcard/
从设备上下载文件到电脑:
adb pull <远程路径> <本地路径> adb pull /sdcard/test1.txt D:
实时获取日志:
adb logcat -v time > D:mylog.log
登录终端设备
shell:adb shell
查找包名/活动名:
adb logcat | findstr START(脚本中, cmp= 后面的值就是 包名/activity 名称)
启动 APP 启动;
adb shell am start -n package Name/activity
关闭 app 语法:
adb shell am force-stop 包名
监控 APP 启动时间:
adb shell am start -W package Name/activity
Monkey 命令:
adb shell monkey -v -p mypackage 50
7、App 崩溃(闪退),可能是什么原因导致的?
答:缓存垃圾过多:由于安卓系统的特性,如果长时间不清理垃圾文件会导致越来越卡也会出现闪退情况,运行的程序过多,导致内存不足。
应用版本兼容问题:如果应用版本太低,会导致不兼容,造成闪退。此外,有些新版本 在调试中,也会造成应用闪退。
解决方法:如果是版本太旧,更新为新版本即可;如果是新版本闪退, 可能是应用在改版调试,可卸载后安装旧版。检查 APP 中访问网络的地方,组件中的 Image View 是否可以正常的下载并显示到 app 页面上。检查 APP 的 sdk 和手机的系统是否兼容。
在一些特定情况下的闪退,比如播放视频,在 Android5.0 升级到 Android6.0 的时候, 有些系统 API 老版本有,新版本没有,到时回去对象的时候失败,报空,系统就会出现闪退。
8、请简单介绍一下使用过的安卓 UI 自动化测试工具?
答:appium:是一个移动端的自动化框架,可用于测试原生应用,移动网页应用和混合型应用,且是跨平台的。
robotium:是一款国外的 Android 自动化测试框架,主要针对 Android 平台的应用进行黑盒自动化测试,它提供了模拟各种手势操作(点击、长按、滑动等)、查找和断言机制的 API,能够对各种控件进行操作。
9、请说明 Android 手机和 IOS 手机,系统有什么区别?
答:
- 两者运行机制不同:IOS 采用的是沙盒运行机制,安卓采用的是虚拟机运行机制;
- 两者后台制度不同:IOS 中任何第三方程序都不能在后台运行;安卓中任何程序都能在后台运行,直到没有内存才会关闭;
- IOS 中用于 UI 指令权限最高,安卓中数据处理指令权限最高。接口自动化测试。
10、get 和 post 区别是什么?
答:POST 和 GET 都是向服务器提交数据,并且都会从服务器获取数据。
区别:
- 传送方式:get 通过地址栏传输,post 通过报文传输;
- 传送长度:get 参数有长度限制(受限于 url 长度),而 post 无限制;
- GET 产生一个 TCP 数据包(对于 GET 方式的请求,浏览器会把 http header 和 data 一并发送出去,服务器响应 200 返回数据),POST 产生两个 TCP 数据包(对于 POST,浏览器先发送 header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok 返回数据);
- get 请求参数会被完整保留在浏览历史记录里,而 post 中的参数不会被保留;
- 在做数据查询时,建议用 GET 方式;而在做数据添加、修改或删除时,建议用 post 方式。
11、什么是 Http 协议无状态协议?怎么解决 HTTP 协议无状态协议
答:无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服 务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息。
HTTP 是一个无状态协议,这意味着每个请求都是独立的,Keep-Alive 没能 改变这个结果。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导 致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
HTTP 协议这种特性有优点也有缺点,优点在于解放了服务器,每一次请求“点到为止”不会造成 不必要连接占用,缺点在于每次请求会传输大量重复的内容信息。
客户端与服务器进行动态交互的 Web 应用程序出现之后,HTTP 无状态的特性严重阻碍了这些应用程序的实现,毕竟交互是需要承前启后的,简单的购物车程序也要知道用户到底在之前选择了什么商品。于是, 两种用于保持 HTTP 连接状态的技术就应运而生了,一个是 Cookie,而另一个则是 Session。
12、cookie 和 session 的区别
答:cookie 数据存放在客户的浏览器上,session 数据放在服务器上cookie 不是很安全,别人可以分析存放在本地的 cookie 并进行 cookie 欺骗,考虑到安全应当使用 session。
session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面应当使用 cookie。
单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie 可以将登陆信息等重要信息存放为 session;其他信息需要保存,可以放在 cookie。
13、什么是 DNS?
答:DNS 是域名系统 (Domain Name System),DNS 是用来做域名解析的,它会在你上网输入网址后,把它转换成 IP,然后去访问对方服务器;没有它,你想上百度就要记住百度的 IP, 但有了 DNS 的处理,你只需要记住对应网站的域名,即网址就可以了。
14、请问你们公司是如何做接口测试的?
答:接口测试实际跟一般测试不同就是测试用例的设计部分。
- 获取接口规范;
- 设计接口测试功能用例(主要从用户角度出发看接口能否实现业务需求,用例设计就是黑 盒用例那一套);
- 各种入参验证(正常情况,异常情况包括输入参数个数不对,类型不对,可选/必选,还 有考虑参数有互斥或关联的情况);
- 接口返回值各种验证(符合接口文档需求);
- 了解接口实现逻辑,实现逻辑覆盖(语句/条件/分支/判定/…);
- 接口能并发执行吗、安全吗,性能满足要求吗;
- 采用工具或者自写代码来验证;
- 发现问题跟功能测试一样,该报 bug 报 bug,该跟踪状态的跟踪状态。
15、怎么设计接口测试用例?
答:通常,设计接口测试用例需要考虑以下几个方面:
是否满足前提条件
有些接口需要满足前提,才可成功获取数据。常见的,需要登录 Token 逆向用例:针对是否满足前置条件(假设为 n 个条件),设计 0~n 条用例。
是否携带默认值参数
正向用例:带默认值的参数都不填写、不传参,必填参数都填写正确且存在的“常规”值, 其他不填写,设计1条用例。
业务规则、功能需求
这里根据时间情况,结合接口参数说明,可能需要设计 N 条正向用例和逆向用例。
参数是否必填
逆向用例:针对每个必填参数,都设计1条参数值为空的逆向用例。
参数之间是否存在关联
有些参数彼此之间存在相互制约的关系。
参数数据类型限制
逆向用例:针对每个参数都设计1条参数值类型不符的逆向用例。
参数数据类型自身的数据范围值限制
正向用例:针对所有参数,设计1条每个参数的参数值在数据范围内为最大值的正向用例。
16、你做接口测试,测什么?
答:可用性测试,根据约定的协议、方法、格式内容,传输数据到接口经处理后返回期望的结果:
- 接口功能是否正确实现;
- 返回值测试 - 返回值除了内容要正确,类型也要正确,保证调用方能够正确地解析;
- 参数值边界值、等价类测试;错误和异常处理测试;
- 输入异常值(空值、特殊字符、超过约定长度等),接口能正确处理,且按预期响应;
- 输入错误的参数,接口能正确处理,并按预期响应;
- 多输入、少输入参数,接口能正确处理,且按预期响应;
- 错误传输数据格式(如 json 格式写成 form 格式)测试。
- 安全性测试,主要指传输数据的安全性:
- 敏感数据(如密码、秘钥)等是否加密传输;
- 返回数据是否含有敏感数据,如用户密码、完整的用户银行账号信息等;
- 接口是否对传入的数据做安全校验,如身份 ID 加 token 类似校验;
- 接口是否防止恶意请求(如大量伪造请求接口致使服务器崩溃)。
- 性能测试,如接口的响应时间、并发处理能力、压测处理情况:
- 并发请求相同的接口(特别为 POST 请求),接口的处理情况(如插入了相同的记录导致数据出错,引发系统故障);
- 接口响应时长在用户可忍受的范围内;
- 对于请求量大的接口做压测,确定最大的瓶颈点是否满足当前业务需要。
17、没有接口文档,如果做接口测试?
答:用抓包工具把接口抓取处理,然后针对性进行测试;接口中字段信息不清楚的,找时间 集中寻求开发解答(常用抓包工具 Fiddler、Charles 等)。
18、在手工接口测试或者自动化接口测试的过程中,上下游接口有数据依赖如何处理?
答:用一个全局变量来处理依赖的数据,比如登录后返回 token,其它接口都需要这个 token,那就用全局变量来传 token 参数。
19、接口测试中,依赖登录状态的接口如何测试?
答:依赖登录状态的接口的本质上是在每次发送请求时需要带上 session 或者 cookie 才能发送成功,在构建 POST 请求时添加必要的 session 或者 cookie。
20、你平常做接口测试的过程中发现过哪些 bug?
答:常规错误,接口没实现,没按约定返回结果,边界值处理出错等。
输入异常值(空值、特殊字符、超过约定长度等),接口抛错,没做封装处理;输入错误的参数、多输入、少输入参数,接口可能出现的错误;
安全性问题,如明文传输、返回结果含有敏感信息,没对用户身份信息做校验,没做恶意请 求拦截等;
性能问题,如接口并发插入多条相同操作,响应时间过长,接口压测出现瓶颈等;
21、当一个接口出现异常时候,你是如何分析异常的?
答:先抓包,用 fiddler(charles)工具抓包,或者浏览器上 F12 调试工具;APP 上的话,那就用 Fiddler 做代理,通过手机设置代理去看请求和返回报文;
查看后端日志,如 Linux 系统通过 xhell 连上服务器,查看接口日志,查看是否有报错信息(命令:tail -f 日志文件)。
22、如何分析一个 bug 是前端还是后端的?
答:平常提 bug 的时候,前端开发和后端开发总是扯皮,不承认是对方的 bug。
这种情况很容易判断,先抓包看请求报文,对着接口文档,看请求报文有没问题,有问题就 是前端发的数据不对。
请求报文没问题,那就看返回报文,返回的数据不对,那就是后端开发的问题咯。
23、你们做接口测试自动化吗?
答:现在针对大量应用,普遍推崇做接口测试自动化,维护成本低、收益高。常用的工具有 许多,如 Jmeter、Robot Framework、pytest 等。
24、在 python 中进行数据驱动测试
答:在unittest中,没有自带的数据驱动,我们得借助 ddt 来实现,首先,我们得在python运行环境中安装 ddt,用下列命令安装
pip install ddt
另外一个测试框架pytest,它自带数据驱动实现是通过
@pytest.mark.parametrize(argnames,argvalues)
来实现参数化的。也可以根据自己需求用 python 实现数据的读取和驱动。
25、接口自动化中的关联怎么处理?
答:把上一个请求返回的结果传入到下一个请求的参数中,将请求的结果反射到一个类属性(使用 setattr()函数),下一个请求去调用这个类属性。
26、自动化使用的测试框架是什么?简述自动化框架的设计与维护
答:测试框架: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 信息。
断言好处:
- 自动化测试用例和手工测试用例的完美结合,减少重复工作;
- 配置灵活,可以自主切换测试环境,执行测试用例;
- 常用功能进行封装,逻辑清晰,易于维护;
- 统一执行入口,管理测试用例集:run.py 模块通过模糊查找来选择需要执行的测试用例;
- 持续集成,定时构建,快速反馈。
27、具体的在这个项目中自动化怎么应用到实际的,您对自动化结果的分析
答:完成所有的自动化测试框架的设计和实现后,进行接口测试,然后集成到jenkins,配置定时执行,生成 html 报表,查看测试通过率,查看接口的功能每次发版时,进行回归测试,新功能开发未提测前。