软件测试面试问题

因为我从业时间尚短,学的东西还是很浅显的,面试的大佬们一问我,就卡壳了。所以做个汇总,长期更新。

GET请求和POST请求的区别

  • [一] 标准答案
  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中。
  • [二] 深入答案

GET和POST是HTTP协议中的两种发送请求的方法。HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP。

GET和POST还有一个重大区别,简单的说:

GET产生一个TCP数据包;POST产生两个TCP数据包。

对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);

而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

Linux查看所有JAVA进程

操作 命令
查看java进程 ps -ef | grep java
停止特定java进程命令 kill 进程序号
停止所有java进程命令 pkill - 9 java
强制停止特定java进程命令 kill -9 进程序号

Linux查看日志

一般项目都有logs的目录文件,来存放日志文件,有个xxx.out的文件。

  1. 使用tail命令实时查看后台日志
tail -f xxx.out

(默认最后10行,相当于增加参数 -n 10)
这时候会动态实时显示当前的日志,使用Ctrl+C停止

tail -n 50 xxx.log

显示日志文件尾部50行

tail -n +50 xxx.log

从日志文件50行开始显示

tail -nf 1000 xxx.log

循环实时显示最后1000行

  1. head命令
head -n 100 xxx.log

查询日志文件的头10行

head -n -10 xxx.log

查询日志文件除了最后10行的其他所有日志

  1. cat命令
cat -n xxx.log | grep "关键字"

搜索关键字附近的日志【按照行号查询】

左连接、右连接

SQL中左连接和右连接都属于外连接。

左连接是LEFT JOIN或LEFT OUTER JOIN,左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

右连接是RIGHT JOIN 或 RIGHT OUTER JOIN,右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

