软件测试面试题

一、web自动化

(selenium + webdriver + python)八大元素定位、动态元素如何定位、常见异常解决手段(元素定位不到,元素无法正常交互、超时、无法创建session);

1、元素定位失败的原因有哪些?
        没等待:页面加载需要时间,元件没加载出来,所以定位不到。
        窗口没切换:windows窗口 或 frame窗口下的元件,都要在对应的窗口里才能定位到。
        元素定位值不正确:存在对应组件,但参数不正确。如组件没id,却用id定位;
        是否是动态元素?
        多个元素同名:同名元件多个,默认返回第一个,或者返回成数组,在数组里还需定位;
        组件被遮挡:如页面没最大化,点击不到;
        是否需要悬停:如停到某个按钮后,弹出按钮;

2、自动化测试选择哪种数据驱动形式?
        通过文件存储数据管理的形式,在执行自动化时,直接导入文件中的数据,来实现自动化测试业务;提升代码的可维护性,代码与数据分离,更好地对自动化测试以及测试数据进行管理和维护。
        Excel数据驱动:数据存在Excel表格,实现简单,容易上手,但数据死板,管理麻烦;
        以公司的业务,来确定选择哪种设计模式;
       

3、如何设计高质量自动化脚本?
        独立化测试场景:将不同业务流程的测试执行进行独立化管理,避免所有代码封装在一个函数里或一个类里;降低代码冗余,提升代码维护性。测试用例的独立化,如打开百度、打开京东的页面测试相互独立;
        合理的设计模式:结合业务需求、团队、自动化测试的目的、被测试项目的情况,进行合理的测试框架结构设计,确保自动化测试框架满足企业需求,并且能够在团队中执行;如POM模式、数据驱动模式。
        高内聚低耦合:降低不同场景的测试用例耦合度,独立化不同测试用例。
        分层结构设计:确保实际运行过程中,测试数据、代码、逻辑的分离。
        业务流程处理:核心是从业务的正向流程去分析设计用例,不要企图把所有的操作行为都给予代码来实现;否则考虑太多,代码会很杂乱。
        函数封装:考虑以更加灵活的方式来实现,避免逻辑写死而导致函数功能单一,无法满足尽可能多的需求。
        能否推行自动化,还关系到自动化测试工程师的代码编写能力;框架的设计能力;完整的符合团队、公司业务的自动化测试框架,需要考虑整体团队的编码能力;(代码与数据分离、逻辑代码与测试代码分离、结构清晰、不同的库实现不同的功能、不同的包有不同的业务处理、结构层级要清晰)用pytest?还是unittest?等等;

4、元素无法正常交互的原因?
        页面没最大化、是否需要悬停(如悬停后再弹出窗口才可以点击)、是否需要滚动条滚动(如有下拉框滚动条)、元素定位错误;

5、超时出错?
        显示等待超时,因为每个元素一致没加载出来;窗体最大化超时,通过options进行配置解决窗体最大化;

6、无法创建session?
        检查浏览器版本与driver 是否匹配

7、测试框架如何设计?
        业务原则 + 结构原则;
        python+selenium+Yaml+pytest+allure+loggin+Jenkins+git
        业务原则:原公司如何设计的?结合实际需求;用selenium + python,基于POM设计模式来实现这个框架的底层逻辑;用Excel存储用例,实现数据驱动;把不同模块的测试用例, 使用pytest进行管理;生成的结果用alllure产出。
        如何设计一个符合需要的框架?
               设计模式POM + 数据驱动+结构分层(可读性、可维护性、可拓展新); 代码与数据分离;业务代码与操作分离;
               框架执行自动化测试具体步骤:基于Excel编写测试用例,通过读取里面的数据,参数,
        执行自动化测试;运行过程中,通过logging查看日志记录,生产html测试报告;

        

8、动态元素定位?
        动态元素,指每次加载时,部分元素的属性会发生变化;(如网易云音乐的最新推荐歌曲)
        选择相对灵活的定位方式,Xpath定位  或 css_selector定位;基于元素路径、不变属性等;
        首先:刷新几次,观察下,是整个都是变化的还是部分变化  部分变化我们可以采用不变的部分定位 整个都在变化的 只能利用其它不变的元素
        其次:就是定位到该元素的父节点子节点或者同等级节点 在进行定位  比如先定位到同级元素  在定位到其父节点  在定位子节点 即要定位的节点元素

9、如何提高selenium脚本的自动化执行效率?(让脚本执行更快)
        优化测试用例,尽可能不使用强制等待,使用隐式等待。
        合理设置页面加载策略,如果加载内容过多,可检查具体加载内容是哪些,基于实际情况在不影响测试的情况下配置策略,因为如果页面的静态资源多,就会访问变慢。如隐式等待这个页面、或者等待某个特定元素;如页面加载策略:options.page_load_strategy,normal、eager、none三种;normal 全部加载出来,none:特定元素加载出来;
        合理设计封装测试框架架构,减少人为介入操作过程,减少代码的维护难度;例如登录的验证码,改为万能的、或者先删除;

10、如何提高自动化执行的稳定性?(确保少出问题)
        合理使用各种等待,确保元素在页面正常显示;
        使用异常处理机制,try except
        多用例并发时,减少用例间的耦合度,避免多线程运行过程中执行顺序引发不可控异常;(用例解耦,让用例间相互独立,)
        独立化测试环境,避免环境干扰及数据干扰;
        检查元素定位,避免元素定位不到引发执行失败。

11、浏览器输入url后经历的过程?
        首先,在浏览器地址栏中输入url
        浏览器先查看浏览器缓存-系统缓存-路由器缓存,如果缓存中有,会直接在屏幕中显示页面内容。若没有,则进入下一步。
        在发送http请求前,需要域名解析(DNS解析),解析获取相应的IP地址。
        浏览器向服务器发起tcp连接,与浏览器建立tcp三次握手。
        握手成功后,浏览器向服务器发送http请求,请求数据包。
        服务器处理收到的请求,将数据返回至浏览器;四次挥手;断开连接。
        浏览器收到HTTP响应
        读取页面内容,浏览器渲染,解析html源码

        1、客户端通过url发起请求;
        2、域名解析:通过DNS服务将域名解析ip
        3、通过三次握手建立连接
        4、客户端发送请求数据
        5、服务端处理请求并响应
        6、通过四次挥手断开连接。

12、HTTP中长链接、短连接的区别是什么?
        长连接:客户端与服务端先建立连接,连接建立后不断开,然后再进行报文发送和接收。这种方式下由于通讯连接一直存在。
        短连接:客户端与服务端每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。此方式常用于一点对多点通讯。
        重点在于TCP连接通道的保持,请求头中 connection:keep-alive ;1.1版本默认都是长链接;
        若是客户端和服务端交互频繁,则用长链接;

13、如何让自动化测试框架满足多环境测试执行?
        要实现一套测试用例在多环境下执行,要解决哪些问题:
        不同环境的服务入口地址不同,一般还会有http/https的差别
        不同环境需要使用不同的测试数据
        一些中间件,比如数据库、消息队列、缓存服务的访问地址、账号、配置有差别
        不同环境的第三方回调地址有差别
        不同环境的配置需要整体切换,不能出现在测试环境里用了生产环境的数据的问题

        总的原则是利用:外部变量文件+全局动态变量

        多环境指:生产环境、测试环境、开发环境、预生产环境、甚至是客户的环境等。
        不同环境的ip、端口,不一样;结合配置项的功能设定满足多环境应用;不同的config文件配置,不同的参数改变;
        有的客户,如数据库也不一样,端口不一样,账号密码不一样等;都是通过config配置文件实现。

14、如何优化现有的自动化测试框架?
        功能方面:代码层级方面,基于设计模式pom、数据驱动等,让功能更加简化,可维护性更好;
        使用方面:如,我的运行模块都是在我本地上的,部署到服务器上面,所有测试人员都可以运行,使用;
        效率方面:瀑布流,一个一个模块的,一个一个文件的用例执行的,改成并发等;(如有几百个模块,几百个文件,)
        减少代码冗余等;结合到实际上说;

15、如果测试过程中发现响应时间太长,该怎么进行下一步分析?
        先查本地,看脚本设计是否合理,本地资源是否不足;
        查看生命周期,看哪个环节消耗时间过长;如网络传输过程(带宽太小)、rabbitmq 、服务器问题(CPU、内存、io等)找到线程消耗大的

16、UI自动化的断言如何开展?
        ui自动化的断言通常在一个流程完结之后开展,例如登录,成功登录后,会显示已登录或者退出的按钮;断言,判断是否存在已登录  或 退出 ;存在,则成功登录,否则登录失败;

17、selenium 的工作原理?
        selenium本身不操作流浏览器;是基于webdriver来对浏览器进行操作的;webdriver在后端以进程的形态启动,通过指令调用到浏览器让其运行和操作;selenium.webdriver库是web自动化执行的核心库,包括对浏览器的页面元素的操作等行为;通过这个库,结合webdriver来实现web自动化测试;
        导入: from selenium import webdriver
 

18、web自动化中常用的跳过验证码操作?
        1、找开发关闭验证码;
        2、设置一个万能验证码:如8888;
        3、 通过cookies值登录;cookies是保持登录的一种状态,selenium中也有获取cookies信息操作,通过将cookies保存在text中,在我们执行登录操作时,进行将cookies添加进去,这个时候就能通过cookies完成登录,从而跳过验证码内容。       

x = json.dumps(driver.get_cookies())

        4、暴力,打开浏览器页面中强制等待30秒,手动输入验证码和验证码信息,然后在获取cookies信息。

19、UI自动化测试框架的核心逻辑实现?
        设计模式:POM模式,页面基类、页面对象类、testcase测试用例类、测试数据类data;
        用例管理:unittest
        数据驱动:yaml

20、form表单的属性action与method?
        action , URL  ,  规定当提交   表单时向何处发送表单数据;URL可能的值:  绝对 URL - 指向其他站点(比如 src="www.baidu.com");     相对 URL - 指向站点内的文件(比如 src="/Form00/getData")
        method    get/post   规定用于发送form-data的HTTP方法。(提交表单的方式)

21、在做自动化过程中,遇到过什么问题?举例下;
        1、频繁变更ui,需要不断修改页面对象里的代码;
        2、运行用例报错,如元素不可见,元素找不到;
        3、测试脚本复用,尽可能代码复用;
        4、一些新框架产生的页面元素定位问题,例如ck编辑器、动态表格问题;

22、简单介绍一下自动化项目整体框架的结构?
        自动化测试框架涵盖基础方法封装、自定义异常封装、工具类封装、元素管理封装、POM模式封装、日志封装、数据管理封装、失败重试封装、浏览器/手机适配封装、数据库操作封装、测试用例管理封装、测试报告等;
        基础方法:元素定位、选项下拉框、输入文字、点击、滑动等;
        数据库操作:连接数据库、查找元素、删除元素等;
        

23、web自动化中有哪些场景需要特殊处理?
        1、窗口切换;如iframe、windows、alert 窗口的切换;需要转换到对应窗口才能处理;
        2、时间控件,通常时间控件是不能输入的,需要通过js代码的方式,才能修改时间控件;;先是修改只读属性;或是直接用js修改控件的value;
        3、元素不在当前视图,需要滚动才会出现;可以采用js的方式滚动,或者先将光标置入到滚动条区域,然后模拟键盘的上下操作来处理;

二、接口自动化       

        企业实际应用的接口自动化测试都是基于关键字驱动来实现的;
1、Get 和 Post 的区别?
        应用场景不同:get 用于获取数据,post用户提交和修改;
        传参方式不同:get将表单中数据按照name=value的形式,添加到URL 后面,并且两者使用”?”连接,而各个变量之间使用”&”连接;post是将表单中的数据放在HTTP协议的请求头或消息体中,传递到 URL;get传输的数据要受到URL长度限制(url 最大长度是 2048 个字符);而post可以传输大量的数据,上传文件通常要使用post方式;由于Get的数据直接放在URL 里,所以不安全;而post的参数不可见,相对是安全的。
        传输方式不同:GET 方法只产生一个 TCP 数据包,浏览器会把请求头和请求数据一并发送出去,服务器响应 200 ok(返回数据)。POST 方法会产生两个 TCP 数据包,浏览器会先将请求头发送给服务器,待服务器响应100 continue,浏览器再发送请求数据,服务器响应200 ok(返回数据)。这么看起来 GET 请求的传输会比 POST 快上一些(因为GET 方法只发送一个 TCP 数据包),但是实际上在网络良好的情况下它们的传输速度基本相同。

        根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的。
        I. 所谓 安全的 意味着该操作用于获取信息而非修改信息。换句话说,GET请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。
  II. 幂等 的意味着对同一URL的多个请求应该返回同样的结果。


        

2、接口自动化如何校验接口的准确性?
        基于不同的技术应用,使用不同的assert断言机制;首先:状态码,200(成功)/300(重定向别的地方)/400(请求语法错误)/500(服务器异常)
        其次;接口是通的,根据接口文档进行测试,拿到response然后进行解析返回的json去判断字段和值;验证接口返回的字段是否正确,字段的层级结构是否对,以及业务核心的字段值是否是业务需要的数据,就是对数据准确性进行验证等等。
        接口如果报异常,要用try catch 捕获,assert断言在try catch之外;


 

3、接口关联自动化业务如何实现?
        postman:第一个请求发起,然后拿到响应结果;通过json提取器或正则表达式提取;把需要的数据 在 Tests(断言模块)保存为全局变量;下一个接口就当做参数传入即可。
        Jmeter:创建线程组,新建一个请求,发起请求,拿到响应;在这个请求下,创建一个后置处理器,解析响应结果存在变量中;或者通过json或正则表达式,提取返回结果,设为变量,作用于下一个接口作为输入。
        pytest:前后两个请求定义在一个类里,在类外定义一个全局变量;把第一个请求的返回结果保存在全局变量里;作为参数,传给第二个请求。

4、HTTP 和 HTTPS的区别?
         超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。
         为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL/TLS协议,SSL/TLS依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
        HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全;HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。
        主要区别
        1、https协议需要到CA申请证书,一般免费证书较少,因而需要一定费用。
        2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl/tls加密传输协议。
        3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443.
        4、http的连接很简单,是无状态的;HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

5、Cookie 和 Session 的区别?
        存放位置不同:cookie数据存放在客户的浏览器上,session数据放在服务器上。
        安全程度不同:cookie不是很安全,在本地浏览器,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。
        性能使用程度不同:session会在一定时间内保存在服务器上。当访问增多,会比较占2用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
        数据存储大小不同:单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie,而session则存储与服务端,浏览器对其没有限制。
        有效期不同:cookie可以设置保存时间,会在有效期内一直保存;而session是会话级别的,会话结束,session也相应被清楚;
       Token的出现可以解决微服务部署的跨域访问问题。(临时身份令牌)
        用户登录请求到一个专门的认证服务上进行认证,认证成功以后,返回通过加密后的token,客户端拿到之后,保存,下次还是这个用户访问的时候,就会带着这个token进行请求,被请求得服务拿着这个token去认证中心看下是不是该用户的,是,那么就给通过,返回响应结果。Token的有效时间:①15分钟以内或②一般15天
        Token的引入:Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token便应运而生。Token的定义:Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。使用Token的目的:Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。Token是在服务端产生的。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位。
        Http协议是无连接的;无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
        这么做的原因是 HTTP 协议产生于互联网,因此服务器需要处理同时面向全世界数十万、上百万客户端的网页访问,但每个客户端(即浏览器)与服务器之间交换数据的间歇性较大(即传输具有突发性、瞬时性),并且网页浏览的联想性、发散性导致两次传送的数据关联性很低,大部分通道实际上会很空闲、无端占用资源。因此 HTTP 的设计者有意利用这种特点将协议设计为请求时建连接、请求完释放连接,以尽快将资源释放出来服务其他客户端。
        随着时间的推移,网页变得越来越复杂,里面可能嵌入了很多图片,这时候每次访问图片都需要建立一次 TCP 连接就显得很低效。后来,Keep-Alive 被提出用来解决这效率低的问题。keep-Alive 功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive 功能避免了建立或者重新建立连接
        Cookie技术是客户端的解决方案,Cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。
        session会话控制,是服务器端使用的一种记录客户端状态或信息的机制,属于服务器的解决方案。
        在如今的市场或企业里,结合了cookie和session的,进行信息的存储;