HTTP状态码

    100: ('continue',),
    101: ('switching_protocols',),
    102: ('processing',),
    103: ('checkpoint',),
    122: ('uri_too_long', 'request_uri_too_long'),

    # Informational
	1xx(临时响应)
	表示临时响应并需要请求者继续执行操作的状态代码。
	100  (继续) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。 
	101  (切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。

    200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'),
    201: ('created',),
    202: ('accepted',),
    203: ('non_authoritative_info', 'non_authoritative_information'),
    204: ('no_content',),
    205: ('reset_content', 'reset'),
    206: ('partial_content', 'partial'),
    207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'),
    208: ('already_reported',),
    226: ('im_used',),

	2xx (成功)
	表示成功处理了请求的状态代码。
	
	200  (成功)  服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。
	201  (已创建)  请求成功并且服务器创建了新的资源。
	202  (已接受)  服务器已接受请求,但尚未处理。
	203  (非授权信息)  服务器已成功处理了请求,但返回的信息可能来自另一来源。
	204  (无内容)  服务器成功处理了请求,但没有返回任何内容。
	205  (重置内容) 服务器成功处理了请求,但没有返回任何内容。
	206  (部分内容)  服务器成功处理了部分 GET 请求。

    300: ('multiple_choices',),
    301: ('moved_permanently', 'moved', '\\o-'),
    302: ('found',),
    303: ('see_other', 'other'),
    304: ('not_modified',),
    305: ('use_proxy',),
    306: ('switch_proxy',),
    307: ('temporary_redirect', 'temporary_moved', 'temporary'),
    308: ('permanent_redirect',
          'resume_incomplete', 'resume',),  # These 2 to be removed in 3.0

    # Redirection
    3xx (重定向)
	表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。
	
	300  (多种选择)  针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
	301  (永久移动)  请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
	302  (临时移动)  服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
	303  (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
	304  (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
	305  (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。
	307  (临时重定向)  服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

    400: ('bad_request', 'bad'),
    401: ('unauthorized',),
    402: ('payment_required', 'payment'),
    403: ('forbidden',),
    404: ('not_found', '-o-'),
    405: ('method_not_allowed', 'not_allowed'),
    406: ('not_acceptable',),
    407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'),
    408: ('request_timeout', 'timeout'),
    409: ('conflict',),
    410: ('gone',),
    411: ('length_required',),
    412: ('precondition_failed', 'precondition'),
    413: ('request_entity_too_large',),
    414: ('request_uri_too_large',),
    415: ('unsupported_media_type', 'unsupported_media', 'media_type'),
    416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'),
    417: ('expectation_failed',),
    418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'),
    421: ('misdirected_request',),
    422: ('unprocessable_entity', 'unprocessable'),
    423: ('locked',),
    424: ('failed_dependency', 'dependency'),
    425: ('unordered_collection', 'unordered'),
    426: ('upgrade_required', 'upgrade'),
    428: ('precondition_required', 'precondition'),
    429: ('too_many_requests', 'too_many'),
    431: ('header_fields_too_large', 'fields_too_large'),
    444: ('no_response', 'none'),
    449: ('retry_with', 'retry'),
    450: ('blocked_by_windows_parental_controls', 'parental_controls'),
    451: ('unavailable_for_legal_reasons', 'legal_reasons'),
    499: ('client_closed_request',),

    # Client Error.
	4xx(请求错误)
	这些状态代码表示请求可能出错,妨碍了服务器的处理。
	
	400  (错误请求) 服务器不理解请求的语法。
	401  (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
	403  (禁止) 服务器拒绝请求。
	404  (未找到) 服务器找不到请求的网页。
	405  (方法禁用) 禁用请求中指定的方法。
	406  (不接受) 无法使用请求的内容特性响应请求的网页。
	407  (需要代理授权) 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。
	408  (请求超时)  服务器等候请求时发生超时。
	409  (冲突)  服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。
	410  (已删除)  如果请求的资源已永久删除,服务器就会返回此响应。
	411  (需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。
	412  (未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。
	413  (请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
	414  (请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。
	415  (不支持的媒体类型) 请求的格式不受请求页面的支持。
	416  (请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码。
	417  (未满足期望值) 服务器未满足"期望"请求标头字段的要求。

    500: ('internal_server_error', 'server_error', '/o\\', '✗'),
    501: ('not_implemented',),
    502: ('bad_gateway',),
    503: ('service_unavailable', 'unavailable'),
    504: ('gateway_timeout',),
    505: ('http_version_not_supported', 'http_version'),
    506: ('variant_also_negotiates',),
    507: ('insufficient_storage',),
    509: ('bandwidth_limit_exceeded', 'bandwidth'),
    510: ('not_extended',),
    511: ('network_authentication_required', 'network_auth', 'network_authentication')

    # Server Error
    5xx(服务器错误)
	这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。
	
	500  (服务器内部错误)  服务器遇到错误,无法完成请求。
	501  (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。
	502  (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。
	503  (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。
	504  (网关超时)  服务器作为网关或代理,但是没有及时从上游服务器收到请求。
	505  (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。

最好记住的有200、201、202状态码、301、302、303、304、305、307状态码、401、403、404状态码、500、501、502、503状态码

Http响应中400错误和500错误的区别

400错误是参数与控制器层所需要的参数不符合。报400错误的话,说明还没有进入控制器层的方法中。
500错误是传入的参数在业务处理中出现了异常。

Http无状态

http是无状态协议,言外之意是说http协议没法保存客户机信息,也就没法区分每次请求的不同之处。【无状态协议对于事务处理没有记忆能力。】

于是,两种用于保持HTTP状态的技术就应运而生了,一个是Cookie,而另一个则是Session。

分析Bug

先抓包看请求报文,对着接口文档,看请求报文有没有问题,有问题就是前端发的数据不对;请求报文没问题,就看返回报文,返回的数据不对,就是后端的问题。

举例说下:
下图的情景,页面显示搜索结果,选择不同的每页显示数量【由size=10变成size=40】,接口vendorId没有传参【vendorId是必传】,那就是说前端少传参数,前端的bug。
软件测试面试问题_第1张图片
下图的情景:搜索vendorId=100000的数据,接口时间返回 23条数据,看到各种各样的vendorId,确认是返回的数据不对,后台的bug
软件测试面试问题_第2张图片

测试脚本中 数据的处理

因为测试的数据多种多样,像登录的账户密码、注册的账户数据、接口的各种参数、邮箱配置的数据等,如何存放?

1.对于账号密码,可以写在配置文件(ini)
2.注册使用的账户数据,一次性消耗的数据,可以使用随机函数,或者使用时间戳
3.接口的各种参数的组合,可以参数化,放到excel、csv里面
4.邮箱配置,也可以写在配置文件(ini)

UI自动化测试的优缺点及如何规避缺点

UI层是用户使用产品的入口,所有功能通过这一层提供给用户,测试工作大多集中在这一层。
UI自动化测试(GUI界面层),即通过模拟手动操作用户UI界面的方式,以代码方式实现自动操作和验证的一种自动化测试手段。主要应用于冒烟测试、回归测试。

在实际应用中,UI自动化可以帮助我们节省人工测试成本,提高功能测试的测试效率。缺点也是比较明显,随着敏捷迭代的速度越来越快,UI控件的频繁变更导致控件定位不稳定,提高了用例脚本的维护成本,同时定位的不稳定导致用例的可信度降低。

解决方法:

1.在自动化测试中,引入了Page Object Model(POM) 页面对象模式来解决。

采用PageObject设计模式是将某个页面的所有"元素(包含控件)属性"及"元素操作"封装在1个类(Class)里面,目的是为了将测试代码与被测页面对象代码分离,后期如果有页面元素发生更改,只需要修改相应页面对象的代码(即对应class文件),而不需要修改测试代码。也是为了进一步降低后续因页面变化带来的维护成本。

2.失败重试机制,提高用例稳定性

由于用例执行的稳定性直接决定用例在业务落地时的可信度,所以提高用例稳定性是必要的,框架提供了失败重试的机制来间接保证稳定性。即当监听到用例执行失败异常时,重新执行当前用例逻辑,如果执行成功,覆盖当前用例的执行结果;如果失败,重新执行,直到超过重试次数。

3.定位元素的方式 + 等待方式的优化

A.实际写脚本的时候,尽量少使用xpath绝对路径方式来定位元素
B.元素等待少用implicitly_wait 、sleep,可以多使用 WebDriverWait + expected_conditions做新的方法封装

此外关于自动化测试的优劣势:

  1. 优势:
    提高测试执行效率,节约时间成本;
    解放人力去做更重要的工作;
    可重复利用,建设对人的依赖;
    可大幅度减少兼容性测试的工作量;
    有些测试工作必须依靠自动化实现来完成;

  2. 劣势:
    开发测试脚本需要花费较大的时间成本,拉长周期;
    产品的快速迭代,自动化脚本也将不断迭代,时间成本很高;
    不同的项目之间自动化脚本的复用度很低;
    对短期型项目产品实现自动化价值不高;
    自动化无法完全代替手工测试找到bug,实现100%覆盖;
    自动化更多的适用于回归测试;
    自动化开发过程对软件测试团队的技术有更高的要求;

App测试和Web测试的区别

web测试和app测试从流程上来说,没有区别,都有需求分析、设计用例、测试执行、缺陷管理、测试报告等过程。
从技术角度来说,都需要进行功能测试、性能测试、安全性测试、可用性测试、兼容性测试等类型。

主要区别在于:

性能测试:在web测试中,只需要测试响应时间这个要素;在app测试还要考虑流量测试和耗电量。
兼容性测试:web测试是兼容不同浏览器【常见的兼容IE、Chrome、Firefox】,app测试是兼容手机设备【不同品牌、不同分辨率、不同系统、不同版本】。
安装测试:web基本没有客户端层面的安装测试,app安装测试包括1).不同操作系统下正常安装测试 2).软件安装后是否能够正常运行,文件夹和文件是否写到指定的目录 3).软件安装各个选项是否符合概要设计说明 4).安装向导的UI测试 5).安装是否可以取消,取消后写入的文件是否符合概要设计说明 6).安装过程的意外情况处理是否符合需求(死机、重启) 7).安装空间不足,是否有提示 8).安装后是否生成多余的目录结构和文件 9).网络验证之类的安装,断网情况下的验证 10).需要对安装手册进行测试

交叉事件测试:手机客户端的电话、短信、电量不足、闹钟提示、蓝牙传输文件、相机拍照等外部事件
操作类型测试:手机客户端的横屏测试、手势测试
网络测试:弱网测试和切换网络测试
升级测试:升级测试的提醒机制;升级选择取消是否影响原有功能;升级后用户数据是否被清除

【待更新】

Cookie、Session的区别

通俗讲,Cookie是访问某些网站以后在本地存储的一些网站相关的信息,下次再访问的时候减少一些步骤。另外一个更准确的说法是:Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器,是一种在客户端保持状态的方案。

Session是存在服务器的一种用来存放用户数据的类HashTable结构。

Android和iOS测试区别

现场设计测试用例【电梯、手机壳、登录模块】

FIddler手机抓包和HTTPS设置

交流技术 欢迎+QQ 153132336 zy
个人博客 https://blog.csdn.net/zyooooxie

你可能感兴趣的:(每日分享)