通过cookie存储一个session_id,然后具体的数据则保存在session中,如果用户已经登录,则服务器会在cookie中保存一个session_id,下次再次请求的时候,会把该session_id携带上来,服务器根据session_id在session库中获取用户的session数据。就能知道该用户到底是谁,以及之前保存的一些状态信息;


6、如何管理接口数据?
        Yaml:考虑接口关联,基于接口业务量的流程测试下;
        Excel:考虑单接口的多条件覆盖;
        py.json  

7、如何设计接口自动化测试用例?
        单接口用例设计:用Excel 把地址、路径、请求方法、请求头、参数、参数类型、校验字段、预期结果等作为参数输入;
        错误情况:如多参、少参、参数过长、参数错误等;
        接口关联业务用例设计:关联的数据用全局变量保存起来,在后续的接口需要,就取出来传过去。

8、什么是接口关联?
        在应用业务中,完成一个业务功能,一个接口不能满足整个业务的逻辑流程,需要多个接口配合使用;并且在A接口调用后,需要在A接口中返回的数据,拿到需要的字段,并且在调用B接口的时候,作为B接口请求参数传给B;这类上一个接口的返回数据作为下一个接口的入参的场景,成为关联接口;如修改密码前,需要登录;

9、接口自动化测试用例有多少条?执行时间多久?
        单个接口;一般一百几十条,一秒内,几十毫秒、几百毫秒;接口用例的多少,与业务相关;业务大的,用例就多,可能最少的,就几条;

10、dubbo接口测试如何开展?
        1. 使用 telnet 命令来测试 (推荐指数:1 星)
                在 windows 的 cmd 上使用 telnet 命令运行,经常会遇到乱码问题
        2. jmeter 集成 dubbo 相关的 jar 包测试 (推荐指数:2 星)
                 安装 jmeter-plugins-for-apache-dubbo
        3.自己写 java 代码调用远端的提供者服务 (推荐指数:3 星)
        4. 使用别人封装的库或者开源工具进行测试
参考:dubbo 接口的测试方法汇总​ · TesterHome

11、HTTP常见返回码?
        1xx:指示信息。表示请求已接收,继续处理
        2xx:成功。表示请求以成功接收、理解、接受。
        3xx:重定向。要完成请求必须进行更进一步的操作。
        4xx:客户端错误。请求有语法错误或者请求无法实现
        5xx:服务端错误。服务器未能实现合法的请求。

        常见的状态返回码
        200 OK:客户端请求成功。表示请求被服务器正常处理。
        204 no content:请求成功,响应报文中没有相应体
        206 partial content:服务器已经正确处理部分GET请求,实现断点续传或同时分片下载,该请求必须包含Range请求头来指示客户端期望得到的范围,

        301 moved permanently(永久重定向):该资源已被永久移动到新位置,新的URI在响应首部的Location字段。只要不是HEAD请求,响应实体应该包含新的uri的超链接和简短的说明。
        302 move temporarily(临时重定向):该资源临时移动到新位置了。与301相似
        304 not modified:自上次请求后,再次请求时页面未被修改,服务器返回此响应,不会返回网页内容,客户端根据状态码得知网页没有变更,复用之前的网页。进而节省带宽与开销。

        401 Unauthorized:表示发送的请求需要HTTP认证信息,或者认证失败了。
        403 Forbidden:表示对请求资源的访问被服务器拒绝了
        404 not found:服务器上没找到请求的资源
        415:请求资源不支持请求项目格式

        500:internal sever error:服务器端在执行请求时发生了错误
        502:服务器暂时不可用,有时是为了防止发生系统过载
        503:服务器过载或暂停维修

12、接口测试用例的编写要点有哪些?
        必填字段:请求参数必填项,选填项
        合法性:输入输出合法、非法参数
        边界:请求参数的边界值等;
        容错能力:大容量数据、频繁请求、重复请求(如订单)、网络异常等处理
        响应数据校验:断言、数据提取传递到下一级接口
        逻辑校验:如两个请求的接口有严格的先后顺序,需要测试调用顺序的情况
        性能:对接口模拟并发测设,逐步加压,分析瓶颈
        安全性:构造恶意的字符请求,如:SQL注入、xss、敏感信息、业务逻辑等;

13、接口测试中的加密参数如何处理?
        首先了解加密解密的方式,如md5、aes 、rsa等等;如果是aes的,需要找开发要私钥;然后在测试接口工具中引用解密解密的代码实现参数的加解密过程,实现参数加解密的处理;如果公司有自定义的加解密算法,则需要找开发要相应的代码,然后在测试工具中使用;

14、pytest里如何进行case的组装?
        1、默认使用检查以 test_.py 或 **test.py命名的文件名,在文件内部以test大头的方法或函数,并执行。
        2、可以使用自定义 marker(标签)装饰器,比如pytest运行的时候,只允许带有该marker的测试用例,比如下面的 @pytest.mark.p0 
        3、在命令行使用指定文件
        4、参数 -k args 模糊匹配 case (关键字 args:可以是py文件名,也可以是函数名)

15、说说pytest里的钩子函数?
        

16、mock技术一般用在什么场景?
        场景:一、提测后,后端未提测,前端已完成,使用mock验证前端;二、业务的自动化过程中,有个别接口不稳定,使用mock代替;
        思路:一、使用flask编写mock服务; 二、postman 使用mock ;

17、自动化和手工占比多少?分别用来做什么业务?
        取决于公司的投入;通常总得用例如1000条,自动化的大概300左右; 通常用来做自动化测试的,都是稳定的模块用例、功能优先级较高的用例,手工测试一般用来做新功能测试业务,自动化一般用来做旧的功能,做回归测试;

18、接口测试时,碰到接口重定向如何测试?
        重定向(redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置,从地址A跳转到地址B了。例如:注册成功之后可以跳转到登录页面,这就是重定向;我们使用 res.redirect('跳转页面'); 来实现跳转到另外一个接口进行处理;如登陆成功,跳转到首页;
        重定向状态码:
        301 redirect: 301 代表永久性转移(Permanently Moved)
        302 redirect: 302 代表暂时性转移(Temporarily Moved )

        接口测试的方式不同,处理的方式不同;重定向返回响应是302;
        如果用的是jmeter,则无需特殊处理,因为jmeter默认会自动处理重定向接口,自动发起对重定向的接口地址的访问并返回结果;
        如果采用代码框架的方式,则需要特殊处理,禁止重定向;自动处理重定向地址后,我们就获取不到重定向后的 url 了,就无法走下一步,这里我们可以设置一个参数禁止重定向:allow_redirects=False(allow_redirects=True 是启动重定向),然后就可以看到 status_code 是 302 ;拿到第一个接口响应 header中的location字段对应的接口地址,发起对该地址的请求。
        
       

19、接口依赖第三方接口,但第三方接口却有问题,该怎么办?
        采用mock 的方式模拟第三方接口的返回;

20、restful标准接口中,有哪几种请求?分别代表什么含义?
        restful规范的接口中,通常一个接口地址url就代表一种资源;对于资源的操作,是通过http请求方法实现的,其中有 get、post、put、delete四种方式;get 获取数据;post表示新增数据;put表示修改数据,delete表示删除数据;
        表述性资源状态转移;
        

三、测试理论

1、测试流程是什么?
        需求评审-》开发设计文档-》指定测试计划-》编写测试用例-》用例评审-》开发完成(冒烟测试)-》测试人员接到测试版本-》执行测试用例-》提交bug-》修复bug-》回归测试。
        添加细节;

2、测试流程每个阶段时间分配是怎样的的?
        以中型项目,一个版本周期一个月为例,
        测试用例编写:2-3天;
        用例评审: 半天;大项目会重审后修改再评审,可能带上产品、开发;熟悉的项目直接过。
        版本测试:(以一个月为项目周期)第一轮5天,第二轮3天,第三轮回归2天。

3、编写测试用例的方法?
        用例类型
                功能测试用例:(编号、用例名、步骤、入参、预期结果、模块名、实际结果)
                性能测试用例:(编号、用例名、测试接口、性能输入:并发量、迭代次数、压测时间、预期结果:吞吐量、响应时间、错误率)
                接口测试用例:(编号、接口名称、url地址、参数、请求头、预期结果、实际结果)

        用例方法:等价类划分、边界值法、场景法、因果图、正交表

4、每天执行多少测试用例?
        看情况,根据业务走的;bug多,就执行的少;如果bug不多,就执行多点;一般每天二三十条的样子吧;

5、回归测试是否全部做?
        看时间,时间充足,就全部做,顺便改成自动化;如果时间比较紧,就挑模块来测。挑主流程来做。

6、软件测试分哪些种类?
        按阶段分:单元测试、集成测试、系统测试、验收测试。
        按是否运行分:静态测试、动态测试;
        按是否查看源码分:白盒测试、黑盒测试
                        黑盒:功能测试(逻辑功能、界面、易用性、安装、兼容性)、性能测试
        其他:回归测试、冒烟测试、随机测试
                                

7、一条bug 包含哪些内容?
        版本号、对接开发、优先级、严重程度、所属模块(不能定就让开发定)、标题(描述现象)、详细描述(尽可能给出还原步骤、截图、日志)

8、工作中遇到那些经典bug?
        1、兼容性问题:ie可以提交订单按钮,Chrome 和 Firefox 不行。
        2、移动端消息通知栏,小米、OPPO、vivo等,有的可以显示两个图片,有的不行。
        3、修改密码;新旧密码一样也能通过,系统没做校验,没提示;
        4、混合APP,断开网络后,点击页面没有提示网络断开,而是只有undefined返回。
        5、新旧版本变更,没有数据库的前后兼容;(易课)

9、bug等级如何划分?
        一般划分:致命、严重、一般、提示
        致命:主流程无法跑通,系统无法运行,崩溃或严重资源不足,应用模块无法启动或异常退出,主要功能模块无法使用。比如:1.内存泄漏;2.严重的数值计算错误;3.系统容易崩溃。                 严重:影响系统功能或操作,主要功能存在严重缺陷,但不会影响到系统稳定性。比如:1. 功能未实现;2.功能存在报错;
        一般:界面、性能缺陷。比如:1.边界条件下错误;2.容错性不好;3.大数据下容易无响应;          提示:易用性及建议性问题;比如:1.界面颜色搭配不好;2.文字排列不整齐;3.出现错别字,但是不影响功能;

10、不能复现的bug如何处理?
        这题的关键在于如何分析、和定位;
        根据需求文档、产品计划,判断Bug的严重程度,如果是严重问题或影响上线的问题,需要尽快通知研发和组长,并进行下一步处理;
        首先记录出现的测试场景,保留相关的测试案例、日志截图或其他相关的截图(如果有的话),并提Bug跟踪,同步给到研发描述Bug出现的情况,如果提供的日志等信息开发无法分析原因,则进行下一步;
        尽可能按照原测试方法和路径进行复现,模拟Bug可能出现的场景,同时让开发检查相关的代码是否存在问题,如果无法复现则进行下一步;
        在后期一周中持续关注研发排查代码情况,同时对出现问题的模块进行重点再次测试或与研发一起针对出现场景制定专项测试测量进行专项测试验证;
        最终,如果Bug始终无法复现,并且研发排查业务代码也无问题,则至少跟踪3个版本后再进行问题闭环。

11、测试发现bug,开发不认为是bug?
        明确开发说不是bug 的理由;
        找到需求文档或者是原型图进行匹对;
        若是环境问题,尝试多种测试环境和多种测试方式来确认是否为bug
        整理bug的复现的步骤和出现的频率
        开发坚持不认为是bug的时候找项目经理测试经理进行沟通来确认是否为bug
        将客户经理 测试 测试经理和项目经理进行开确认会来判定是否为bug
        测试人员需要将bug整理并写入测试总结中

12、BS架构 和 CS架构分别是什么?
        B/S结构:browser/server(浏览器/服务器)
        B/S结构,Web应用程序,即在浏览器下运行的程序为Web应用程序。在浏览器中运行的程序为BS结构的程序。BS应用程序无需在本地存在文件。只需通过浏览器使用url地址访问即可;服务端压力相对较大;
        C/S结构:Client/Server或客户/服务器模式
        C/S结构:Windows应用程序,即除了在浏览器中运行的程序为Windows应用程序。不在浏览器中运行的程序为CS结构的程序。CS应用程序需要在本地下有它的文件。如QQ、微信。相对于BS模式,静态资源、图片等,可以在客户端保存,所以服务器压力相对较少;同时,没网络也可以范围,使用;

13、日志模块在自动化测试中用途是什么?
        用的是logging模块;记录测试行为(把测试过程的每个环节、每个行为都记录下来)、异常信息记录(会把所有的异常信息记录下来)、分析与调优(分析出错的原因是什么);

14、持续集成在自动化测试中起到什么样的用途?
        只要版本有更新,抓取最新版本,自动化部署,触发自动化脚本测试;
        Jenkins的功能
        持续集成搭配自动化测试实现的效果;(自动集成、自动部署、定时任务触发、邮件生成、自动发生报告等;)

15、什么是判定/条件覆盖?
        逻辑覆盖是以程序内部的逻辑结构为基础的设计测试用例的技术。根据覆盖目标的不同和覆盖源程序语句的详尽程度,逻辑覆盖又可分为:1. 语句覆盖(SC);2. 判定覆盖(DC);3. 条件覆盖(CC);4. 条件/判定覆盖(CC);5. 条件组合覆盖(MCC);6. 修正判定条件覆盖(MCDC);7. 点覆盖;8. 边覆盖;9. 路径覆盖;
        判定覆盖要求对每个判定的结果都历经一次,即至少有一个为真,一个为假
        条件覆盖要求对每个条件可能的结果都历经一次,对一个条件的结果至少有一个为真一个为假
        判定/条件覆盖要求判定中每个条件的所有结果都历经一次,判定的所有结果也都历经一次
        语句覆盖:选择足够的测试用例,使程序中的每条语句至少执行一次。所谓足够的指的是越少越好

        六种覆盖方法中,覆盖准则由弱到强依次是语句覆盖、判定覆盖(分支覆盖)、条件覆盖、判定/条件覆盖、条件组合覆盖、路径覆盖。其中,
        语句覆盖是使得程序中每个语句至少被执行一次;
        判定覆盖是使得程序中的每个分支至少都通过一次;
        条件覆盖是使得判定中的每个条件获得各种可能的结果;
        判定/条件覆盖是使得判定中的每个条件取到各种可能的值,并使每个判定取到各种可能的结果;
        条件组合覆盖是使得每个判定中条件的各种可能组合都至少出现一次;
 

16、黑盒测试、白盒测试的测试用例设计方法有哪些?
        黑盒测试用例设计方法包括等价类划分法、边界值分析法、错误推测法、因果图法、判定表驱动法、正交试验设计法、功能图法、场景图法等。
        白盒测试常见的用例设计方法有:代码检查法、静态结构分析法、静态质量度量法、逻辑覆盖法、基本路径覆盖测试法、条件覆盖、分支覆盖、域测试、符号测试。

17、单元测试?
        单元测试是对软件组成进行的测试。其目的是检验软件基本组成单位的正确性。测试对象是软件设计的最小单元:模块,又称为模块测试。 
        测试阶段:编码后或者编码前(TDD) 
        测试对象:最小模块 
        测试人员:白盒测试工程师或开发人员 
        测试依据:代码和注释+设计详细文档 
        测试方法:白盒测试 
        测试内容:模块接口测试、局部数据结构测试、路径测试、错误处理测试、边界测试
        测试策略:逻辑覆盖、循环覆盖、同行评审、桌前检查、代码走查、代码评审、景泰数据流分析

18、动态分析与静态分析?
        动态与静态指的是代码是否处于运行状态;
        动态分析:代码运行结束后。模块功能检查和系统压力测试,必须执行代码后才能分析。
        静态分析:代码运行之前。数据流分析和代码覆盖率,不需要执行代码就可分析。

19、什么是 stub 桩函数?
        桩代码就是用来代替某些代码的代码。就是一个占位置的代码,主要是为了使得机构完整,里面先什么都不写(可以就写个reutn 0),仅仅就占个位置。主要作用:后期可以用来作为中转,跳转,替换。(桩模块:被被测模块调用的模块)

        

20、集成测试之渐增组装测试和非渐增组装测试?
        渐增组装测试,是测完一个再加上一个一起测试。 非渐增组装测试,是一个一个的测试。
        集成测试:测试组件间的接口与交互的测试。

21、α、β、λ测试?
        α、β、λ常用来表示软件测试过程中的三个阶段,α是第一阶段,一般只供内部测试使用;β是第二个阶段,已经消除了软件中大部分的不完善之处,但仍有可能还存在缺陷和漏洞,一般只提供给特定的用户群来测试使用;λ是第三个阶段,此时产品已经相当成熟,只需在个别地方再做进一步的优化处理即可上市发行。
        α:内测;β:公测;
        

22、什么是关键字驱动?
        关键字驱动实质上就是面向对象编程思想的一种体现;基于封装的思想,就是将代码基于业务的使用场景进行封装起来;再基于封装好的方法,通过调用这些方法,从而实现业务的执行。考虑代码的复用性、灵活度等。
        如一个网页;可以把获取页面元件、点击、打开新窗口等所有的行为进行封装起来,如把八大元素定位方式封装起来组成一个;搞成一个工具库;在业务端,只要调用方法即可,不要关注内部实现;如果有多个页面,可以提取页面基类,然后继承这个基类;数据层面,也可以封装起来;如连接数据库、操作数据等;从而把数据层面、页面操作层面、代码业务逻辑层面分离;实现代码的灵活性、复用性。

        

23、黑盒白盒灰盒?
        黑盒测试方法的主要特点是:执行测试的人员并不了解被测软件的内部结构和源代码,是直接与用户界面进行交互,测试其功能,并确保系统的每个输入与输出,均符合既定的标准与要求。因此,黑盒测试也可以被称为功能测试、或基于规范的测试。
        白盒测试方法的目标是对软件的内部结构、及其背后的逻辑进行分析。因此,白盒测试有时也被称为结构测试、或逻辑驱动测试。此类方法不但比较耗时,并且要求测试人员具有强大的编程能力,能够对所测软件进行全面了解,并且可以访问到所有的源代码、以及体系架构的相关文档。否则,测试人员将无法设计出适当的测试用例。因此,白盒测试通常是由专业开发人员去执行的。
        灰盒测试,是介于白盒测试与黑盒测试之间的一种测试,灰盒测试多用于集成测试阶段,不仅关注输出、输入的正确性,同时也关注程序内部的情况。灰盒测试不像白盒那样详细、完整,但又比黑盒测试更关注程序的内部逻辑,常常是通过一些表征性的现象、事件、标志来判断内部的运行状态。
  定义: 灰盒测试由方法和工具组成,这些方法和工具取材于应用程序的内部知识和与之交互的环境,能够用于黑盒测试以增强测试效率、错误发现和错误分析的效率。
  灰盒测试的思想: 是基于程序运行时的外部表现又结合程序内部逻辑结构来设计测试用例,执行程序并采集程序路径执行信息和外部用户接口结果的测试技术。灰盒测试法旨在验证软件满足外部指标以及软件的所有通道或路径都进行了检验。
 

24、什么是软件?
        程序、数据及相关文档的集合。

25、软件测试的目的?
        验证软件是否满足需求文档说明书所规定的软件质量和需求;
        找出软件缺陷;
        为软件产品的质量测量和评价提供依据;
        帮助开发改进开发流程;

26、QA;
        软件质量保证人员;

27、如果提交的bug开发不认可是bug 怎么办?
        先分析开发不认为是bug 的原因;
        如果的确不是缺陷,则以后要注意做测试做好复现,认真了解需求,提高自己的能力;
        如果的确是bug,不修复会有哪些不好的后果? 应该做好复现,找到日志,复现流程、截图;跟开发好好沟通;
        如果开发还是不认可,找到项目经理、产品经理一起沟通。

28、测试的基本流程?
        测试人员进行测试需求分析;(收集各类文档、仔细理解,提出问题 ,功能分解,检查测试点,需求评审)
        测试负责人编写测试计划;(产品概述、工期、测试范围、测试策略、参加测试的人员、任务细分、每周、每月的进度、验收标准等)
        测试人员根据需求分析和测试计划,编写测试用例
        测试人员搭建测试环境、创建测试数据,执行测试用例、提交缺陷报告,跟进缺陷。
        进行测试评估和总结。

29、测试策略?测试范围?
        策略主要指如何进行某项测试; 如:功能测试 、性能测试、兼容性测试、可用性测试易用性测试等;

30、给你一个网站,你如何测试?
        首先,查找需求说明,网站设计等相关文档;
        指定测试计划;确定测试范围,测试策略,一般包括:功能测试、界面测试、性能测试、数据库测试、安全性测试、兼容性测试;
        涉及测试用例:
        功能测试一般包括:
         链接测试:链接是否正确跳转,是否存在空页面和无效页面,是否有不正确的出错信息返回等。
        提交功能的测试:多媒体元素是否可以正确加载和显示。多语言支持是否能够正确显示选择的语言等。
         界面测试一般包括:
         页面是否风格统一,美观;
        页面布局是否合理,重点内容和热点内容是否突出;
        控件是否正常使用;
        对于必须但为安装的空间,是否提供自动下载并安装的功能;
        文字检查
        性能测试一般从以下两个方面考虑:
        压力测试;负载测试;强度测试
        数据库测试要具体决定是否需要开展。数据库一般需要考虑连结性,对数据的存取操作,数据内容的验证等方面。
        安全性测试:1 基本的登录功能的安全检查 2 是否存在溢出错误,导致系统崩溃或者权限泄露 3 相关开发语言的常见安全性问题检查,例如 SQL 注入等。4 如果需要高级的安全性测试,确定获得专业安全公司的帮助,外包测试,或者获取支持
        兼容性测试,根据需求说明的内容,确定支持的平台组合:浏览器的兼容性;操作系统的兼容性;软件平台的兼容性;数据库的兼容性
        开展测试,并记录缺陷。合理的安排调整测试进度,提前获取测试所需的资源,建立管理体系(例如,需求变更、风险、配置、测试文档、缺陷报告、人力资源等内容)。定期评审,对测试进行评估和总结,调整测试的内容。

31、谈薪资?
        直接了当说自己期望;谈钱不伤感情;工资不够,每天都不开心;

32、还有什么问题?
        这个岗位负责的项目是怎样的的?工作内容大概是什么?以及需要的技能有哪些? 华为为什么企业文化叫狼性?你对新人的期待是什么?

33、缺陷产生的原因有哪些?
        需求变更频繁、沟通不良、不了解需求;过分镀金;

34、如何与开发沟通,如何改善沟通效果?
        尽可能面对面沟通;(少用钉钉、email)
        逻辑思路清晰,对bug表达清楚;
        真诚、团队精神,以完成工作为第一目标;

35、测试结束的标准是什么?        
        所有用例执行完毕;
        bug全部改完,未改完的bug也需要和产品经理、项目经理确认过;置为应有状态,如下版本修复,
        测试报告编写完;
        测试工作首尾;
        定义测试结束的标准:没有严重bug,普通bug3个以下;历史bug修复率90%;

36、你认为你做测试的优势在哪里?
        有韧性、有耐心、做事有条理,沟通能力好,能抗压;

37、在项目中如何保证软件质量?
        产品:保证迭代过程中的产品逻辑,对于可能的兼容性做出预判,并给出方案。
        设计:满足产品表达的同时,保证设计的延续性;
        开发:产品细节保证,技术方案要严谨,考虑兼容、性能,开发后自测;严格遵循开发规范
        测试:验证产品逻辑,站在用户角度对交互设计进行系统验证,尽可能多的使用技术手段保证测试质量。

38、APP测试和web测试有什么区别?
        web端测试和移动端测试基本类似;都需要进行功能测试、性能测试、安全测试;主要区别在于web端一般是b/s架构,基于浏览器;APP是c/s架构,有客户端;有APP专项测试。
        从架构看:web端更新服务端,客户端自动同步更新,而APP修改服务端,意味着客户端所有用户使用的核心版本功能都需要回归测试一遍;
        从客户端性能看:web只关注响应时间,APP还需要关心流量、电量、CPU、内存等;
        兼容性方面:web端基于浏览器,倾向于IE、Chrome、Firefox和电脑硬件、系统方面的兼容;APP测试必须依赖手机或pad,需要看分辨率、屏幕尺寸、设备系统;
        APP还有专项测试:安装卸载测试、中断测试、弱网测试等;

     

四、功能测试

1、朋友圈点赞有哪些测试点?
        功能测试
                
点赞后,点赞数+1,点赞栏显示点赞人的人头像
                点赞后,共同好友在点赞区应能看见点赞人
                点赞后,非共同在点赞区不能看见点赞人
                点赞后,通知该用户
                取消点赞,不通知该用户
                第一次点赞,通知该用户,取消点赞,再点赞,不通知该用户
                点赞后,通知该用户和点过赞的用户
                多人同时点赞,点赞数正常
                通过点赞区名字,点击名字进入个人界面
                最多显示多少个赞——边界值
                最多显示多少点赞人的名字——边界值
                点赞是否按时间顺序显示
                点赞后,取消点赞,再点赞,是否按最后点赞时间排序
                点赞前是否能正常评论
                点赞后是否能评论
                反复点赞、取消点赞,功能是否正常
                点赞后,朋友圈时效性测试,如三天可见,则三天过期后是否对其它用户进行屏蔽
                无朋友圈权限用户无法查看朋友圈内容
                允许陌生人查看十条朋友圈内容进行测试
                允许朋友查看朋友圈的范围分别时间维度测试
        APP测试
                弱网测试,弱网情况下点赞是否实时更新
                点赞时,有干扰(电话和短信),是否显示点赞情况
                耗电量和流量是否正常
        性能测试
                大量用户并发点赞,接口的响应时间,最大承受的qps
                大量用户并发点赞,此时界面点赞,功能是否正常
                点赞后是否立即可见;
        兼容性测试
                不同手机型号: 不同厂商(华米OV,apple,三星)
                不同手机版本: 如OPPO r7,r10, Ios 10,12,15等
                不同系统: 安卓,iOS, 鸿蒙
                不同客户端类型: 如电脑端,手机端,平板端等数据是否同步.
        UI测试
                根据UI图显示位置,颜色,图标,字体是否显示正常                
                未点赞时,是否显示灰色
                点赞后,是否图标点亮
                点赞后,点赞人的名字,位置,图标,颜色,字体是否正常
                取消点赞后,头像图标是否消失

2、如何测试一个水杯?
        先问下面试官:这个水杯是做什么用的?有什么要求?
        1.功能:水倒水杯容量的一半、水倒规定的安全线、水倒满且流出来、水杯容量刻度与其他水杯一致、盖子拧紧水倒不出来、烫手验证(用杯装水,能不能喝到)
        2.性能:使用最大次数或时间、掉地上不易损坏、盖子拧到什么程度水倒不出来、保温时间长、杯子的耐热性、杯子的耐寒性、长时间放置水不会漏、杯子上放置重物达到什么程度杯子会被损坏
        3.界面:外观完整、美观、大小与设计一样(高、宽、容量、直径)、拿着舒服、材质与设计一样、杯子上的图案掉落、图案遇水溶解
        4.安全:杯子使用的材质毒或细菌的验证、高温材质释放毒性、低温材质释放毒性
        5.易用性:倒水方便、喝水方便、携带方便、使用简单,容易操作、防滑措施
        6.兼容性:杯子能够容纳果汁、白水、酒精、汽油等。
        7.震动测试:杯子加包装(有填充物),六面震动,检查产品是否能应对铁路/公路/航空运输。
        8.可移植性:杯子在不同地方、温度环境下都可以正常使用。

3、在windows下保存一个文件时会弹出保存对话框,如何为文件名建立测试用例、等价类应该怎么划分?
        分析需求:windows文件名去除盘符最长 255字符,不区分中英文,不能使用特殊字符 *?《》| 等;不允许重名;重名询问是否替换或是附加 1 ;
        有效类:
                25个字符
        无效类:
                空(0字符 )、非法字符,输入超过256个字符;

4、在win7系统中,ie浏览器输入 www.baidu.com,按下回车,1分钟后,显示为空白页;请问有哪些原因导致这个现象?怎么排查?
        关闭浏览器,重新打开,并再次输入网址;
        输入其他网址,看是否能打开;
        更换其他浏览器、如Firefox、Chrome,输入网址;
        重启计算机,重新打开浏览器、输入baidu网址
        更换别的电脑,还是win7系统,重新打开baidu网址;
        尝试其他操作系统,打开baidu网址;
 

5、有一个在线购物网站,分别适配 pc端和微信端 ,针对选择商品,提交订单,支付(默认已登录)这个流程,设计测试用例,想到尽可能的测试点?
        不选择商品,提交订单;
        选择一种商品一件;
        选择一种商品的多件;
        选择不同商品的一件;
        选择多种商品多件,
        选择多种商品,有一件的、有多件的;
        修改商品的件数:
                一件变多件、多件变一件;变为 0 件;
        删除某类商品;
        清空所有商品;
        提交订单、撤销订单;
        提交订单后,付款 (查看订单状态)
        提交订单后,不付款 (查看订单状态)
        分别在pc端、微信端测试上述步骤;查看pc端、微信端数据是否同步; 

五、性能测试

1、性能测试的流程是怎样的?
        性能需求分析(定义完整的性能指标,同步设计性能场景,如广播1次、群推9次,单推90次;) -》测试环境准备(初期的系统数据准备,应用到的组件等) -》编写测试脚本(locust、pytest) -》测试脚本执行 -》判断性能指标是否满足(调整代码,再执行) -》性能诊断 -》输出性能报告 -》提出优化建议
        
        如:我们的系统,早上9点-11点是使用高峰期;单推90%,群推9%,广播1%;


2、性能测试的工具有哪些?
       主流工具: Jmeter、loadrunner、pytest、locust;Jmeter跑线程,locust跑协程。
        1、以公司的目标选择工具,满足业务需求;方便当下,也方便后来人维护;2、选择主流的工具,开源免费、大家都会,有问题方便找错;支持分布式部署(如locust,一台机器并发量少,不能测出服务器的性能,可以分布式部署,就可以通过多台机器同时对服务器进行并发);3、自己熟悉的;
       性能检测平台:

3、性能诊断是如何进行的?
        诊断包括:问题的分析和定位;
        一方面,分析带宽、网络延迟、吞吐量、事务处理能力、并发数、响应时间、CPU、内存等;深层次,关注消息队列的响应时间、数据库的响应、架构、代码、Redis响应等;
        架构的熟悉:
        中间件的熟悉:
        系统交互的熟悉:
        操作系统的熟悉:
        查看生命周期,了解在

4、测试过程中,发现响应时间太长了,该怎么进行下一步分析?
        先检查网络:看网络状况是否正常,是否有网络丢包等现象。
        再检查服务:查看服务器日志是否有错误;检查服务器资源使用情况是否正常,load average、CPU使用率(尤其是单核CPU)是否有飙高现象、磁盘IO压力情况等等;
        如果不能通过以上检查发现问题所在,那就要逐步分析是系统架构中哪个环节导致的问题。
        连接数检查,应用层连接数设置过小,会导致响应时间长,tps上不去,查看产品内部监控,典型业务调用的处理时间、慢操作日志监控,那就比较方便;
        数据库层排查
        

5、你做过哪些性能测试?
        做压力测试;了解系统处理消息推送接口的能力的极限;

6、移动端性能  耗电量  测试?
        第一种基于android提供的PowerManager.WakeLock来进行;
        第二种通过 adb shell dumpsys batterystates 来获取。
                测试前后获取电量数据以前的准备动作:
                每次正常的测试前、后获取电量;(粗略测试)

//enable全部wakelock信息。默认情况下,android系统不会记录特定应用的wakelock变化,为了依照时间顺序,展示各个 wakelock的详细信息,需要先执行命令:
adb shell dumpsys batterystats --enable full-wake-history
//重置电池数据。
adb shell dumpsys batterystats --reset
--测试完成后,取出记录的耗电量数据。
//SDK => 24机型
adb bugreport   D:\bugreport\bugreport.zip

        第三种:细测:如何测试Android APP的耗电量?_小赖同学啊的博客-CSDN博客_android app耗电量
 

7、性能测试场景怎么设计?
        

8、jmeter常用函数有哪些?
        threadnum:获取线程号
        machineIP:获取本地机器ip
        time:获取当前时间
        log:记录日志信息
        counter:生成递增数
        digest:生成摘要
        random:规定范围内生产随机数(模拟用户)
 

9、性能测试中,tps 比较低,可能是哪些方面的问题?
        压力机本身性能瓶颈;
        网络io瓶颈;
        中间件(Tomcat/Nginx/mysql)链接数限制;
        java线程阻塞、等待;
        本身系统的资源瓶颈(cpu、内存、网络)
        其他外部系统响应时间国产,造成本系统的time-wait
        

六、APP自动化

        使用appium,90%以上的操作更selenium一致。
1、如何自动化测试微信公众号和小程序?
         小程序的本质还是 H5 ;
        不管是微信App还是QQ内置的浏览器,他们的内核并不是采用Android原生的WebView,而是他们自家开发的 X5 WebView 内核。当我们需要开展微信小程序或者微信H5页面的自动化测试时,我们需要进行一些相关设置,切换到系统WebView内核中,这样才能有效的识别获取到App控制元素信息。
        输入 debugtbs.qq.com,点击进入TBS调试页面,再点击页面内的“安装线上内核”;
        安装成功后,我们需要重启微信才可以生效;再次进去刚才的TBS调试页面,检查我们的设置是否生效,点击“查看版本信息”,版本信息为 0(null) 则设置成功:
        通过上述设置操作后,即可切换到系统WebView内核中,这样再利用Appium或者Airtest测试工具做App UI自动化时,就能正常的获取到微信小程序或者微信公众号菜单中H5页面元素了。

2、如何实现webview的切换?如何获取webview中的元素?
        目前app基本都是混合型的,有原生的native_app,也有webview,使用appium测试的时候,遇到webview的时候需要切换上下文,切换后就可以使用css、id等元素定位方式定位;
        获取app的上下文
                self.driver.context 获取当前窗口的context,返回的是list
        切换webview:
                self.driver.switch_to.context("xxx")切换到对应的webview
        判断是否是webview:
                使用uiaumator的时候class:会包含webview/view,如android.webkit.WebView
                使用self.driver.context/self.driver.contexts获取的context包含如:WEBVIEW_com.xxx等
        如何从webview切换到原生app:
                self.driver.switch_to.context("NATIVE_APP")

 def get_webview(self,webname):
         webviews=self.driver.contexts
         for web in webviews:
             if webname in web:
                 return webname
     def swich_webview(self):
         self.driver.switch_to.context(self.get_webview("xxxx"))
         #切换后可以使用css方式定位
         self.driver.find_element_by_css_selector()

3、如何多设备集群管理?

4、APP自动化测试如何实现?
        主流app自动化测试技术应用:appium、airtest、uiautomator2;appium也是基于selenium的,大同小异;
        比较少公司会做;APP端自动化测试不是很成熟,也不推荐用;因为效率慢;运行效率低;因为很多APP都hybridAPP,混合的开发模式,会有很多webview在里面,webview切换效率低下;
        APP自动化测试缺点:效率慢,webview切换效率低;

5、自动化测试发现的bug多么?
        不多,自动化的作用是做回归测试,95%以上的bug 都是通过手动、功能测试发现的;通常只有需要并发的、大量的、重复性的转为自动化测试;

七、网络基础

1、七层模型:自底向上:
        物理层:确保原始的数据可在各种物理媒体上传输。重要的设备名称,中继器(Repeater,也叫放大器,放大传输信号)
        数据链路层:将源自网络层来的数据可靠地传输到相邻节点的目标机网络层(为网络层提供可靠的数据传输)。作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。
        网络层:实现两个端系统之间的数据透明传送,具体功能包括寻址和路由选择、连接的建立、保持和终止等。作用是:“路径选择、路由及逻辑寻址”。 网络层负责对子网间的数据包进行路由选择。此外,网络层还可以实现拥塞控制、网际互连等功能; 基本数据单位为IP数据报;主要协议有:IP协议、ARP、RARP协议;
        传输层:第一个端到端,即主机到主机的层次。网络层只是根据网络地址将源结点发出的数据包传送到目的结点,而传输层则负责将数据可靠地传送到相应的端口。在这一层,信息传送的协议数据单元称为段或报文。传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输以及端到端的差错控制和流量控制问题; 包含的主要协议:TCP协议(Transmission Control Protocol,传输控制协议)、UDP协议(User Datagram Protocol,用户数据报协议);
        
会话层:管理主机之间的会话进程,即负责建立、管理、终止进程之间的会话。会话层还利用在数据中插入校验点来实现数据的同步。
        表示层:对上层数据或信息进行变换以保证一个主机应用层信息可以被另一个主机的应用程序理解。表示层的数据转换包括数据的加密、压缩、格式转换等。        
        应用层:为操作系统或网络应用程序提供访问网络服务的接口。包含的主要协议:FTP(文件传送协议)、Telnet(远程登录协议)、DNS(域名解析协议)、SMTP(邮件传送协议),POP3协议(邮局协议),HTTP协议(Hyper Text Transfer Protocol)。

        

2、子网掩码?
|  子网掩码是标志两个IP地址是否同属于一个子网的,也是32位二进制地址,其每一个为1代表该位是网络位,为0代表主机位。如果两个IP地址在子网掩码的按位与的计算下所得结果相同,即表明它们共属于同一子网中。如某B类IP地址为 10.12.3.0,无须再分割子网,则该IP地址的子网掩码255.255.0.0。如果它是一个C类地址,则其子网掩码为 255.255.255.0。全1本网络地址和 全0广播地址,一般是不能被计算在内的。

3、ARP/RARP协议?
         地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。
        逆地址解析协议,即RARP,功能和ARP协议相对,其将局域网中某个主机的物理地址转换为IP地址,

4、 路由选择协议?
  常见的路由选择协议有:RIP协议、OSPF协议。(15跳,最短路径优先)
  RIP协议 :底层是贝尔曼福特算法,它选择路由的度量标准(metric)是跳数,最大跳数是15跳,如果大于15跳,它就会丢弃数据包。
  OSPF协议 :Open Shortest Path First开放式最短路径优先,底层是迪杰斯特拉算法,是链路状态路由选择协议,它选择路由的度量标准是带宽,延迟。

5、TCP/IP协议
  由网络层的IP协议和传输层的TCP协议组成。通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址。

  IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是否按顺序发送的或者有没有被破坏,IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。

   TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯。TCP提供的是一种可靠的数据流服务,采用“带重传的肯定确认”技术来实现传输的可靠性。TCP还采用一种称为“滑动窗口”的方式进行流量控制,所谓窗口实际表示接收能力,用以限制发送方的发送速度。

        TCP/IP传输协议是严格来说是一个四层的体系结构,应用层、传输层、网络层和数据链路层都包含其中。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。

6、TCP协议的三次握手和四次挥手?
        第一次握手:客户端发送syn包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。

7、 为什么要三次握手?       
        原因1:主要是为了防止已经失效的连接请求报文突然又传送到了服务器,从而导致不必要的错误和资源的浪费。
        如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送的第一个请求连接并且没有丢失,只是因为在网络中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时之前滞留的那一次请求连接,因为网络通畅了, 到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。
        原因2: 两次握手只能保证单向连接是畅通的。因为TCP是一个双向传输协议,只有经过第三次握手,才能确保双向都可以接收到对方的发送的数据。
 

8、udp协议?
        UDP用户数据报协议,是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象,实际应用中要求程序员编程验证。UDP与TCP位于同一层,但它不管数据包的顺序、错误或重发。使用UDP协议包括:TFTP(简单文件传输协议)、SNMP(简单网络管理协议)、DNS(域名解析协议)、NFS、BOOTP。

  TCP  UDP 的区别:TCP是面向连接的,可靠的字节流服务;UDP是面向无连接的,不可靠的数据报服务。基于流发送意思是数据是没有长度限制,它可源源不断地从通讯的一段流入另一端。基于数据报的服务: 这是相对于数据流而言的,每个UDP数据报都有一个长度,接收端必须以该长度为最小单位将其内容一次性读出,否则数据将被截断。

9、DNS协议?
        DNS是域名系统(DomainNameSystem)的缩写,该系统用于命名组织到域层次结构中的计算机和网络服务,可以简单地理解为将URL转换为IP地址

10、DHCP协议?
  DHCP动态主机设置协议(Dynamic Host Configuration Protocol)是一个局域网的网络协议,使用UDP协议工作,主要有两个用途:给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段。

八、技术类

1、查询性别为女的,第 100-110条记录,给出sql语句;
        select * from ( select rownum num,id,name,sex from user where sex='F') where num between 100 and 110 ;
        加上一个行号  rownum  ,然后在指定行号范围;

                

2、Linux常用命令?
        top:查看进程信息;CPU、内存密集使用的动态数据
        free:查看内存的使用情况;
        du:查看目录或文件大小
        df:查看磁盘分区大小;
        cd:切换目录
        ls:查看目录中的内容
        cat:查看文件数据
        vi:编辑
        rm:删除目录或文件
        mkdir:创建目录
        touch:如果文件不存在,则创建;存在,则修改文件最后访问时间;
        netstat -tulpn | grep java  找java线程及端口
        history 显示历史输入的命令
        ps -ef|grep tomcat-   查看tomcat线程
        Kill -9 线程数  杀死tomcat对应的线程

3、同步异步?
        同步:执行一个操作时,需要等待其完成,然后再进行下一个操作;
        异步:执行一个操作时,不需要等待返回,就可以进行下一个操作;一般需要使用消息中间件。

4、Linux系统中的buffer 和 cache都起到什么作用?内存占用大量的buffer 和cache是异常情况么?
        Buffer 缓冲区:  是块设备的读写缓冲区,buffer 是I/O 缓存,用于内存和硬盘(或其他 I/O设备)之间的数据交换的速度而设计的。
         Cache高速缓存 :cache是高速缓存,用于cpu与内存之间的缓冲。主要原因是cpu与memory,由于cpu快,memory跟不上,且有些值使用次数多,所以放入cache中,主要目的是,使用内存来缓存可能被再次访问的数据。  Cache 经常被使用在I/O 请求上。为提高系统性能。



4、多态?
        多态是指同一个行为具有不同表现形式的能力;在代码层面,多态指的是父类引用指向子类对象。
        如:父类 animal、子类:dog、子类cat;
        Animal  a1 = new dog();
        Animal  a2 = new cat();
        多态的三个前提:要有继承关系、子类要重写父类方法、父类引用指向子类。
        优点:提高程序的拓展性;

5、java的反射是什么?应用场景有哪些?
        反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种获取信息以及动态调用对象的方法的功能称为java语言的反射机制。
        获取class对象的三种方式:
        对象的getClass方法; object.getClass()
        类的class属性:object.class
        class类的forName方法(最常用)
        可获取的数据:属性、方法、构造方法、方法注解等
        主要应用参加:基础框架的开发

6、ArrayList 和 linkedList 有什么区别?
        ArrayList:底层数据结构为数组,可以自动扩容,特点是查询快,增删慢;类似C++的vector
        linkedList:底层结构为双向链表,特点是增删快,查询慢;类似C++的list

7、数据库悲观锁、乐观锁区别?
        悲观锁与乐观锁是人们定义出来的概念,你可以理解为一种思想,是处理并发资源的常用手段。
        悲观锁:顾名思义,就是对于数据的处理持悲观态度,总认为会发生并发冲突,获取和修改数据时,别人会修改数据。所以在整个数据处理过程中,需要将数据锁定。悲观锁的实现,通常依靠数据库提供的锁机制实现;注意,使用悲观锁,需要关闭mysql的自动提交功能,数据提交需要手动提交;因此要将 set autocommit = 0;悲观锁在并发控制上采取的是先上锁然后再处理数据的保守策略,虽然保证了数据处理的安全性,但也降低了效率。
        乐观锁:
顾名思义,就是对数据的处理持乐观态度,乐观的认为数据一般情况下不会发生冲突,只有提交数据更新时,才会对数据是否冲突进行检测。
        乐观锁的实现不依靠数据库提供的锁机制,需要我们自已实现,实现方式一般是记录数据版本,一种是通过版本号,一种是通过时间戳。给表加一个版本号或时间戳的字段,读取数据时,将版本号一同读出,数据更新时,将版本号加1。当我们提交数据更新时,判断当前的版本号与第一次读取出来的版本号是否相等。如果相等,则予以更新,否则认为数据过期,拒绝更新,让用户重新操作。

8、string、stringBuffer、StringBuilder 区别?
        string 是字符串常量;
        stringBuffer 是字符串变量;是非线程安全的,适合单线程处理字符串;
        StringBuilder是字符串变量;线程安全的,适合多线程处理字符串;

9、git常用命令;
        clone :        克隆指定仓库
        add :        将文件添加到暂存区
        commit :         将文件提交到服务器
        push:        将文件提交到远程仓库
        status :        查看当前仓库状态
        diff :        比较版本的区别
        log :        查看git 的操作日志
        reset :        回溯历史版本
        checkout :        切换到指定分支;
        可以用sourcetree软件,完成所有的文档更新操作


10、python 对字典dict={'a':1, 'b':3, 'c':2, 'd':5, 'e':4}  ,按照字典中的value值进行排序;

 

11、什么是装饰器?有哪些应用场景?

12、python中match 和 search 的区别?
        match()和search()两者都是测试正则表达式与字符串是否匹配。不同的是,match() 如果在字符串的开头有0个或更多个字符,符合正则表达式模式,返回相关匹配的实例对象,如果字符串不符合正则表达式模式则返回None;而search()则不同,扫描整个字符串,如果产生了一个匹配正则模式就寻找到这个位置,返回相关匹配的对象。如果没有位置能够匹配这个模式则返回None。

import re
str = '谢谢您,关注我!!';
result = re.match('关注我', str)#rp:match
print(result)
result2 = re.match('谢谢您', str)#rp:match
print(result2)
result3 = re.search('关注我', str)#rp:search
print(result3)
result4 = re.search('谢谢您', str)#rp:search
print(result4)
result5 = re.search('谢谢您啊', str)#rp:search
print(result5)


None



None

13、对python生成器和迭代器的理解?
        python三大器:(装饰器、生成器、迭代器)

14、有语数英三门功课;字段为name 、course、score ;用一条语句查询出每门功课分数都大于80分的学生姓名; 表名为 scores 。
        select name,min(score) from  scores group by name having min(score) > 80;

15、ORM及其优缺点?
        ORM的全称是:Object Relational Mapping (对象 关系 映射)简单的说,orm是通过使用描述对象和数据之间映射的元数据,将程序中的对象自动持久化到关系数据库中。作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了 。
        优点:orm的技术特点,提高了开发效率。可以自动对实体Entity对象与数据库中的Table进行字段与属性的映射;不用直接SQL编码,能够像操作对象一样从数据库中获取数据
        缺点:orm会牺牲程序的执行效率和会固定思维模式,在从系统结构上来看,采用orm的系统多是多层系统的,系统的层次太多,效率就会降低,orm是一种完全面向对象的做法,所以面向对象的做法也会对性能产生一定的影响。
        常见的hibernate就是ORM模型;

16、什么是事务?具有哪些特性?
        事务就是用户定义的一系列数据库操作,这些操作可以视为一个完成的逻辑处理工作单元,要么全部执行,要么全部不执行,是不可分割的工作单元。
        事务的产生:
        数据库中的数据是共享资源,因此数据库系统通常要支持多个用户的或不同应用程序的访问,并且各个访问进程都是独立执行的,这样就有可能出现并发存取数据的现象,有点类似多线程安全问题,如果不采取一定措施会出现数据异常的情况。DBMS系统必须对这种并发操作提供一种相应的处理机制来保证,访问彼此之间不受任何干扰,从而保证数据库的正确性不受到破坏,为了避免数据库的不一致性,这种处理机制称之为“并发控制”,其中事务就是为了保证数据的一致性而产生的一种概念和手段
        事务有四大特性:
              1.原子性 事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。
              2.一致性 事务开始前和结束后,数据库的完整性约束没有被破坏 。
              3.持久性 事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
              4. 隔离性 同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰

17、数据库的 delete、drop、truncate的区别?

18、数据库连接方式有几种?区别在哪?
        inner join内连接:只有两个元素表匹配的才能在结果集中显示;
        left join左外连:左边为主表的数据全部显示,右边匹配表的不匹配部分不显示;
        right join 右外连: 与左外连恰好相反;
        cross join交叉连接:笛卡尔积,显示结果的链接表数的乘积;
        natural join自然连接:也叫全外连接;自然连接是一种特殊的等值连接。自然连接在结果中把重复的行和重复的属性列去掉。
        

未完待续。。。。

你可能感兴趣的:(测试概念,功能测试)