• 多测师讲解 _面试题归纳(2)_高级讲师肖sir


    1、自我介绍

    面试官您好,我叫xx,来自xx。毕业后一直从事软件测试工作,工作期间有测过web端和app端,刚开始的时候主要做的是功能测试,现在也有做一些接口、自动化,也有涉及到性能测试的部分。

    像在上一家公司,是做的一个web端的电商项目,(名字叫做众安保险,这个项目前台(web)一共有四个大的模块:首页、购物车、消息、我的)。在这个项目中我主要负责的是投保这个模块,就涉及到了功能和自动化的工作,当然也兼顾了接口测试的部分。

    其次对mysql数据库和linux的常用操作比较熟悉。

    这边是我个人的一些基本情况,您看一下是否有其他的信息需要了解。

    (基本信息、做过什么项目、上家公司职责总结、自我技能补充完善)

    2、测试流程、项目流程、项目开发流程、研发流程:H模型

    好的,我这里讲一下我在上一家公司的项目流程:

    (需求阶段--设计阶段--执行阶段--收尾阶段)

    1、接到一个新的需求后,产品会将项目组的相关人员集合在一起进行需求评审,主要是对各个模块的需求以及要求和注意点进行串讲

    2、需求评审之后,我们老大就会输出测试计划,然后我们就会根据测试计划写测试用例,测试用例写完后我们会进行用例评审,用例评审完成后,开发同事的代码也编写完成

    3、开发将代码包给我们之后,我们就会发包部署

    4、然后就是提测,首先进行冒烟测试,冒烟测试通过后我们会进行全面的SIT测试,测试过程中我们会发现bug,需及时提交到bug管理工具中,并进行跟进,以便后续完成bug的回归测试

    5、测试完成后,准备输出相关的测试报告和数据,准备上线

    6、产品验收上线后,要留意上线后的运行情况

    3、需求

    需求谁提供的,来源:产品对接客户,来源于客户,来源于产品

    有没有参加过需求评审:有

    需求评审参加的人员:开发、测试、产品、(运维,相应的模块负责人)、

    问题1:需求评审流程

    1、评审前会收到信息,一般是邮件通知,包含时间地点评审的内容参与人员

    2、评审的时候产品会针对这份需求,讲解业务和功能点,提出重点,我们也可以现场提出我们不明白的地方,后续会进行跟进

    3、评审后会有一份会议总结邮件给到参会人员,总结这次会议解决了什么问题,还有什么问题需要解决等

    问题2:如何分析需求

    1、首先将需求整体的过一遍,有一个大概的认知

    2、再用思维导图Xmind工具梳理需求,梳理出我所负责的模块的业务点、与其对应的功能点,相应地提取出模块中显性、隐形、相关联的,以及一些特殊的需求,进行标注

    3、之后从需求的可行性,释义是否清晰、完整等这些方面进行分析,如果有遇到不明确的或者觉得有疑问的需求,将其罗列出来

    4、还有对于我负责的模块与其他同事负责的相关联的地方,也会进行梳理标注,保留遇到的问题,在需求澄清会上提出

    5、需求中涉及的项目配置,人员配置时间合不合理、功能分几个迭代完成、版本发布时间合不合理,硬件配置、软件配置有没有达到要求

    以上就是我对需求分析的大概说明,谢谢

    问题3:负责需求,如何展开工作:(从需求到我手里直到功能上线)需求上线的几个环节分别需要做什么

    1、需求阶段:需求存在的问题,标注跟进直到需求澄清

    2、设计阶段:需要写好测试计划,并且完成计划的评审工作,后续按照计划完成任务

    3、用例+执行阶段:根据需求用思维导图提炼测试点,通过评审查漏补缺,根据测试点编写测试用例,确定合适的模板、采用合适的用例设计方法,保证用例的覆盖率,用例写完之后完成用例的评审工作。按照评审过的用例执行,记录执行过程中遇到的bug,及时跟进bug 的修复解决,及时补充漏掉的场景,维护更新用例

    4、上线阶段:严格按照公司的上线原则来(测试准出)用例执行100%、BUG全部为零、所有功能都正常、提交测试报告

    4、测试计划

    问题1:测试计划包含内容

    1、简介 (目的、背景、范围) 范围:即项目分为哪几个模块

    2、测试约束 (测试准入、测试准出)

    测试准入:

    a、开发编写代码完成且完成自测(输出自测报告)

    b、所有功能均已实现

    c、项目包部署完成

    d、用例编写完成且通过用例评审

    测试准出:

    a、用例执行100%

    b、BUG全部为零

    c、所有功能都正常

    d、提交测试报告

    3、资源与环境 (人力资源配置、测试环境配置)

    电脑、手机、测试人员等测试资源,脚本(代码)

    4、测试任务与进度 

    进度根据全量用例来权衡(用例执行的进度)

    5、风险及风险管理 (对有可能因为测试不到位的地方打预防针)

    影响项目质量和进度的都是风险

    6、测试交付文档(用例、小结报告、总结报告等)

    小结报告就是每轮SIT测试阶段的一个小总结

    7、测试阶段(冒烟测试阶段,SIT测试阶段,回归测试阶段)

    问题2:写好测试计划,内容+着重关注

    1、首先测试计划的内容要包含到位,要涵盖以下几个方面:

    ①简介:包含项目的背景、目的和范围;②测试约束:包含测试准入和准出;③资源与环境:包含人力资源配置与测试环境配置;④测试任务与进度;⑤风险评估;⑥测试交付文档;⑦测试阶段;

    2、其次我认为写好一份测试计划要着重关注这些方面:

    ①资源与环境,因为我们需要将测试过程中所需要的硬件与环境配置提前准备好,提高后续测试的效率;

    ②测试任务与进度:因为测试任务与进度包含:测试准备、测试设计、测试执行和测试收尾四过程,我们需要合理分配每个过程的时间,严格控制每个过程完成的情况以及进度,以保证项目能准时交付;

    ③风险评估:因为一个项目中可能会因为硬件或者测试环境等其他因素导致产品不能及时交付,我们需要准备好这些突发情况的解决办法,提前打个预防针

    问题3:测试计划和测试方案的区别

    测试计划:属于组织管理层面的文档,从组织管理的角度对测试活动进行规划;

    测试方案:属于技术层面的文档,从技术的角度对测试活动进行规划。  

    测试计划:对测试全过程的组织、资源、原则等进行规定和约束,并制定各阶段的任务分配以及时间进度安排,以及提出对各项任务的评估,风险分析和管理需求。

    测试方案:是对测试方法,测试工具的设计和选择,测试用例设计方法等的描述

    测试方案需要在测试计划的指导下进行,测试计划提出“做什么”,而测试方案明确“如何做”

    问题4:一个需求,两周后要上线,各个阶段花多久,时间怎么安排

    两周的版本的话,首先测试计划的编写我们可以建立在确定环境和人员配置齐全的前提下,以此为基础来编写,两周呢,这里我们可以按10个工作日来算,主要就是测试任务和进度这一部分的时间安排,我一般是按3个阶段来划分,分别是需求阶段、用例设计阶段和执行阶段,这里10个工作日可分配为需求阶段用3天,因为我们的测试用例是建立在对需求了解透彻的基础上编写的,因此需求阶段给到充分时间了解,会有助于提高测试用例编写的效率与质量,然后可以有3天的时间来编写和评审用例,再一个3-4天左右的时间来对用例进行执行,剩下的时间上线、输出测试小结、测试总结等。这大概就是我对任务的一个时间安排

    5、用例

    问题1:结合具体场景讲用例设计方法

    等价类、边界值、判定表、因果图、场景法、状态迁移图、错误推测法、正交实验法

    常用的用例设计方法的话,这里我说一下我最常用的两种吧,等价类和边界值这两类用例的设计方法,是我在编写测试用例的时候经常会用到的,这里以我上一个电商项目中的购物车模块功能说一下,像这个模块里添加商品数量最多为120件,最少为0件,这里用等价类的设计方法来编写测试用例的话,就可以从添加0、60、120这三个数量的产品到购物车来编写测试用例,因为这里牵涉到的数量可能性有很多,我们可以通过等价类这种方式进行规则筛选。再用边界值的设计方法进行补充,边界值,顾名思义,可以从规则中给到的0-120这两个数额的边界去考虑,进而添加1、119、121购物数量的测试用例

    问题2:用例模板、用例包含哪些信息

    先前我们写的测试用例,是统一用的公司给的一个模板,其中包含用例编号、所属模块、用例标题、前置条件、测试步骤、预期结果和优先级等这些

    问题3:你们项目写了多少用例

    主要是看项目本身的复杂程度,受需求大小的影响,我上个项目的话具体的还真不知道多少,没有统计过,大概3000左右

    问题4:如何保证用例的覆盖率

    用例覆盖率这一点的话

    1、首先因为测试用例是建立在需求上的,所以最开始要严格评审需求,确保、明确相关设计文档、需求文档没有缺陷,里面的问题得到了解决,对需求分析透彻,保证业务点的覆盖率,进而保证用例的覆盖率

    2、有了从需求出发这一点之后,就是具体的用例的编写,针对不同的需求,需要我们灵活转换用例编写的设计方法,根据不同的功能点,采用适用的设计方法,再从功能性、易用性、兼容性、安全性等这些角度去编写测试用例

    3、还有最后一点,就是根据需求的变更,及时更新用例,去除无用的用例,填充新用例来保证用例的覆盖率

    1、确保文档没有缺陷

    2、澄清后的文档,罗列功能,提炼测试点,完成测试点评审,通过评审找出测试点里面的不足

    3、评审通过的测试点进行用例编写,注意用例的编写规范

    4、用例评审,通过评审查漏补缺

    5、执行,增加新的用例,删除无用的用例)

    问题5:用例评审流程,前中后

    通知:可能是测试也可能是测试经理发的

    评审前:抄送邮件,内容时间地点,针对模块

    评审时:本人主讲,解释说明,写了多少个,大概分哪几个模块,输出的思路,从哪些角度写的,遇到的问题提出,现场的人也可以对我提问。(测试人员会对自身编写的用例进行一个说明,讲解的内容会囊括用例整体的排版布局,从功能点的先后顺序,延伸到不同模块对应的测试用例,根据用例数量顺序进行解说,讲解编写测试用例时从哪些角度出发去考虑,让其他组员提出建议,降低漏测概率,当然在评审过程中,我们测试人员也会提出自身的疑问)

    评审后:主要针对存在的问题进行整理、更新用例,或者需要二次评审的进行二次评审,不需要则总结用例评审会议内容,发邮件告知对应负责人

    问题6:保证高效用例执行效率,推动能力

    ①用例谁写的谁执行

    ②提前做好用例筛选工作,筛选针对当前版本的用例,分类准备好

    ③申请准备好测试数据和权限的开通,减少时间

    ④执行过程中严格记录执行进度,明确已执行的用例和未执行的用例

    6、BUG、缺陷

    问题1:bug流程

    在上一家公司,我们对缺陷的一个跟踪流程就是,我们测试这边提交bug给到我们的测试经理,老大那边会对我们提交的bug进行一个规范审核,审核通过后会给到开发经理,开发经理会根据对应的bug,再分配给到相关负责的开发进行修复,然后等开发修复后,会返回给到我们测试这边进行一个复测,大概就是这样的一个流程

    问题2:bug包含哪些信息

    在原先公司我们测试这边提交bug,是有明确规定所应包含的一些字段的,有bug的标题、重现步骤,当然重现步骤里会有实际结果和期望结果,还有就是bug严重程度、优先级、所属版本和所属模块的一个标明

    问题3:当你提的bug,开发不认可

    1、先排一下Bug是不是因为权限不够、网络等外在因素

    2、结合需求跟产品对接,是否做出当前的效果,再次进行确认

    3、测试这边将bug进行一个重现,和将bug出现时的截图给到开发进行说明,询问一下开发不认可bug的原因,再根据开发不认可的原因再次进行验证,对需求进一步地分析,如果像开发所说的不是bug,而是我自身对需求存在误解,当然就将bug关闭,再跟开发说明一下是我自身的原因理解不到位,希望能谅解;但是如果在我进一步验证之后,还是不像开发所说的那样话,我会选择激活bug

    4、再存在争论的话,可能就会向测试经理和开发经理说明一下情况,再进行讨论看一下后续的处理事项

    问题4:测试过程中印象深刻的bug

    1、在原先的工作中,我印象比较深的一个bug就是跟session值相关的,session我们知道就是保持一个会话的状态,形象地说,就是用于上下文管理的;当时是在登录的时候,通过输入用户密码进行登录,在登录成功之后进到一个新的页面,在新的页面可以进行一系列操作,但是就是在刷新页面,或通过按钮实现了跳转到其他页面的时候,需要再次进行登录;那时候对bug的定位就是考虑到是否是session值丢失,没能对其进行一个保存,致使其需要进行二次登录的操作,后来在开发那里也是得到了验证,确实是因为session的丢失导致的

    2、印象深刻的问题是在购物车已经下单了,原本已下单的产品会消失不再存在在购物车中,但是提交后还是存在在购物车中

    解决方法:先进行刷新,排除是因为没有刷新的原因。

    刷新之后依然存在则需要开发重写判断顺序/逻辑,应该在提交以后,要做个移除的动作

    3、购物车中缺货的产品依然可以被勾选,进行结算

    解决方法:开发重写代码,进行逻辑判定

    4、未登录时点击购物车,页面跳转至登录界面,完成登录之后,页面本该直接跳转至购物车,但是在登录之后页面跳转至首页

    解决方法:

    问题5:排查bug方法

    前台bug:通常是功能、界面和兼容性等有关,前台bug定位F12在console中查看报错信息

    后台bug:与逻辑、性能和安全性有关等问题,后台bug定位查看报错日志,通过日志分析,查数据库等

    查看日志文件

    先进入到日志文件路径

    cd /data/bizdata

    然后打开日志内容

    tail -f XXX.csv |grep 110   打开名为xxx的日志文件,实时查看日志结果,其中通过grep筛选包括只包含110的字段)

    例如:http请求中的参数是否正确,如果http请求中的参数不正确,为前端Bug,如果接口URL和参数都正确,查看响应内容是否正确,如果这种情况下响应内容不正确,则为后端Bug

    web测试定位Bug的方法

    通过抓包工具来进行抓包分析。

    大多数的浏览器都有自带的抓包插件,F12开启抓包后,在NetWork中可以看到当前页面发送的每一个http请求。通常情况下,我们可以通过请求接口、传参和响应三部分来判断Bug

    1)请求接口URL是否正确,如果请求接口URL不正确,为前端Bug;

    2)http请求中的参数是否正确,如果http请求中的参数不正确,为前端Bug;

    3)如果接口URL和参数都正确,查看响应内容是否正确,如果这种情况下响应内容不正确,则为后端Bug。

    4)如果JS基础比较好的话,也可以在浏览器的控制台中输入JS代码进行调试

    定位后端Bug

    1)查看报错日志

    查看报错日志,通过日志分析,需要有一定的经验,并且有一定的代码基础,才能更好地定位问题。

    2)查看数据库的数据

    了解所测功能的数据表结构,测试过程中,查看数据库的数据,确认数据的正确性。

    问题6:处理偶现bug

    1、遇到bug及时记录相关信息,我个人习惯将bug的截图、操作步骤、所使用的数据、错误日志及时保存下来

    2、根据记录的数据逐步排查验证,尽量保证环境与先前出现bug的环境一致,数据和步骤也要一致,想办法重现bug

    3、既然是偶现bug,可以申请帮助。将bug相关数据、操作发给项目组同事,让他们帮忙操作下看能否重现

    4、若进行上面的操作都没实现这个bug的重现,则需要将偶现bug通过邮件的方式知会项目组其他同事,后续若遇到可以有所知悉

    问题7:项目要上线了,还有bug未解决

    1、先把未解决的bug按照优先级整理出来,督促开发按严重程度、优先级尽可能去修复

    2、将未修复的bug及时整理出来抄送给相关负责人和同事

    3、未解决的情况下一定要跟项目负责人确认bug未解决是否可以上线

    7、上线

    问题1:测试人员上线时做什么

    有参与过的,一般都是晚上

    测试人员做什么:对自己负责的模块进行验证

    上线前:

    1、准备好所有的交付文档进行提交(测试小结,测试用例,测试报告等)

    2、统计好各个模块负责人的联系方式,并邮件通知上线时间

    3、提前申请线上测试环境的权限

    上线时:

    1、及时验证自己所负责模块的核心功能和重要场景是否都能正常运行

    2、配合相关人员,确保上线顺利

    3、测试完成后及时将生产环境上的测试数据清理掉

    上线后:

    1、时刻留意线上产品运行的情况,有问题及时跟进,及时记录,及时处理

    2、总结此次上线,整理相关问题,为后续发布新版本提供一定的参考

    问题2:测试报告包含

    我们只需提交测试结果,负责人会出一个测试报告

    测试报告包含:

    1、概述:项目背景、需求描述

    2、测试过程:测试范围、测试用例、评审记录

    3、功能实现清单:罗列出是否已经按照测试计划实现功能

    4、测试统计:资源统计、执行情况、问题统计、遗留问题

    5、测试总结:测试结论、测试内容(用例覆盖程度,bug解决程度

    6、测试风险:

    8、项目

    问题1:准备后台模块

    商家后台:后台主要包括后台主页、商品模块,内容模块,库存模块、订单模块、物流模块、售后模块、促销管理(优惠券、礼品卡)等系统模块。

    问题2:讲项目,你熟悉的一个项目

    1、声明名称背景简介

    我上家公司做的是一个电商项目,是web端的项目,主要是有场景化的文章描述和商城配置,是一个综合性的电商管理项目。

    2、项目的组成

    这个系统呢主要由两部分组成,一个是前台一个是后台,前台是一些功能展示模块,面向用户,包括首页、信息流文章、商城栏目、购物车、订单、支付、用户中心等系统模块,后台主要包括后台主页、商品模块、内容模块、库存模块、订单模块、物流模块、售后模块、促销管理(优惠券、礼品卡)等系统模块。

    3、具体的业务,以其中一个主流程(讲购物车)

    我这边呢就给您介绍下购物车这个模块吧,购物车又分为未登录和已登录的情况,用户选购商品之后点击加入购物车,系统会判断用户是否已登录,当处于未登录状态时系统会自动跳转到登录界面。

    然后我主要说一下已登录的情况,首先,登录到网站中浏览商品,添加指定的商品到购物车,进入购物车页面,在该页面可以实现更改商品数量、删除商品、清空购物车、继续购物等功能。

    (查增删改)进入购物车模块中会展示购物车商品的基本信息,包括图片,标题,价格,库存,上下架状态等,当商品库存为空或已下架、已失效或违规的商品都会置灰,用户无法选取并提示不可购买且展示位置在有效商品的底部,点击购物车中的商品,可以跳转到商品的详情页进行查看。当我们将所选的商品添加到购物车中时,若商品数据重复,那么系统会将商品信息去重,然后做数量上的叠加;也可以选定某一条商品或者全选进行删除操作;同时我们可以对购物车中的商品进行数量、规格的修改;选定商品填写好收货地址等信息,点击提交之后,这款商品就不会再存在于购物车中了,若不提交点击返回购物车,则商品依然存在于购物车。

    问题3:购物车测试点

    购物车的测试点话我会从界面、功能(基本功能增删改查+相关联业务)、性能、可用性、兼容

    问题4:可能问到的测试点

    1、说大方向:界面、功能、性能、兼容性、安全性、易用性

    2、从具体角度说具体测试点:

    杯子电梯上传下载直播软件扫码微信支付微信点赞发朋友圈人脸识别发红包小程序短视频优惠券淘宝搜索框登录

    问题5:数据流转,怎么交互的,前后端交互原理

    注意:前端开发与后台交互的数据格式主要是什么?

    主要是JSON,XML现在用的不多

    数据发送到后端--后端接收到前端发送过来的数据--后端对前端发送来的数据进行处理--处理完之后写入数据库,以及给前端返回处理结果

    首先我们的数据处理大概分三层来看:表示层(显示层),业务层、数据层

    第一层,表示层,这部分可以用HTML代码,CSS/Javascript代码来实现等。通过前端代码可以实现网页的布局和设计。这层又可以称为显示层。也就是你用浏览器打开能看到的网页。

    第二层,是业务层,这层是负责处理数据的。常用的代码语言有PHP,JSP,Java等。通过这些后台处理语言的算法来处理前台传回的数据。必要的时候进行操作数据库,然后把结果返回给前端网页。

    第三层,是数据层,这个就是数据库,用来存储数据的。通过业务层的操作可以实现增删改数据库的操作。

    具体处理流程如下:

    首先你接触到的是这个网页是属于表示层,这个网页一般由HTML标签结合CSS/JAVASCRIPT来实现的。 这时候你要先填入数据。

    然后你从前台提交数据(传参)在公司可以通过form表单形式处理你要传参,通过触发一些按钮事件提交到后台,或者也可以用ajax和json格式(也是通过get或者post方式提交)传参,

    后台接收后触发相应的后台处理机制,这时候数据会传到后台的代码进行处理。这部分代码根据不同网站可以使PHP,JSP,JAVA等语言处理。代码根据程序员预设的算法将收到的数据进行处理之后会相应的对数据库进行操作,存储数据等。

    最后你成功操作完数据库之后,业务层的代码会再向表示层也就是显示器端传回一个指令通知你表格填写成功

    9、linux

    问题1:linux常用指令

    1、操作文件及目录指令:

    cd:  切换目录

    pwd: 显示当前目录的绝对路径

    touch: 创建文件   

    mkdir: 创建目录(-p创建递归目录)

    cp:  复制文件/目录(-r)

    mv:  移动文件/目录,修改文件/目录的名字

    rm -r/rm –rf/rm –rf * :删除

    cat: 查看文件类容

    more:分页显示文件内容,可前后翻页,显示查看进度百分比,自动退出

    less: 分页显示文件内容,可前后翻页,不显示查看进度,需手动退出

    head: 默认查看前十行(head –15 aa.txt)

    tail:默认查看后十行(tail -15 aa.txt)

    grep:在指定文件中查找包含指定内容的行(grep zhangsan a.txt==在a.txt文件中在查找包含zhangsan的所有行)

    ln –s: 建立软连接

    ln –d:  建立硬连接

    2、系统常用指令

    top:查看CPU使用情况(top –d 5 :每5秒刷新一次)

    data:显示系统当前时间

    df:查看磁盘使用率(df –h:带单位查看磁盘)

    free:查看内存使用情况

    ifconfig:查看当前ip地址

    ping:查看网络是否是通的

    du –sh +文件/目录:查看文件/目录的大小

    reboot:重启linux系统

    hostname:查看主机名

    shutdon –r:先关机,再重启(shutdown –h:关机后,不重启)

    ps –ef|grep +服务器名称:查看服务器进程

    kill -9 +进程号:杀死一个进程

    netstat –ntlp: 查看所有已开启的端口

    lsof -i :+端口号 查看当前端口被哪个服务占用

    netstat -tunlp|grep 查看指定的端口号的进程情况

    3、文件权限操作

    chmod  777 +文件名   修改文件权限

    chown ceshi01+文件名===修改文件或目录属主

    chgrp ceshi02+文件名====修改文件或目录属组

    4、压缩解压

    Zip包/unzip/gzip

    zip + xxxx.zip xxxx (文件)

    zip -r +目录.zip xxxx (目录)

    unzip xxxx.zip        (解压)

    gzip a.txt :压缩后面的文件或者文件夹

    gzip –d a.txt.gz :解压压缩的文件

    tar包(解压到指定路径 -C)

    tar –cvf  aa.tar  a.txt   #将a.txt文件压缩成一个aa的tar包

    tar –xvf  aa.tar

    tar –zcvf  aa.tar.gz  a.txt

    tar –zxvf  aa.tar.gz

    rpm -ivh xxxx.rpm (安装rpm包)

    5、修改文本

    r:替换光标所在处的字符

    R:从光标所在处开始替换(按esc键结束)

    set nu :显示行号

    set nonu:取消行号

    / +字符串(要搜索的关键字)

    tail –f +日志名 :查看实时日志(实时刷新日志)

    tail –f +日志名|grep error  #只查看错误日志(实时刷新错误日志)

    cat +文件名| grep error 查看(打印)文件中的错误信息

    查看80端口有没有被监听:netstat-anp|grep 80/netstat -tln|grep 80

    Vim有哪三种模式及区别:

    1.命令模式

    作用:用于键盘输入命令

    2.编辑模式

    作用:用于编辑文本,修改文本

    3.末行模式

    作用:用于输入末行命令

    Vi编辑模式中粘贴复制是哪个:yy复制整行,p粘贴

    单独查看内存:free -m

    问题2:搭建环境

    有搭建过,但不是在公司,进公司已经有了,有在家试过。

    就用tomcat、数据库、jdk搭建

    1、我们公司项目环境是基于tomcat搭建的,所以我要先下载安装个tomcat

    2、由于tomcat是基于Java开发的,所以我需要安装个jdk

    3、然后去bin目录下启动tomcat(sh startup.sh /.startup.sh)

    4、访问前需要先过滤tomcat的端口号(tomcat默认端口号8080)

    5、通过浏览器输入ip+端口号访问tomcat

    6、去webapps目录下清空里面的内容,导入项目包

    7、导入项目包后里面有个jdbc的文件需要配置

    8、配置服务器的ip地址、数据库账号密码

    9、重新启动tomcat,然后直接访问即可

    改端口号vi conf/server.xml--set nu --修改第70行 port=“8080“为‘8081’--保存后退出

    过滤端口号cd etc/sysconfig--vi iptables--复制端口号那一串到下一行,然后改为自己想要端口号即可

    10、mysql数据库(测试做校验用的)

    问题1:怎么导库导表

    mysql -uroot -p123465 testdb < D:\DB\test.sql;导入

    mysqldump -uroot -p123456 testdb > D:\DB\test.sql 导出

    问题2:DDL和DML

    DDL:数据库定义语言(对表结构和表字段进行操作)

    create ,alter table, drop

    DML:数据库操作语言(对表数据进行操作,增删改查)

    insert into, delete, select, update

    问题3:数据库常见的组合函数

    最大、最小、去重(distinct)、统计、平均、求和

    问题4:升序、降序、范围内

    Order by desc 降序

    Order by asc  升序

    Between

    Limit

    问题5:分页功能

    select * from tableName where 条件 limit 当前页码*页面容量-1,页面容量      

    两个参数:PageNo,PageSize

    问题6:拼表(内连接、左连接、右连接、基本连接)

    内连接:select * from 表1 inner join 表2 on 表1.字段=表2.字段

    (显示两个表有相同部分的内容)

    左连接:select * from 表1 left join 表2 on 表1.字段=表2.字段

    (以左边的表为主,左边表的内容全部显示,右边的没有的显示null )

    右连接:select * from 表1 right join 表2 on 表1.字段=表2.字段

    (以右边的表为主,右边表的内容全部显示,左边表没有的显示null)

    基本连接:select * from 表1,表2 where1.字段=表2.字段

    (同内连接)

    问题7:外键

    对外键的理解:使一张表的数据不要太过冗余,会用

    添加外键sql语句:alter table dcs2 add CONSTRAINT fk_sid FOREIGN 

    key(sid)REFERENCES dcs1(id)ENGINE=INNODB

    Alter  table 表名 add constraint 外键名 foreign key(子表字段名)references 父表(父表表名)

    问题8:where和having语句的区别

    1.where 不能放在GROUP BY 后面 where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉, 即在分组之前过滤数据,条件中不能包含聚组函数比如SUM(),AVG()等,使用 where条件显示特定的行。

    2.having 是跟GROUP BY 连在一起用的,放在GROUP BY 后面,此时的作用相当 于WHERE。 having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。

    问题9:索引index

    索引的作用:可以利用索引快速访问数据库中的特定信息

    索引:可以理解为书的目录

    ①创建普通索引:

    create index tt on dcs02(name);

    ②创建唯一索引:

    create unique index bb on dcs02(money);

    备注:

    1、创建唯一索引前提是字段值要唯一且允许为空

    2、查看表中所有索引时0代表唯一索引和主键索引、1代表是普通索引

    删除普通和唯一索引:alter table dcs02 drop index tt;

    ③创建主键索引:

    创建索引:alter table dcs add primary key(id);

    查索引:show index from dcs

    删除索引:alter table dcs drop PRIMARY key

    问题10:视图view

    create view yy as(select sex,score from dcs01);

    创建一个视图yy基于dcs01表中的sex,scroe分数字段

    show tables;====通过查看所有表可以查看视图

    show create view yy;====查看视图

    drop view yy;====删除视图(备注:不能使用drop table去删除视图)

    问题11:增删改查

    insert into +表名 values(字段1value,字段2value,字段3value...)

    delete from +表名 where 条件/ truncate +表名/ drop table +表名

    改:update +表名 set 字段名=值 where 条件

    :查询表中所有数据 :select * from +表名;查询某个字段的数据: select 字段 from +表名

    查询多个字段的数据 :select 字段1,字段2 from +表名;

    查询满足某个条件的所有数据 :select * from +表名 where 字段=值

    查询不满足某个条件的所有数据 select * from +表名 where 字段!=value

    查询同时满足多个条件数据 select * from +表名 where 条件1 and 条件2

    查询满足至少1个条件的数据 select * from +表名 where 条件1 or 条件2

    查询一个条件范围内的数据 select * from +表名 where 字段 between m and n

    查询字段满足在指定的集合中的数据 select * from +表名 where 字段 in(值1,值2,值3)

    查询字段不满足在指定集合中的数据 select * from +表名 where 字段 not in (值1,值2,值3)

    查询字段值为null的数据 select * from +表名 where 字段 is null

    查询字段不为null的数据 select * from +表名 where 字段 is not null

    查询某个字段模糊匹配成功的数据 select * from +表名 where 字段 like “%值%”

    查询限定的数量的数据 select * from +表名 where 字段 limit m,n

    查询的数据根据某个字段从小到大排序 select * from +表名 order by 字段 asc

    查询的数据根据某个字段从大到小排序 select * from +表名 order by 字段 desc

    查询的数据根据某个字段进行分组 select * from +表名 group by 字段

    查询的数据根据某个字段进行分组再条件过滤 select * from +表名 group by 字段 having 条件

    问题12:存储过程

    drop procedure if exists test01;

    create procedure test01(n int)

    begin

    declare i int default(select count(*) from student);

    declare a int default(select max(id) from student);

    declare c int default(select max(score) from student);

    declare b varchar(20);

    if i>=n then

    select * from student;

    else

    while i<n do

    set a=a+1;

    set c=c+1;

    set b=concat('dcs',a);

    insert into student(id,name,score)values(a,b,c);

    set i=i+1;

    end while;

    end if;

    end 

    call test01(100)

    select * from student;

    11、接口

    问题1:有没有了解过http

    (答题思路: 定义、常见请求类型、状态码、请求头请求体、响应头和响应体、三次握手和四次挥手。)

    答:了解,我们做接口的时候基本上都是基于http接口来做的。

    HTTP是超文本传输协议,超文本是指数据传输时,可以进行文本传输之外的数据,比如图像、音频等,http默认端口是80。

    http的工作原理是,客户端通过URL向http服务器发送请求,服务器接收请求后,向客户端发送响应信息。

    HTTP常见的请求类型有post(增)、get(查)、put(改)、delete(删)。

    HTTP常见的状态码

    1开头的是指示信息—表示请求已经接受,继续处理。

    比如说100 Continue表示初始请求已经接受,客户应当继续发送请求的其余部分

    2开头表示请求已被成功接受、理解、接受

    比如200,表示请求成功

    3开头的是重定向问题——要完成请求必须进行更进一步的操作

    300表示客户请求的文档可以在多个位置找到

    301表示请求的资源已被永久的移动到新的URL

    302表示请求的资源被临时移动到新的url

    4开头的是客户端错误——请求有语法错误或者请求无法实现

    400表示请求的语法错误

    404表示无法找到指定位置的资源

    5开头的是服务器错误——服务器未能实现合法的请求

    500表示服务器内部错误,不能完成客户的请求

    501表示服务器不支持实现请求所需要的功能

    503表示服务器由于维护或者负载过重未能应答。

    组成:协议、服务器的ip地址、端口号、接口路径 loginJump:接口名称、参数、协议版本

    问题2:http和https的区别

    一、传输信息安全性不同

    1、http协议:是超文本传输协议,信息是明文传输。

    2、https协议:https则是具有安全性的ssl加密传输协议,为浏览器和服务器之间的通信加密,确保数据传输的安全。

    二、连接方式不同

    1、http协议:http的连接很简单,是无状态的。

    2、https协议:是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议。

    三、端口不同

    1、http协议:使用的端口是80。

    2、https协议:使用的端口是443。

    四、证书申请方式不同

    1、http协议:免费申请。

    2、https协议:需要到ca申请证书,一般免费证书很少,需要交费。

    问题3:get和post的区别

    get请求:

    1)请求的数据一般会显示在地址栏(输入长度有限定)

    2)安全性差,请求的入参信息全包暴露在URL地址栏当中

    3)请求的数据量比较小

    4)get请求参数会被完整保留在浏览历史记录里,而post中的参数不会被保留

    post请求:

    1)请求的数据一般不会显示在地址栏里面,会把数据封装在表单里面(入参放在requests body当中)在提交

    2)安全性比较高

    3)请求的数据量比较大

    问题4:cookie和session区别(鉴权、身份识别)

    1)cookie数据存放在客户的浏览器上,session数据放在服务器上

    2)cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session

    3)session会在一定时间内保存在服务器上。当访问增多,会比较占用服务器的性能,考虑到减轻服务器性能方面应当使用cookie

    4)单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie

    多套系统,跨系统的时候就需要带上token

    token,用户向服务器发起一个请求时,服务器会响应回来一个token信息,一般都是返回的一串唯一的标志符。访问时,可以避免重复繁琐的访问服务器,只要识别这个令牌token。

    问题5:tcp和udp协议的区别

    1、TCP提供面向连接的、可靠的数据流传输,而UDP提供的是非面向连接的、不可靠的数据流传输。

    2、TCP传输单位称为TCP报文段,UDP传输单位称为用户数据报。

    3、TCP注重数据安全性,UDP数据传输快,但是其安全性却一般。

    4、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)

    问题6:七层和五层模型及每层对应协议

    TCP/IP协议是一个协议集合,应用层、传输层、网络层、数据链路层,物理层。

    OSI参考模型(OSI/RM)的全称是开放系统互连参考模型(Open System

    Interconnection Reference Model,OSI/RM),网络系统互连模型:每一层都为其上一层提供服务、并为其上一层提供一个访问接口或界面,不同主机之间的相同层次称为对等层。对等层之间互相通信需要遵守一定的规则,如通信的内容、通信的方式我们将其称为协议(Protocol)

    问题7:三次握手和四次挥手

    三次握手:(syn=1, ack=0表示客户机请求建立TCP连接)

    第一次握手:客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;

    第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV(receive)状态;

    第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入established(建立)状态,完成三次握手。

    握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。

    四次挥手

    与建立连接的“三次握手”类似,断开一个TCP连接则需要“四次挥手”。

    第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可以接受数据。

    第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。

    第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。

    第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。

    问题8:http的常见状态码

    1开头的是指示信息—表示请求已经接受,继续处理。

    比如说100 Continue表示初始请求已经接受,客户应当继续发送请求的其余部分

    2开头表示请求已被成功接受、理解、接受

    比如200,表示请求成功

    3开头的是重定向问题——要完成请求必须进行更进一步的操作

    比如300表示客户请求的文档可以在多个位置找到,301表示请求的资源已被永久的移动到新的URL,302表示请求的资源被临时移动到新的url

    4开头的是客户端错误——请求有语法错误或者请求无法实现

    比如400表示请求的语法错误,404表示无法找到指定位置的资源,402表示

    5开头的是服务器错误——服务器未能实现合法的请求

    比如500表示服务器内部错误,不能完成客户的请求,501表示服务器不支持实现请求所需要的功能,503表示服务器由于维护或者负载过重未能应答。

    问题9:http的请求头和响应头包括哪些信息

    请求头信息:

    post :请求的方法

    HTTP/1.1:超文本传输协议的版本为1.1版本

    host :请求服务器的网址url

    content_length :传输文件的大小或内容的长度

    Connection :客户端与服务器连接类型   

    Keep-Alive  :表示持久连接

    content_type:请求体类型

    accept Encoding :设置接受的编码格式

    accept language :设置接受的语言

    Cookie :记录客户端用户信息

    响应头信息:

    HTTP/1.1 :超文本传输协议的版本号

    server :服务器名

    Set-Cookie : 发送http cookie Cookie记录用户信息

    Transfer-Encoding: 设置传输实体的编码格式(查看支持的格式)

    content_type :设置响应体类型

    date :设置消息发送的日期和时间

    问题10:接口包含哪些信息(url)

    1.协议

    2.服务器的ip地址

    3.端口号

    4.接口路径 loginJump:接口名称

    5.参数

    6.协议版本

    问题11:接口怎么测,jmeter/python+requests

    前期的接口功能测试用的是jmeter

    后期自动化的话是用的python+requests去实现的

    问题12:构建接口测试,用jmeter/python+requests

    ①Jmeter

    1、通过接口文档获取接口基本信息,例如请求方式、url地址、入参、数据提交格式等相关信息

    2、在测试计划下面添加线程组,线程组下面添加http请求,填写对应数据,添加查看结果树,添加聚合报告,进行运行

    3、查看返回结果,跟接口文档中对比,判断是否成功

    1、我们公司是用jmeter来做接口测试的,首先我会根据接口文档获取接口相关的信息,例如:接口名称,接口的url,接口的请求方式,请求参数,响应内容等;

    2、然后就是在jmeter中先建立一个线程组,然后在线程组下建一个http请求,在http请求中根据接口文档获取的相关信息,填写接口请求方式,url,请求参数等;

    3、再就是在线程组下添加一个响应断言和查看断言结果,判断返回结果是否异常,用来判断当前接口是否拉通

    4、然后会在线程组下建立相应的监听器,如查看结果树和聚合报告等,用来分析和查看结果。)

    ②Python+requests

    1、Requests是用来做接口测试的库,按住Windows标志+r,在运行窗口输入cmd,输入pip install requests进行安装。

    2、Python中导入requests这个库,组建接口有四种方式组建接口的四种方式

     r=requests.get()、r=requests.post()、r=requests.request()、r=requests.sessions()),根据具体情况使用

    3、将组建接口需要的参数:url、接口入参、请求方法、headers对应写好

    4、进行断言

    ①针对r.text,r.text是json字符串,用in和not in或者assert '登录成功!'in r.text进行断言

    ②针对r.json,r.json是字典,用assert r.json()['msg']=='登录成功!'或者

    if  r.json()['msg']=='登录成功!':

    print('接口调用成功')

    else:

    print('接口调用失败')

    问题13:测关联接口,鉴权,jmeter/python

    ①Jmeter

    1、添加cookie管理器:调通登录接口后自动化获取cookie值作为下一个接口的入参,添加一个http cookie管理器会自动保存cookie值,线程组-添加-配置元件-HTTP cookie管理器

    2、正则表达式:前面接口请求返回的值(动态变化的)定义一个变量,在后置处理器里再添加一个正则表达式提取器,输入一个变量名,表达式、模板、匹配数字,下面一个接口引用这个变量就行了

    ②Python:关联接口(json的解析)

    1、通过cookie值处理。python中将cookie值设置为变量,在处理下一个接口的时候可以直接调用该变量

    2、用session()的方法,可以实现跨请求保持参数,保持会话

    self.s = requests.session()  #根据调用session方法生成一个session对象,由同一个session对象发起的请求保持在同一个会话

    3、正则匹配上一个接口的返回值中的部分数据作为下一个接口的入参。Findall

    问题14:登录后接口怎么测(session值)

    session()的方法,可以实现跨请求保持参数,保持会话

    self.s = requests.session()  #根据调用session方法生成一个session对象,由同一个session对象发起的请求保持在同一个会话

    问题15:接口参数化,jmeter/python

    ①Jmeter

    1、用户参数

    a、在前置处理器中添加一个用户参数,在里面去添加变量给参数

    b、http请求入参引用变量,${}

    2、利用配置原件CSV Data Set Config/CSV

    a、添加一个配置原件CSV Data Set Config

    b、引用本地配置文件路径(本地txt或cvs文档里添加参数)

    c、添加变量名

    ②python+requests

    1、定义变量,url=、data=、headers/json=、 如果是get请求params=

    2、将上一个接口的返回值,设置成变量,作为下一个接口的入参

    3、将接口的cookie值作为下一个接口的入参

    4、通过导入xlrd模块,将存储在excel表中的参数,作为请求的入参

    问题16:接口自动化和ui自动化的区别

    1、接口自动化覆盖率高于ui自动化,接口的覆盖率可以到达100%,UI的覆盖率只能到达50~60%

    2、接口自动化执行效率高于ui自动化,ui自动化容易受其他原因(电脑卡顿,浏览器卡顿,网速等)影响导致脚本执行失败

    3、接口自动化维护成本低于ui自动化成本,ui自动化只要页面稍微变动,自动化的脚本就需要进行调整

    问题17:接口有没有测出过哪些bug

    1、常规错误:接口没实现,没按约定返回结果等

    2、安全性错误:明文传输或者没对用户身份信息做校验

    3、性能问题:如接口并发插入相同操作,响应时间过长

    4、权限未处理,可以访问其他用户的信息

    例如:无权限可以访问,或者 一般用户可以访问管理员权限

    5、逻辑校验不完善,可利用漏洞获取非正当利益

    例如:某网站兑换1块钱需要100币,当小于100币时调用后台 接口是否可以兑换

    例如:购物结算时为100元,调用后台接口设为0元

    6、比如上面说的,提现输入框,在页面上输入负数,肯定是无法提交过去(前端页面会判断金额),如果我不走前端,直接用接口工具发请求,输入一个负数过去。

    问题18:接口自动化框架

    python+requests+excel+unittest+ddt

    分了以下几层:配置层、方法层、报告层、工具层、用例层、执行用例层

    每一层放了什么、是用来做什么的:

    配置层:准备接口参数,比如登录入参、查询购物车入参

    方法层:组建接口请求,比如请求登录的、请求查询购物车商品的、请求删除商品接口的

    用例层:封装用例的地方,比如登录成功、查询购物车内商品、删除商品成功

    执行用例层:封装执行用例的方法,

    报告层:放报告

    工具层:放工具,发送邮件、生成报告模块、读取数据等公共方法

    (接口自动化用的是Python+requests+excle+ddt+unittest框架去实现的

    那么我讲一下我的接口自动化的一个框架设计思路,从整体框架设计思路来看,要做到数据、业务流程的一个分离,那么也就是说脚本要分层设计,就拿我在工作中对接口的封装自己做的一个框架分层,例如我们的方法层、配置层、用例层、用例执行层、报告层、工具层:

    方法层:我会处理公共接口返回的cookie或者session值,

    配置层:我会把构建接口的数据放在一个本地的excel表格中,然后通过python中的xlrd模块,去读取表格中的数据,将这些数据读取出来之后,通过zip函数讲这些数据打包成有一个个元祖组成的列表,然后通过dict函数将其转换成字典,形成键值对的形式,传入一个列表中,这时本地的接口数据全在一个列表中(列表取得是键,没有值)

    用例层:是基于unittest框架去组装用例的,通过调用数据层里的接口数据,传入到对应的接口用例里面去并添加断言

    用例执行层:是封装执行用例的方,通过ddt数据驱动去驱动这个这个列表,每驱动一次,就可以获得一组接口数据,传到对应的接口用例中去执行,执行完成之后,就会拿第二组数据,继续执行;

    报告层:放置报告

    工具层:放工具,发送邮件、生成报告模块、读取数据等公共方法

    我的一个接口封装流程大概是这样的。)

    问题19:fiddler打断点

    1、用过,首先打开fiddler抓包工具,把里面的数据清空,点击要抓包的页面,fiddler里面就会记录相关接口信息

    2、通过设置断点,设置断点又分请求前断点和请求后断点;

    请求前的断点:设置:bpu +接口的URL地址  取消:直接输bpu

    请求后的断点:设置:bpafter +接口的URL地址  取消:直接输bpafter

    请求前断点和请求后断点的区别:请求前断点修改请求头和请求体中的参数值;请求后断点修改响应头和响应体中的参数值

    问题20:fiddler抓https请求

    1、启动Fiddler,选择菜单栏中的 Tools下的 Options,打开“ Options”对话框

    2、在Options”对话框中选择到“https”选项卡,勾选配置选项,然后点击'Actions'选择‘Export Root Certificate to Desktop’,点击'ok'这时候桌面上会出现证书FiddlerRoot.cer文件

    3、将证书导入PC端,在浏览器中导入证书FiddlerRoot.cer,以谷歌浏览器为例说明,在浏览器上输入: chrome://settings/,然后进入高级设置,点击管理证书;

    4、在’管理证书’对话框选择’受信任的根证书颁发机构’,对证书进行导入

    5、导入完成后,重新打开fiddler,就可以在电脑上进行https抓包了

    问题21:用fiddler干什么

    1、拦截请求,打断点,修改参数,测接口安全性

    2、确定前后端问题的时候,分析bug来自前端还是后端,先抓包看请求报文,对着接口文档,看请求报文有没问题,有问题就是前端发的数据不对,请求报文没问题,那就看返回报文,返回的数据不对,那就是后端开发的问题

    3、模拟丢包、测弱网

    问题22:分析接口是前端还是后端问题

    1)检查接口,前端和后台之间是通过接口文件相互联系的,需要查看接口文件

    2)检查请求的数据是什么,反馈的数据又是什么

    3)根据接口文件,检查数据是否正确。如果发送的数据是正确的,但是后台反馈的数据是不符合需求的,那就是后台的问题;如果前端没有请求接口或请求的时候发送数据与需求不符,那这个时候就是前端的问题了。

    问题23:fiddler工作原理

    Fiddler是位于客户端和服务器端之间的HTTP代理,它可以设置断点、修改请求的数据和服务器返回的数据,Fiddler启动后会自动将代理服务器设置成本机,默认端口为8888。当浏览器向服务器请求数据时,被Fiddler截获,截获后再发送给服务器,当服务器向浏览器响应数据时,同样会被Fiddler截获,然后再发送给浏览器,所以我们能够在Fiddler中看到请求的报文和响应的报文。

    问题24:fiddler设置端口号

    打开fiddler,点击右上角tools--options--connections,有一个监听端口的设置,默认的是8888,我们可以根据自己的情况设置一个,范围可以是1000-9999

    问题25:设计接口用例

    1、首先要拉通接口,实现该接口的基本功能

    2、输入(value值)的设计,可以考虑输入数值的有效类、边界值以及字符串的长度范围输入。对输入的合法的、不合法的 以及已经存在的数组的考虑,还有输入空值。

    3、输出的设计,错误前端处理不足,导致前端异常;接口超时没有返回,导致整个流程阻塞;

    4、逻辑的设计,对限制条件的分析,如一些数值限制,状态限制,权限限制等

    5、业务规则来设计接口。相互制约的关系,第二个接口依赖第一个接口

    6、安全性角度。前后端一些敏感信息的数据传输是否加密。不加密是否能成功,没有cookie值是否能接通。

    7、性能的角度。考虑到并发,响应时间的快慢问题等。

    问题26:测接口的重要性、原因

    1、当界面功能没出来时,测试人员可以做接口测试,一是节省时间,二是测试一些界面功能测不到的场景

    2.可以发现很多在页面上操作,发现不了的bug

    3.检查系统的异常处理能力,以及系统的安全性、稳定性

    4.可以测试并发情况,一个账号,同时(大于2个请求)对最后一个商品下单,或不同账号,对最后一个商品下单

    5.可以修改请求参数,突破前端页面的输入限制(如金额)

    问题27:接口常见的数据提交格式类型

    application/x-www-form-urlencoded

    multipart/form-data

    application/json

    text/xml

    问题28:Json数据格式的优势

    1、数据交互格式简单,易于读写

    2、数据体积小

    3、支持多语言交互,易于解析

    4、json处理速度快

    问题29:构建https请求,jmeter/python

    ①jmeter

    1、导出要处理网站的安全证书,比如百度,单击安全图标,复制出安全证书

    2、点击详细信息 - 复制到文件,按提示逐步操作,将证书存储到本地文件夹

    3、证书下载后,运行cmd,在命令行把导出的证书打成.store。

    keytool -import -alias "my.store" -file "C:sers dministrator\Desktop证书\ca.cer" -keystore my.store)

    4、然后设置密令,查看文件,此时已生成my.store 

    5、jmeter脚本创建顺序:打开jmeter - 添加线程组- 在线程组下添加sampler - http请求,将http请求的各项参数填写好(示例接口为支付宝支付接口https://memberprod.alipay.com/account/reg/index.htm)

    6、打开jmeter-选项 - ssl管理器,导入my.store文件即可

    7、添加察看结果树点击运行,提示输入密令,输入之前设置的密令即可。

    ②python

    import requests

    #verify默认为True,此时会验证证书,改为False将不会验证证书

    response = requests.get(url="xxx",params="xxx",verify=False)

    print response.text           #查看响应体信息,以文本信息返回

    print response.status_code    #返回状态码

    print response.headers        #返回响应头信息

    print response.cookies        #打印cookie信息

    12、支付

    问题1:测试环境没有对接支付宝、微信,怎么测支付接口

    目前我们公司也有搭建mock环境

    这个需要自己去搭建一个mock服务,模拟接口返回数据,也就是我们常说的挡板服务。可以使用的工具有很多,比如在线版的 easy mock,java优秀的接口mock工具moco,或者利用web开发的框架比如flask、django等等自己写一个小的接口服务,部署上就可以。有了mock服务,让开发人员把对应的地址替换掉即可。如果不方便替换可以使用抓包工具或者burpsuite截获请求,修改地址或相应参数,再发送出去就可以了。

    问题2:第三方支付流程

    1、用户向商城网站发起确认订单的请求

    2、商城网站接收到请求保存订单数据到数据库或其他存储介质

    3、返回订单确认页面,页面上应该显示订单金额等信息

    4、用户确认支付,发起支付请求。注:支付请求是发送到支付网关(比如

    支付宝、网银在线)而不是发送到商城网站。

    5、显示支付页面

    6、用户填写认证信息(账号密码等)提交

    7、这里有两个步骤一个是扣款成功后页面跳转到支付结果页面(展示给用

    户),另一个是支付通知,这两步没有先后顺序可能同时执行,商城网站接收到

    支付通知后根据验证规则验证信息的有效性,并作出相应的更改操作(例:有效

    则更改订单为已付款状态,无效则记录非法请求信息)。

    问题3:第三方支付功能测试点

    问题4:第三方支付接口的测试点

    问题5:web端支付中跳转的二维码哪来的

    问题6:支付前端已显示支付,后端未显示支付是什么原因

    问题7:测试环境中模拟第三方支付网关完成支付接口请求

    开发写好的代码中会配置好第三方支付接口的参数,进行接口测试时候也是正常给参数到地址就可以了,主要是需要第三方支付提供调试账号和账号的支付密钥,同时接口对接时需要提供项目的回调地址,用于接收支付返回的信息

    13、Python

    无序序列: dict、set

    有序序列: str、list、tuple

    不可变对象: str、tuple改变内容地址也变动

    可变对象:list、dict、set

    Python中的正负索引的区别:

    Python中的序列索引可以是正也可以是负。

    正索引代表从前往后索引,默认从0开始;

    负索引代表从后往前索引,默认从-1开始;

    字符串中如何除去空格:

    strip():删除字符串前后的空白

    lstrip():删除字符串前面(左边)的空白

    rstrip():删除字符串后面(右边)的空白

    问题1:列表与字典的区别,列表与元组的区别

    1.列表list []

    列表是处理一组有序的数据结构,可以读写,添加和删除,或者搜索列表里的元素。因为可以添加和删除,所以称为可变的数据类型,即这种类型是可以被改变的,并且列表可以嵌套。

    2.元组tuple()

    元组跟列表非常相似,用()来表示,但是元组是不可变的,不能修改元组。元组可以嵌套。

    3.字典dict

    字典是通过键值对的方式就数据存储下来,键必须是唯一的
    键值对在字典中以这样的方式标记:d = {key1 : value1, key2 : value2 }。

    注意它们的键/值对用冒号分割,而各个对用逗号分割,所有这些都包括在花括号中。

    元组和列表的区别

    相同:

    a、都是序列类型的容器对象,可以存放任何类型的数据

    b、支持切片、迭代等操作 

    不同:

    a、list 是可变的对象,元组tuple是不可变的对象

    b、tuple不可变,所以使用tuple可以使代码更安全

    另外,记住字典中的键/值对是没有顺序的。如果你想要一个特定的顺序,那么你应该在使用前自己对它们排序

    问题2:列表、字典、元组、字符串常见的方法

    列表去重:set/for循环(定义空列表,若不存在在空列表中,则遍历加入列表里append)

    降序、升序:sorted、sort

    反转输出:reverse、切片(print(dcs[::-1]) 结果取全值,从右到左反转)

    问题3:冒泡

    每次都比较相邻的元素。如果第一个比第二个大(小),就交换他们两个。直至所有相邻元素都作比较,这时列表中最后一个元素应该是最大(最小)的,依次按照此方法循环比较n次,直至所有的元素都按从小(大)到大(小)排序为止

    问题4:Python数据类型

    数字、字符串、列表、元祖、字典、集合

    字符串:Python中最常用的数据类型。我们可以使用单引号''或者双引号""来创建字符串。

    列表(list):是一组有序存储的数据,也是python常见的序列之一,序列中的每个元素都分配一个索引,第一个元素索引是0,第二个元素索引是1,依此类推。序列都可以进行的操作包括索引,切片,加,乘,检查成员

    列表表达符为:[]

    定义列表的两种方法:

    方法一:list1 = [1,2,3,4] #直接通过[]进行定义

    方法二:list2 = list('1234') #使用list()方法进行定义

    元组(tuple):是Python中常用的一种数据结构。元组由不同的元素组成,每个元素可以存储不同类型的数据,如字符串、数字、甚至元组。元组是'写保护' 的,即元组中元素作为一个整体,创建后不能再做任何修改操作

    字典(dict)

    1、是另一种可变容器模型,且可存储任意类型对象。字典的每个键值key:value对用冒号 : 分割,每个键值对之间用逗号分割,整个字典包括在大括号 {} 中

    2、字典同时是无序,字典都是以键值对的形式存在,先键后值,键是唯一的,值且不唯一

    问题5:用过的第三方库、模块(方法及区别)

    用过的第三方库:requests、time、os、xlrd、re

    模块:

    ①Time:

    time() #1970到现在的经过的秒数

    ctime() #固定格式的当前时间

    sleep(3) #休眠 单位是秒

    asctime() #转换为asc码显示当前时间

    strftime() #时间格式化)

    ②Os:

    os.getcwd()获取当前执行命令所在目录

    os.path.isfile()判断是否文件

    python中os模块

    os.path.isdir() #判断是否是目录

    os.path.exists() #判断文件或目录是否存在

    os.listdir(dirname) #列出指定目录下的目录或文件

    os.path.split(name) #分割文件名与目录

    os.path.join(path,name) #连接目录与文件名或目录

    os.mkdir(dir) #创建一个目录

    os.rename(old,new) #更改目录名称

    ③Random:

    random.random() #该方法是生成0-1之间的浮点数,但是能取到0,但是取不到1

    random.randint(x,y) #该方法生成指定范围内整数,包括开始和结束值

    python中random模块

    random.randrange(x,y,step) #生成指定范围内的奇数,不包括结束值

    random.randrange(x,y,step) #生成指定范围内的偶数,不包括结束值

    random.sample(seq,n) #从序列seq中选择n个随机且独立的元素

    random.choice(test) #生成随机字符

    random.shuffle(list) #洗牌(随机数列)

    hashlib.md5() #MD5加密

    ④re:

    1、match

    从第一个字符开始匹配,如果第一个字符不是要匹配的类型、则匹配失败并报错

    注意:如果规则带了'+',则匹配1次或者多次,无'+'只匹配一次

    2、search

    从第一个字符开始查找、一找到就返回第一个字符串,找到就不往下找,找不到则报错

    3、findall

    从第一个字符开始查找,找到全部相关匹配为止,找不到返回一个列表[]

    4、compile

    编译模式生成对象,找到全部相关匹配为止,找不到返回一个列表[]

    Python中常见的模块:

    time模块

    random模块

    hashlib模块

    os模块

    re模块

    string模块

    xlrd模块

    json模块

    sys模块)

    问题6:python调试的方式

    Debug

    代码旁边点一下,红点

    问题7:实例方法、类方法、静态方法区别

    1.实例方法

    定义:第一个参数是self”,通过它可以使用实例的属性和方法,也可以使用类的属性和方法

    调用:只能由实例对象调用

    2.类方法

    定义:使用装饰器@classmethod。第一个参数是“cls”,通过它可以使用类的属性和方法,但不能传实例的属性和方法

    调用:类对象或实例对象都可以调用

    3.静态方法

    定义:使用装饰器@staticmethod。参数随意,没有“self”和“cls”参数,方法体中不能使用类或实例的任何属性和方法

    调用:类对象或实例对象都可以调用

    问题8:多线程、多进程区别

    进程和线程的主要差别在于它们是不同的操作系统资源管理方式。

    进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。

    线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,

    所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

    1) 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

    2) 线程的划分尺度小于进程,使得多线程程序的并发性高。

    3) 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

    4) 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

    5) 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

    问题9:了解过装饰器吗

    本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。

    简单的说装饰器就是一个用来返回函数的函数。

    它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能

    14、UI自动化

    问题1:Python+selenium+unittest+po模型+excel/文本

    1、思路(框架)脚本怎么写的--脚本设计思路:

    那么我讲一下我的UI自动化的一个脚本设计思路,从整体框架设计思路来看,要做到数据、业务流程的一个分离,那么也就是说脚本要分层设计,方便后续的维护。就拿我之前公司的自己做的一个框架分层,例如我们的路径层、数据层、公共层、用例层、用例执行层、还有报告层和工具层;

    公共层:主要是封装所有页面的公共类,例如一些登录、登出、连接数据库或者去本地读取数据的一些方法都会在公共层里面封装,

    路径层:主要是配置框架中所有目录的绝对路径,为了后面的方便调用

    数据层:主要是存放我们的数据,看是文本存放,还是Excel表格存放;

    如果是文本存放,用python里面的with open方法就可以读取,

    如果是Excel表格存放,用python里面的一个第三方模块xlrd模块来读取表格的数据,通过列表也好,变量接收然后根据时间业务去处理

    用例层:主要是基于unittest框架去组装用例的,unittest框架有setUp、tearDown,用于测试用例执行前的初始工作和执行测试用例之后的善后工作,用例都是以'test'开头命名方法,将流程层中构建好的流程,引用到测试用例中,一个流程就是一个测试用例,测试用例执行的顺序是按用例命名的ASC码进行

    执行用例层:主要是用来跑用例的(主要封装了自动搜索用例、并且通过runner对象运行测试用例并且生成测试报告)

    工具层:是用来放置第三方的模板的,因为用例执行的时候我不会去看着用例跑,也不可能看页面,我最终还是要去看报告,报告的话我当时是在网上下了一个html相关的报告,就是那个HTMLTestRunnerCN的一个第三方报告模块用;邮件的话也是一样的,有一个Emal模块可以去配置公司的邮箱,就可以发送邮件

    报告层:就是用来存放生成的测试报告的

    这些就是我的一个基本的封装思路

    2、ui自动化结合项目例子(无框架、无po):

    人人乐ui自动化

    购物车ui自动化

    问题2:定位方法

    1、id定位

    2、name定位

    3、class定位

    4、link_text主要用来定位链接

    #精准匹配、如果是a标签就用link_text定位元素,括号里写名字就行,click()方法实现点击事件

    5、partial_link_text定位 模糊匹配

    driver.find_element_by_partial_link_text('hao').click()

    6、JavaScript定位

    js="document.getElementById('kw').value='多测师'"

    driver.execute_script(js) 执行js execute_script()

    7、tag_name定位(标签名定位)

    ss=driver.find_elements_by_tag_name('input') #ss是个列表

    for i in ss:

    if i==ss[7]:

    i.send_keys('多测师')

    8、xpath 定位

    问题3:定位场景(按钮、下拉列表、窗口切换获取句柄、弹窗、frame框、下拉滚动条、自动化里的截图、)

    1、定位普通按钮,提交按钮,重置按钮,链接

    方法:先使用web元素定位方法定位元素,再使用click()方法进行点击

    driver.find_element_by_id('su').click()

    2、下拉框

    from selenium import webdriver

    import time

    driver=webdriver.Chrome()

    driver.get('http://127.0.0.1:8020/dcs_56/js/%E8%A1%A8%E5%8D%95%E6%A0%87%E7%AD%BE.html')

    driver.maximize_window()

    from selenium.webdriver.support.select import Select #先要引用select这个类

    ss=driver.find_element_by_xpath("//form[@id='dcs56']/p[6]/select[1]") #ss是定位到下拉框

    p=Select(ss) #根据类生成对象,传入ss这个参数

    time.sleep(3) #等待3秒再执行

    p.select_by_index(1) #深圳宝安校区,通过索引 p对象调用实例方法

    p.select_by_value('4') #广州校区,通过value值

    p.select_by_visible_text('上海校区') #上海校区,通过文本定位

    3、窗口切换

    ①切换窗口的第一种方法:利用列表的索引

    title01=driver.title #获取当前窗口的title--百度的title

    print(title01)

    handle=driver.current_window_handle #获取当前窗口的句柄(当前窗口为百度) CDwindow-449F356A9222957E06DBF41833D56C64

    all_handle=driver.window_handles #获取所有窗口的句柄 列表 ['CDwindow-449F356A9222957E06DBF41833D56C64', 'CDwindow-F7B135D5D7FD1DCA52706EDFD05A7CB8']

    driver.switch_to.window(all_handle[-1])

    title02=driver.title #获取切换窗口后的title

    print(title02)

    百度一下,你就知道

    淘宝网 - 淘!我喜欢

    ②切换窗口的第二种方法:遍历

    handle=driver.current_window_handle #获取当前窗口的句柄(当前窗口为百度) CDwindow-449F356A9222957E06DBF41833D56C64

    all_handle=driver.window_handles #获取所有窗口的句柄 列表 ['CDwindow-449F356A9222957E06DBF41833D56C64', 'CDwindow-F7B135D5D7FD1DCA52706EDFD05A7CB8']

    for i in all_handle: #百度和淘宝

    if handle!= i: #handle是当前窗口百度 当百度不等于淘宝时

    driver.switch_to.window(i) #切换窗口

    driver.find_element_by_link_text('天猫').click()

    4、弹窗

    输入型弹框,元素定位,切换到弹框,输入,点击确认或取消

    from selenium import webdriver

    from time import sleep

    driver =webdriver.Chrome()

    driver.get('E:\第二月课件\python-Selenium自动化\element\prompt.html')

    driver.maximize_window()

    driver.find_element_by_class_name('alert').click()

    sleep(4)

    a =driver.switch_to.alert #切换到alert弹框中

    a.send_keys('www.baidu.com') #输入型弹框:输入百度

    a.accept() #点击确认按钮

    a.dismiss() #点击取消按钮

    问题4:自动化的原理

    第三方库里有webdriver模块,加载一个类例如谷歌类,里面有方法可以调用对应浏览器驱动,打开对应浏览器谷歌,然后通过一些页面定位方法定位页面元素实现自动化

    问题5:做自动化时间、引入自动化时期

    自动化一般在回归测试中实现,当它的需求、功能、版本、页面比较稳定的情况下去进行,回归测试比较频繁的测试当中

    (这里所说的回归测试并不是传统的功能测试中的回归测试,而是一个项目迭代了很多版本后,一个新版本的上线,通过回归测试看看新版本有没有对旧版本造成影响)

    问题6:UI自动化的覆盖率 40%==50%

    问题7:自动化里的三种等待

    1)线程等待(drive sleep()):强制等待设定的时间,时间到了才会执行后面的代码

    2)隐式等待(driver.implicitly_wait()):在设置的等待时间中提前定位到了元素,就会立即结束等待,直接执行后面的代码,与sleep的区别在于不需要 等时间到了才执行。

    3)显示等待(WebDriverWait ):与隐式等待一样只要元素定位到了就可以结束等待,但是它与隐式等待的区别在于,根据设置的等待时间,每隔一段时间(比如0.5秒)才会进行一次元素定位,累计时间到达设置的等待时间若还没定位到,则会报错

    问题8:unittest中断言方式

    self.assertEqual(title,u'百度一下,你就知道') #断言实际结果和预期结果是否一致 (一致的,不报错;不一致,报错)

    self.assertNotEqual(title,u'百度一下,你就知道') #断言实际结果和预期结果是否不一致

    (一致,报错;不一致,不报错)

    self.assertIn(title,u'百度一下你就知道') #断言当前title是否包含了此文本

    问题9:unittest框架(what、why、point)

    1、基本定义(什么是unittest框架)

    2、功能(为什么用--有使用过一些类,类的作用是什么)

    unittest.TestCaseTestCase类,所有测试用例类继承的基本类。

    unittest.main():将一个单元测试模块变为可直接运行的测试脚本,main()方法使用TestLoader类来搜索所有包含在该模块中以“test”命名开头的测试方法,并自动执行他们。根据ASCII码的顺序

    unittest.TestSuite():创建测试套件的。

    unittest.TextTextRunner():该类下面的run()方法来运行suite所组装的测试用例,入参为suite测试套件。

    unittest.defaultTestLoader():discover()方法可自动更具测试目录start_dir匹配查找测试用例文件(test*.py),并将查找到的测试用例组装到测试套件,因此可以直接通过run()方法执行discover。

    TextTestRunner:是用来执行测试用例的,其中的run(test)用来执行TestSuite/TestCase。测试的结果会保存在TextTestResult实例中

    setUp():setUp()方法用于测试用例执行前的初始化工作。如测试用例中需要访问数据库,可以在setUp中建立数据库连接并进行初始化。如测试用例需要登录web,可以先实例化浏览器。

    tearDown():tearDown()方法用于测试用例执行之后的善后工作。如关闭数据库连接。关闭浏览器。

    assert*():一些断言方法:在执行测试用例的过程中,最终用例是否执行通过,是通过判断测试得到的实际结果和预期结果是否相等决定的。

    addTest(): addTest()方法是将测试用例添加到测试套件中,如下方,是将test_baidu模块下的BaiduTest类下的test_baidu测试用例添加到测试套件。 

    3、具体使用过程中细节、注意点:用例必须test开头、用例执行按照ASC码进行

    问题10:setupclass和 setup、teardownclass和teardown区别

    ① setup():每个测试函数运行前运行
    ② teardown():每个测试函数运行完后执行
    ③ setUpClass():必须使用@classmethod 装饰器,所有test运行前运行一次

    ④ tearDownClass():必须使用@classmethod装饰器,所有test运行完后运行一次

    绑定对象不一样:set up class绑定类,setup绑定类里的方法,比如有10个方法,跑10

    使用角度:setupclass要装饰器@classmethod

    场景角度:不需要频繁对环境还原或者重置就不用setup,举例数据库自动化脚本增删改查,使用setup的话四个自动化脚本连接断开会发生四次,这个时候用setupclass,连接之后,将四个脚本运行完后断开,避免频繁向数据库发起连接请求,发起断开连接

    问题11:pytest框架(与unittest区别)

    一、用例设计规则

    1.unittest

    1)测试类必须继承unittest.TestCase

    2)测试函数必须以"test_"开头

    3)测试类必须有unittest.main()方法

    2.pytest

    1)测试文件的文件名必须以"test_"开头,或者以"_test"结尾

    2)测试类命名必须以"Test"开头

    3)测试函数名必须以"test"开头

    测试类里面不能使用"__init__"方法

    二、断言的区别:

    Unittest断言丰富多()pytest就一个assert

    三、用例前置和后置

    1.unittest前置和后置

    1)通过setup每个用例执行前执行,teardown每个用例执行后执行

    2)通过setupclass类里面所有用例执行前执行,teardownclass类里面所有用例执行后执行

    2.pytest前置和后置

    1)模块级别:setup_module/teardown_module,整个.py全部用例开始前执行/全部用例执行完后执行

    2)函数级别:setup_function/teardown_function,只对函数级别生效,每个用例开始前和结束后执行一次

    3)类级别:setup_class/teardown_class,只对类级别生效,类里面所有用例开始前执行一次,所有用例执行完执行一次

    4)方法级别:setup_method/teardown_method,只是类里面方法级别生效,方法开始前执行一致,方法结束后执行一次

    四、生成报告方式

    1.unittest:通过HTMLTestRunner生成

    2.pytest

    1)通过pytest-html生成html格式报告

    2)通过allure生成方案(很详细)

    问题12:脚本维护怎么做的

    1、用例脚本的命名规范,见名知意

    2、多加注释

    3、代码高效,尽量减少循环和嵌套,控制循环嵌套的层级

    4、让新建的脚本在不同的平台至少跑10次以上

    5、及时分享最新的脚本和编写的方法

    6、脚本中的数据与业务进行脱离,采用合理的框架设计方法

    问题13:自动化脚本跑多久时间

    15~20min

    (受当前脚本业务简单或复杂、网络状态影响)

    问题14:怎么排查自动化中问题

    1、手动测试下确定,看是不是因为业务发生变化,导致脚本发生错误,找不到对应的元素

    2、排查后从脚本着手,看是不是因为等待时间、元素属性值不唯一、元素定位变动、iframe框、弹窗的原因

    3、看日志,执行完用例后,通过查看报错信息,找出错误类型,比如有TypeError(类型错误)、SyntaxError(语法错误)、ConnectionError(连接错误)、AttributeError(属性错误)、KeyError(关键字错误)、ImportError/IoError(输入错误),找到这些报错之后,然后在看后面的具体的报错信息。

    4、举例:我记得有一次我在用xpath定位元素的时候,一般都是直接复制,但是我那个直接复制的定位不到,然后我就通过xpath找上级上上级的方式,自己输入,输入后运行报错,提示的是SyntaxError,语法错误,后面提示说我写的xpath定位的是不可以用的,所以我再次自习检查了下,原来找上上级的时候少写了一个层。

    问题15:自动化遇到的问题

    1、找不到元素,脚本报"NoSuchElementException:Unable to find element",或者"定位到了,不能操作,点击无效"

    解决思路:

    首先查看自己的"属性值"是否写正确

    元素的标签不唯一,默认找到第一个

    向上查看,元素是否在frame或iframe框架中

    检查元素属性是否是会变动的、是否是隐藏的

    2、脚本太多,执行效率太低

    Selenium脚本的执行速度受多方面因素的影响,如网速,操作步骤的繁琐程度,页面加载的速度,以及我们在脚本中设置的等待时间等。所以不能只去追求速度不保质量的测试,而是首先确保测试的稳定性,稳定地实现测试才是关键所在。

    解决思路:

    减少操作步骤,如经过三四步才能打开我们要测试的页面的话,我们就可以直接通过网址来打开,减少不必要的操作。

    中断页面加载,如果页面加载的内容过多,我们可以查看一下加载慢的原因,如果加载的内容不影响我们测试,就设置超时时间,中断页面加载。

    在设置等待时间的时候,可以sleep固定的时间,也可以检测某个元素出现后中断等待也可以提高速度。

    3、启动浏览器报错

    解决思路:几乎是由于浏览器版本与driver版本不匹配

    问题16:UI自动化流程

    1、自动化需求评审,确定场景,哪些场景要做自动化

    2、自动化环境的搭建,准备

    3、脚本的开发、编写

    4、执行自动化脚本

    5、分析

    6、报告

    问题17:接口自动化流程

    1、接口文档--需求

    2、环境

    3、脚本

    4、执行

    5、分析

    6、总结报告

    15、性能测试

    问题1:有没有做过性能,需关注的指标

    有,用jmeter工具做过接口性能

    性能测试要关注的指标:

    系统指标:响应时间、吞吐量、吞吐率、TPS、出错率

    资源指标:CPU、内存、带宽、IO(项目部署在电脑和手机上会消耗它们的内存、cpu、带宽)

    问题2:什么场景做性能,什么时候开始做

    针对一些用户量和访问量比较大的核心模块,业务使用量比较多的,这些模块功能实现就可以开始做

    问题3:性能测试流程

    需求

    环境准备

    脚本准备

    脚本执行

    分析

    总结

    1、确定好场景

    2、对场景进行分析(对场景进行描述)

    3、脚本的准备(通过jmeter构建好性能测试脚本)

    4、对脚本进行优化(断言,参数化,定时器,添加对应的监控)

    5、脚本的执行

    6、对执行结果进行分析,根据结果判断此次性能测试是否通过?通过的话就提交此次性能报告;不通过,找出此次性能的瓶颈问题,进行调优)

    问题4:性能测试有哪些及区别

    1、基准测试:在给系统施加较低压力时,查看系统的运行状况并记录相关数

    做为基础参考

    2、负载测试:负载测试是对被测系统不断增加压力(即用户并发数),直至性能指标

    超过预期或者某项资源使用达到饱和状态(就是加压到系统崩溃)。

    3、压力测试:压力测试是系统在一定饱和状态下,例如cpu、内存、磁盘I/O在饱和使

    用情况下,不断给系统施加压力,看系统的处理能力,以及系统是否会出现错误。

    4、稳定性测试:稳定性测试是在给系统施加一定压力,持续运行一段时间(7*24),

    观察系统能否稳定运行。(也可以说是长时间的压力测试)

    5、并发测试:并发测试是模拟多用户并发访问同一个应用、模块或者数据记录时可能

    发生的性能问题(如内存泄漏、线程锁和资源争用方面的问题)。

    6、容量测试(Volume Testing):确定系统最大承受量,譬如系统最大用户数,最大存储量,最多处理的数据流量等

    问题5:性能测试负责过的场景

    我做过首页访问、用户登录以及个人中心等场景的性能测试(并发用户大概500)

    问题6:性能测试具体怎么做的(听录音完善)

    使用badboy录制网站,保存为jmx--打开jmeter导入在badboy中保存的文件,会出现刚刚保存的接口,将线程数修改成虚拟用户数量,比如需要20个虚拟用户进行操作,线程数那里就填写为20,ramp-up period用来设置虚拟用户多久时间加载完成(10s,表示20个虚拟用户在10s内完成加载,每秒加载2个虚拟用户),循环次数设置每个线程发送请求的次数为2次、线程循环2次总共循环40次,就是发送了40次请求,时间等于20s

    1、确定好一个场景:以个人中心这个场景讲一下

    2、描述场景:通过对并发查询门户个人中心的测试,来测试服务器的压力测试,稳定性测试。压力测试对应收发包率,事务处理时间的指标。稳定性测试对应服务器的CPU,内存,磁盘,网卡运行指标。

    3、引入jmeter工具:通过jmeter工具添加线程组,构建好接口请求,添加http填入对应接口数据

    4、对脚本进行线程数的一个设置,在线程组中添加并发的用户数量200以及时间,通过定时器来集合这些用户,这里要注意的是定时器的时间要略大于线程组中的时间,且要注意时间单位之间的转换,然后是通过设置响应断言和查看断言结果来查看返回结果是否异常,再就是通过添加对应的监听器,查看结果树和聚合报告

    5、执行脚本

    6、查看结果树,聚合报告等对结果进行分析,分析此次性能测试是否通过,通过的话就提交此次性能测试报告,不通过的话找出此次性能的瓶颈,并进行调优。

    7、后续开发同事完成调优之后,我们再次进行回归测试

    问题7:QPS和TPS区别

    QPS:每秒sql的执行数

    TPS:每秒的事务数

    点击提交是一次TPS,可能访问服务器是很多次的QPS

    访问一个页面会请求服务器3次,一次放,产生一个“T”,产生3个“Q”

    问题8:并发数据、压测数据哪里来的

    性能需求文档里面会提到相关数据、客户那边会提供相应的数据、业务那边会提供相应的数据,如果没有数据,在做性能测试过程中通过不同数据,100、200、500...看当前瓶颈所在

    问题9:性能环境问题

    一般有单独的一套性能环境,尽可能模拟线上的环境,几乎不用我们测试去搭建

    问题10:会不会性能调优、有没有测试过瓶颈问题

    会,以实际例子跟你讲下我的分析思路

    1、从数据库的角度(索引)

    2、从硬件分析

    3、从业务分析(代码)

    4、网络情况

    5、其他情况

    常见性能问题:

    一、压力测试中TPS一直上不去

    1、网络带宽

    在压力测试中,有时候要模拟大量的用户请求,如果单位时间内传递的数据包过大,超过了带宽的传输能力,那么就会造成网络资源竞争,间接导致服务端接收到的请求数达不到服务端的处理能力上限。

    2、连接池

    可用的连接数太少,造成请求等待。连接池一般分为服务器连接池(比如Tomcat)和数据库连接池(或者理解为最大允许连接数也行)。(关于连接池的具体内容,可参考之前的博客:性能测试:连接池和线程)

    3、数据库配置

    高并发情况下,如果请求数据需要写入数据库,且需要写入多个表的时候,如果数据库的最大连接数不够,或者写入数据的SQL没有索引没有绑定变量,抑或没有主从分离、读写分离等,就会导致数据库事务处理过慢,影响到TPS。

    4、硬件资源

    包括CPU(配置、使用率等)、内存(占用率等)、磁盘(I/O、页交换等)。

    5、业务逻辑

    业务解耦度较低,较为复杂,整个事务处理线被拉长导致的问题。

    、容量(压力)测试过程中cpu过高----这个要考虑压了多少用户

    结果:cpu却到了80%多,指标是不能超过60%。

    解决思路:如果是cpu过高,先把消耗cpu最多的进程找出来(top命令),再找到该线程下消耗cpu过高的是哪几个线程,再把该线程处理掉

    三、内存溢出(堆溢出、栈溢出、持久代溢出)

    解决思路:1、调整堆内存参数,一般是增加堆内存

    2、减少批处理数据量

    四、线程死锁:容量(压力)测试压测一段时间后,报连接超时

    解决思路:

    1、造成这种现象的原因很多,比如带宽不够,中间件线程池不够用,数据库连接池不够,连接数占满等都会造成连接不上而报超时 错误

    2、找到死锁的线程,分析对应的代码

    五、数据库死锁

    解决思路:

    1、造成这种现象的原因很多,比如带宽不够,中间件线程池不够用,数据库连接池不够,连接数占满等都会造成连接不上而报超时错误。

    2、(重点)数据库日志中搜索block,能搜到block的话就是存在数据库死锁,找到日志,查看对应的sql,优化造成死锁的sql。

    六、数据库连接池不释放

    上一次是通过日志分析或者查看代码,数据库连接部分是不是有创建连接但是没有关闭连接的情况。基本就是这种情况导致的,修改代码即可。

    问题11:压力测试并发的值在什么范围内(258原则)

    2s--5s--8s

    淘宝:200个用户在10秒钟之内同时访问,平均的响应时间是283毫秒,最大的响应时间是547毫秒,最小的响应时间是246毫秒,错误率为0

    公司项目:200个用户在10秒钟之内同时访问,平均的响应时间是16754毫秒也就相当于是16秒,最大的响应时间是47秒,最小的响应时间是564毫秒。

    公司项目:到500个用户10秒钟之内同时访问,最大响应时间是122秒,最小响应时间是542毫秒,且有百分之14.14的错误率,也就是说500个用户是有用户请求响应是失败的

    结论:性能有待提高

    问题12:性能测试需关注指标及含义

    接口平均响应时间average:

    客户端发出请求,到接收到返回的时间。比如我访问baidu.com,按下enter之后等了1s打开了百度首页,那响应时间就是1s。这个过程的时间包括=网络传输时间+服务处理请求时间

    并发用户数samples:

    所有用户在同一时间点进行同样的操作,一般指同一类型的业务场景,比如1000个用户同时登陆系统

    系统用户数:5000用户(备注:一般指的是数据库存在的注册用户数)

    在线用户数:500用户(备注:在线用户数指挂在系统的用户,不会对服务器产生压力)

    并发用户数:取在线用户数的%5==》25(备注:并发用户一定会对服务器产生压力)

    吞吐量throughput:指单位时间内系统处理用户的请求数

    性能计数器:描述服务器或操作系统性能的一些数据指标,比如:内存、CPU、磁盘等资源使用率等

    TPS:

    Transaction Per Second:每秒事务数,指服务器在单位时间内(秒)可以处理的事务数量,一般以request/second为单位;

    PS:QPS是查询,而TPS是事务,事务是查询的入口,也包含其他类型的业务场景,因此QPS应该是TPS的子集

    问题13:jmeter用过哪些配置元件

    ①http请求默认值:在对多个接口测试的时候,如果每增加一个接口就去写一次服务器地址,那么就会觉得很烦。http请求默认值的作用就是填上测试的地址,之后就可以应用于所有的接口了

    ②HTTP Cookie管理器:就是一个存储Cookie的配件,可应用于这个线程组内的所有请求。添加这个配件,登录返回的Cookie就会被存储,接着应用于线程组内的所有请求.

    ③用户参数:在对多个接口测试的时候,如果接口之间需要传递相同的参数,那么可以用这个元件。在做压测时,如果要使每次传递的参数不一致,那么就得勾上“每次迭代更新一次”。

    ④用户定义的变量:在对多个接口测试的时候,如果接口之间需要传递相同的参数,那么可以用这个元件。用户定义的变量和用户参数有所不同,无论并发多少次,用户定义的变量每次的传参都是一样的

    ⑤正则表达式:第一个接口返回的内容需要作为下一个接口的参数,那么就可以使用正则表达式

    ⑥察看结果树:察看接口的请求以及响应

    问题14:jmeter参数化(两种方式)

    1、用户参数

    a、在前置处理器中添加一个用户参数,在里面去添加变量给参数

    b、http请求入参引用变量,${}

    2、利用配置原件CSV Data Set Config/CSV

    a、添加一个配置原件CSV Data Set Config

    b、引用本地配置文件路径(本地txt或cvs文档里添加参数)

    c、添加变量名

    问题15:jmeter定时器、断言怎么用

    ①定时器

    jmeter中使用synchronizing timer实现集合点的功能,模拟多用户并发测试,即多个线程在同一时刻并发请求

    线程组右键添加定时器synchronizing timer

    将参数设置 number of simulated users to group by 一般设置为和虚拟用户相同

    timeout in milliseconds:超时时间设置 如果这里没有设置,一旦没有达到集结数量的请求系统就一直等待

    计算超时时间的方法:并发数量*1000毫秒/线程数/在多少时间启动这么多线程

    ②断言

    断言--响应断言--响应文本--包括--要测试的模式(写上你需要断言的文本内容)

    问题16:常用的性能指标插件

    1. jp@gc - Bytes Throughput Over Time:不同时间吞吐量展示(图表) 聚合报告里,Throughput 是按请求个数来展示的,比如说1.9c,就是每s发送1.9个请求;而这里的展示是按字节Bytes来展示的 图表

    2. jp@gc - Composite Graph: 混合图表 在它的Graphs里面可以设置多少个图表一起展示,它可 以同时展示多个图表

    3. jp@gc - Hits per Second:每秒点击量

    4. jp@gc - PerfMon Metrics Collector:服务器性能监测控件,包括CPU,Memory,Network, I/O等等

    5. jp@gc - Reponse Latencies Over Time:记录客户端发送请求完成后,服务器端返回请求之前这 段时间

    6. jp@gc - Reponse Times Distribution: 显示测试的响应时间分布,X轴显示由时间间隔分组的响 应时间,Y轴包含每个区间的样本数

    7. jp@gc - Transactions per Second: 每秒事务数,服务器每秒处理的事务数

    问题17:jmeter聚合报告名词解释

    聚合报告:生成此次性能的测试数据报告

    Samples:测试一共发出的请求 ,虚拟用户循环次数

    Average:平均响应时间,是单个Request的平均响应时间

    Median:中位数,50%用户的响应时间在小于该值,这个值是指把所有数据由小到大将其排列,就是

    排列在第50%的值。

    90%line:90%用户的响应时间小于该值,这个值是指把所有数据按由小到 大将其排列,就是排列在第

    90%的值。

    Min:最小响应时间

    Max:最大响应时间

    error%:错误的请求数/请求总数

    Throughput:吞吐量---每秒完成的请求数

    KB:耗流量,每秒从服务器端接收到的数据量

    16、python+pymysql操作数据库

    问题1:python操作数据库哪些方法

    对象db调用cursor方法创建一个游标对象

    游标对象调用fetchone方法获取执行后的结果,fetchone方法只会返回第一行数据

    r.fetchall()执行多个sql语句,获取的是剩余的结果中所有的数据

    r.fetchmany(size=3)默认获取剩余结果中第一行数据,也可指定获取size=n行数据

    execute():方法执行SQL语句

    实例:

    import pymysql #导入pymysql库

    # 下载安装:pip3 install pymysql/pycharm里面直接搜索下载

    # 根据pymysql库里面的Connection类创建一个数据库连接对象

    # host:mysql服务器ip地址

    # user:登录数据库用户名

    # password:登录数据库密码

    # database:库名称

    # port:端口号3306

    # charset:字符集编码

    db=pymysql.Connection(host='192.168.188.128',user='root',password='123456',database='bbs',port=3306,charset='utf8')

    r=db.cursor() #通过对象db调用cursor方法创建一个游标对象

    # #游标作用:1、执行sql语句 2、获取执行后的结果

    sql='select * from aa'

    r.execute(sql) #先通过游标对象调用execute方法执行sql语句,没有返回结果

    value01=r.fetchone() #然后再通过游标对象调用fetchone方法获取执行后的结果,fetchone方法只会返回第一行数据

    value02=r.fetchall() #获取的是剩余的结果中所有的数据

    value03=r.fetchmany(size=3) #默认获取剩余结果中第一行数据,也可指定获取size=n行数据

    问题2:获取游标方法

    通过对象db调用cursor方法创建一个游标对象

    游标作用:1、执行sql语句 2、获取执行后的结果

    (游标:SQL的游标是一种临时的数据库对象,即可以用来存放在数据库表中的数据行副本,也可以指向存储在数据库中的数据行的指针,游标的一个常见用途就是保存查询结果,以便以后使用(游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果)

    17、APP自动化

    问题1:app测试和web测试区别

    相同:采用测试基本理论大同小异,都有测试文档的输出,都需要经过需求分析-测试计划-编写测试用例-执行测试用例-输出测试报告等流程;都需要进行功能测试、性能测试、安全测试、GUI测试等测试类型

    不同:

    1、兼容性:web--系统、浏览器,app--手机品牌、手机系统、同一系统不同版本、屏幕大小、屏幕分辨率

    2、交叉事件:在操作某个软件的时候,来电话、来短信、电量不足提示等外部事件。

    3、操作类型:横屏、竖屏、手势测试

    4、网络测试:不同网络下app功能的实现,弱网测试(①实体手机,封闭场景:电梯、地铁②fiddler控制弱网)

    5、安装升级测试:WEB测试基本上没有客户端层面的安装测试,升级测试的提醒机制,升级取消是否会影响原有功能的使用,升级后用户数据是否被清除了

    6、性能测试,在WEB测试只需要测试响应时间这个要素,在App测试中还需要考虑流量测试和耗电量测试

    问题2:测app角度、测app怎么测(百度完善)

    1、功能测试:

    运行、注册、登陆、启动、应用的前后台切换、免登陆、数据更新、离线浏览、定位,照相机服务、时间测试(以服务器时间为准)、Push测试,就是把APP信息推送到手机上

    2、ui界面

    3、易用性(用户体验)

    4、兼容性

    5、安全性

    6、稳定性

    7、性能

    8、安装,卸载,升级测试

    9、交叉事件测试

    问题3:弱网测试怎么测

    1、手机改变相关网络(2g\3g\4g\5g\wifi\热点)

    2、Fiddler模拟弱网环境

    打开Fiddler,Rules->Performance->勾选 Simulate Modem Speeds,勾选之后访问网站会发现网络慢了很多

    3、Fiddler弱网的原理

    Rules—>Cutomize Rules打开CustomRules.js文档,在文件中搜索关键字,m_SimulateModem

    首先来判断m_SimulateModem是否为true,也就是是否设置了弱网模式。

    如果为弱网模式。则分析代码

    oSession[“request-trickle-delay”] = “300”;注释的也很明白,Delay sends by 300ms per KB uploaded.上传1KB需要300ms,转化一下上传速度:1Kb/0.3s = 10/3(KB/s)

    设置上传的速度为50KB/s,需要设置Delay时间为20ms

    限制上传的速度,调整oSession[“response-trickle-delay”]即可

    设置完成后,清空原有的log,并使用你的app进行弱网条件下的操作

    问题4:手机抓包操作

    同一wifi

    代理,改端口号

    问题5:adb指令(占用端口号5037)

    查看当前连接设备: adb devices

    连接夜神模拟器:adb connect 127.0.0.1:62001

    查看自己安装的app包名:adb shell pm list packages(或者安卓系统中:文件管理器访问目录/data/data下,文件夹即为包名)

    断开无线连接: adb disconnect

    adb指令查app版本:adb shell pm dump apk包名 | grep "version"

    安装apk文件: adb install  xxx.apk

    卸载APP:adb uninstall +包名

    app封装.noteadb devices 列出当前所有可连设备

    adb get-state获取设备状态(device(连接正常),offline(连接异常),unknown(未连接))

    adb kill-server(关闭adb服务) , adb start-server(启动adb服务)

    adb shell进入linux

    adb logcat(显示安卓系统日志)

    adb install(安装应用)带参数-r表示覆盖安装,后面接APK包名称adb install baiduwangpan_589.apk

    adb uninstall(卸载应用)带参数-k表示卸载后保留数据和缓存,后面接包路径adb uninstall com.baidu.netdisk

    adb reboot(重启手机)

    adb reboot-bootloader(重启手机进入fastboot模式)

    adb recovery(重启手机进入刷机模式)

    adb pull /sdcard/xingyongbao.apk:将手机(模拟器)中的文件发送到本地,存放路径就是你的当前dos路径

    adb push xx.apk /sdcard/将本地文件拷贝到模拟器和手机中

    问题6:安卓版本、常见机型

    问题7:测app常见问题

    1、app出现ANR(无响应)根本原因

    ①主线程执行了耗时操作,比如数据库操作或网络编程

    其他进程(就是其他程序)占用CPU导致本进程得不到CPU时间片,比如其他进程的频繁读写操作可能会导致这个问题。

    细分的话,导致ANR的原因有如下几点:

    1.耗时的网络访问

    2.大量的数据读写

    3.数据库操作

    4.硬件操作(比如camera)

    5.调用thread的join()方法、sleep()方法、wait()方法或者等待线程锁的时候

    6.service binder的数量达到上限

    7.system server中发生WatchDog ANR

    8.service忙导致超时无响应

    9.其他线程持有锁,导致主线程等待超时

    10.其它线程终止或崩溃导致主线程一直等待。

    2、App出现crash(崩溃)原因

    1.内存管理错误:可能是可用内存过低,app所需的内存超过设备的限制,app跑不起来导致App crash。或是内存泄露,程序运行的时间越长,所占用的内存越大,最终用尽全部内存,导致整个系统崩溃。亦或非授权的内存位置的使用也可能会导致App crash。

    2.程序逻辑错误:数组越界、堆栈溢出、并发操作、逻辑错误。

    e.g. app新添加一个未经测试的新功能,调用了一个已释放的指针,运行的时候就会crash。

    3.设备兼容:由于设备多样性,app在不同的设备上可能会有不同的表现。

    4.网络因素:可能是网速欠佳,无法达到app所需的快速响应时间,导致app crash。或者是不同网络的切换也可能会影响app的稳定性。

    3、处理app出现crash或者ANR操作

    可以先把日志过滤出来: adb logcat | findstr xxxxx(过滤日志信息) ,然后再搜索其中的关键字,比如:exception、crash,看看是那些方法或者异常导致了问题的发送,初步定位问题原因后,可以交给开发人员去具体查找深层原因并修复。findstr:文本搜寻)

    问题8:app自动化(Python +appium)听录音

    1、Appium原理

    appium是cs架构,由客户端和服务端组成,用python做客户端,在Python中写脚本执行,提交给移动设备,移动设备(根据图讲)

    ①appium client执行脚本,appium server把请求转发到bootstrap.js或者是bootstrap.jar

    ②然后由bootstrap驱动UiAutomation或者UiAutomator去设备上完成具体的命令操作。

    ③把执行结果通过bootstrap.js或者是bootstrap.jar返回给appium server

    ④最后由appium server发送给appium client。)

    2、手机定位元素怎么定位

    id定位:对应为resrouce-id属性

    name定位:对应为text属性

    xpath定位

    class_ name定位:对应为class属性

    accessibility_ id 定位:对应为content-desc属性

    CSS定位

    link定位

    tag定位

    partial link定位

    问题9:手机定位(上下左右滑动)

    向上滑动,x不变,y由大到小,向下滑动,x不变,y由小到大

    向左滑动,y不变,x由大到小,向右滑动,y不变,x由小到大

    def getSize():

    x = driver.get_window_size()['width'] #获取屏幕宽

    y = driver.get_window_size()['height'] #获取屏幕高

    return (x, y)

    #屏幕向上滑动

    def swipeup(t):

    l = getSize() #l是上面函数中返回的屏幕大小,l=(x,y) x是屏幕宽,y是屏幕高

    x1 = int(l[0] * 0.5) #宽只能乘以小于1的,0是索引位,l中的第一个是x

    y1 = int(l[1] * 0.75) #y1大于y2,1是索引位,l中的第二个是y

    y2 = int(l[1] * 0.25)

    driver.swipe(x1, y1, x1, y2, t) #x不变,y由大到小

    swipeup(1000) #t=1000 t是时间

    #屏幕向下滑动 def swipedown(t)

    driver.swipe(x1, y2, x1, y1, t)  #y由小到大

    swipedown(1000)

    #屏幕向左滑动

    def swipLeft(t):

    l=getSize()

    x1=int(l[0]*0.75)

    y1=int(l[1]*0.5)

    x2=int(l[0]*0.25)

    driver.swipe(x1,y1,x2,y1,t) #x由大到小

    #屏幕向右滑动 

    def swipRight(t)

    driver.swipe(x2,y1,x1,y1,t) #x由小到大

    问题10:网络测试流程

    step1:首先要考虑网络正常的情况

    ①各个模块的功能正常可用

    ②页面元素/数据显示正常 

    step2:其次要考虑无网络的情况

    ①APP各个功能在无网络情况下是否可用

    ②APP各个页面之间切换是否正常

    ③发送网络请求时是否会导致闪退、卡死等异常情况

    ④APP各个页面是否显示完整美观,未刷新的页面是否做了相应的提示和处理

    ⑤在无网络情况下数据是否会丢失

    ⑥无网络提示信息是否友好

    step3:再次考虑弱网情况

    ①弱网情况下APP是否针对请求做了超时处理

    ②网络延迟的情况下,操作app进行数据同步、OTA升级是否会发生Crash、ANR 等严重错误

    ③弱网情况下,APP请求回调未完成时,执行其他动作以及交互时,是否会出现APP 闪退(如:驾考IOS开屏闪退)等异常。

    ④弱网情况下,原始数据是否出现丢失的情况(弱网下载时会出现丢包情况)

    ⑤弱网环境下,是否会出现请求堆积的情况

    ⑥弱网环境下,APP各个页面是否显示完整

    ⑦系统超时,提示信息是否清晰明确

    ⑧弱网情况下APP的响应时间是否在一个合理的时间范围内

    ⑨请求回调未完成--驾考科四难题攻克弹窗

    ⑩这个弹窗是服务器说了算,服务器知道该用户啥时候弹弹窗。若用户在做题页面时返回了,则该用户下次进入且在服务器缓存时间内,应该给出弹窗(产品逻辑:弹窗出现后用户必须看到才消失)

    ⑪请求堆积:水池注水排水问题

    step4:最后考虑网络状态之间的转变

    ①断开网络连接以后,操作APP各个功能是否正常

    ②同步数据过程中,断开网络连接,APP是否出现异常情况

    ③传输数据过程中,网络由wifi切换到gprs,APP是否出现异常情况

    ④弱网环境下发送的请求是否在恢复网络以后出现重复提交的情况 

    18、个人

    1、辞职原因

    并非个人意愿吧,没啥业务了,感觉公司都快要倒闭了,工资都是勉强发的

    过完年跳槽的也多,竞争大

    2、个人职业规划

    短期规划:我现在是失业状态,尽快重新找到一份工作,快速融入新团体、胜任新工作

    接下来的话还是多学点技术或者学习跟项目相关的技术

    然后接触学习管理经验

    3、加班的看法

    正常情况情况下加班到八点半,九点十点都有看手里工作情况,周六周天看任务忙不忙

    加班福利

    任务没有完成或者说团队需要配合的情况下加班是义不容辞的,但是不喜欢那种无所事事无意义的强制加班

    4、期望薪资

    上家10.5

    范围 可谈

    5、到岗时间

    我这边是离职状态,时间上都可以,看贵公司安排

    贵公司当前项目做哪一块的

    贵公司招聘测试人员技术要求偏向哪一块

    公司团队规模

    哪家公司

    面试形式

    有无笔试、几轮

    笔试有没有相关资料、准备下

    招哪一块,复习哪一块

    问反馈

     

    Linux常用命令

    1、操作文件及目录指令:

    cd:  切换目录

    pwd: 显示当前目录的绝对路径

    touch: 创建文件   

    mkdir: 创建目录(-p创建递归目录)

    cp:  复制文件/目录(-r)

    mv:  移动文件/目录,修改文件/目录的名字

    rm -r/rm –rf/rm –rf * :删除

    cat: 查看文件类容

    more:分页显示文件内容,可前后翻页,显示查看进度百分比,自动退出

    less: 分页显示文件内容,可前后翻页,不显示查看进度,需手动退出

    head: 默认查看前十行(head –15 aa.txt)

    tail:默认查看后十行(tail -15 aa.txt)

    grep:在指定文件中查找包含指定内容的行(grep zhangsan a.txt==在a.txt文件中在查找包含zhangsan的所有行)

    ln –s: 建立软连接

    ln –d:  建立硬连接

    2、系统常用指令

    top:查看CPU使用情况(top –d 5 :每5秒刷新一次)

    data:显示系统当前时间

    df:查看磁盘使用率(df –h:带单位查看磁盘)

    free:查看内存使用情况

    ifconfig:查看当前ip地址

    ping:查看网络是否是通的

    du –sh +文件/目录:查看文件/目录的大小

    reboot:重启linux系统

    hostname:查看主机名

    shutdon –r:先关机,再重启(shutdown –h:关机后,不重启)

    ps –ef|grep +服务器名称:查看服务器进程

    kill -9 +进程号:杀死一个进程

    netstat –ntlp: 查看所有已开启的端口

    lsof -i :+端口号 查看当前端口被哪个服务占用

    netstat -tunlp|grep 查看指定的端口号的进程情况

    3、文件权限操作

    chmod  777 +文件名   修改文件权限

    chown ceshi01+文件名===修改文件或目录属主

    chgrp ceshi02+文件名====修改文件或目录属组

    4、压缩解压

    Zip包/unzip/gzip

    zip + xxxx.zip xxxx (文件)

    zip -r +目录.zip xxxx (目录)

    unzip xxxx.zip        (解压)

    gzip a.txt :压缩后面的文件或者文件夹

    gzip –d a.txt.gz :解压压缩的文件

    tar包(解压到指定路径 -C)

    tar –cvf  aa.tar  a.txt   #将a.txt文件压缩成一个aa的tar包

    tar –xvf  aa.tar

    tar –zcvf  aa.tar.gz  a.txt

    tar –zxvf  aa.tar.gz

    rpm -ivh xxxx.rpm (安装rpm包)

    5、修改文本

    r:替换光标所在处的字符

    R:从光标所在处开始替换(按esc键结束)

    set nu :显示行号

    set nonu:取消行号

    / +字符串(要搜索的关键字)

    tail –f +日志名 :查看实时日志(实时刷新日志)

    tail –f +日志名|grep error  #只查看错误日志(实时刷新错误日志)

    cat +文件名| grep error 查看(打印)文件中的错误信息

    购物车测试点:界面、功能、性能、兼容

    . 验证购物车界面设计

    界面设计验证点如下:

    1.界面设计是否美观,显示是否正常

    2.界面布局是否合理

    3.购物车入口数量设计是否合理(购物车需要引导用户付款,入口设计需要有此体现)

    4.购物车图标链接显示是否明显

    5.鼠标悬停购物车图标,是否有迷你购物车界面,显示是否正常

    . 购物车功能测试

    功能测试可以分为两个部分,验证内容如下:

     1.购物车基本功能

    – 添加商品

    1.是否能够添加商品

    2.添加单个商品数量是否有上下限

    3.添加商品种类是否有上下限

    4.添加同类型商品的不同规格商品显示是否分条显示

    5.加入购物车商品排序是否合理

    • 删除商品

    1.能否删除单类商品

    2.是否有快速删除多种商品方式(全选,删除)

    3.删除商品是否有确认提示

    • 跳转商品详情

    1.跳转商品图片显示是否正常

    2.跳转商品链接显示内容是否完整,是否过长

    3.点击图片或者链接是否能够跳转商品详情

    •编辑商品数量

    1.是否有通过+ -编辑商品数量方式

    2.是否有通过输入直接编辑商品数量方式

    3.编辑商品数量是否有上下限

    4.编辑商品数量是否考虑库存情况

    • 显示商品数量,金额,总额等

    1.商品加入购物车内是否和原价格一致

    2.商品数量显示是否正确

    3.选择商品总数是否正确

    4.选中商品价格总额是否正确

    •进入商品购物或结算

    1.购物车是否有进入购物链接

    2.购物车是否有进入结算链接

     2.购物车业务功能

    – 购物车与用户模块关联

    1.未登录用户是否可以添加商品到购物车

    2.未登录用户添加商品到购物车,登录后是否将商品合并到用户购物车

    3.若不允许未登录用户添加商品到购物车,点击加购物车后是否有登录提示

    4.用户有会员折扣时,购物车内商品价格是否对应

    • 购物车与商品订单模块关联

    1.加入购物车商品有价格调整,购物车内商品价格是否跟随变化

    2.加入购物车商品,库存变化时购物车是否有对应调整

    3.购物车商品确认订单后是否会从购物车清除

    4.订单价格是否与购物车内一致

    • 购物车与优惠活动模块关联

    1.商家发放用户优惠券购物车对应变化

    2.商品满减活动,购物车价格对应变化

    . 购物车非功能

    购物车非功能测试可以从多方面进行考虑,举出部分进行说明,验证内容如下:

     1.性能

    1.进入购物车页面 消耗时长

    2.添加商品到购物车时长

    3.进入购物车结算时长

    4.对购物车页面内容变更,页面内容更新速度。(增加某个购买数量,页面对应显示更新速度)

     2.兼容性

    1.不同设备上显示和使用是否正常

    2.不同浏览器显示和使用是否正常

    第三方支付测试点

    一、在支付金额上

    1、金额的最小值 :如0.01

    2、无实际支付意义的金额:如0元订单

    3、支付金额错误:格式错误 、数字错误(支付金额为负数)

    4、超大金额 :设置的最高金额上限。(如微信红包单个最大值为200等)

    5、余额小于实际需要支付的金额

    6、银行卡或其他设置当日消费金额或者是单笔消费金额超限

    二、支付接口上

    关于支付会设计到很多第三方接口的相关的事件。比如:支付宝 、微信、网银

    系统 、手机银行、POS机的终端服务 甚至是 扫码枪 等硬件设备也是有关系

    的。

    三、支付的操作问题上

    1、指纹支付

    2、免密支付

    3、账号+密码支付

    4、动态获取支付验证码支付

    5、银行卡号+密码绑定支付

    6、信用卡可能会设计到支付码等

    如今的支付方式多样化、快捷支付和银行卡支付之间的差异性。信用卡和普通储

    蓄卡之间的差异处。等都是需要考虑的。

    四、产品的容错性上(异常处理)

    1、如何处理退款

    2、支付时出现断网

    3、支付失败之后 如何补单和退单

    4、支付金额不足的情况下 ,充值后 是否可以继续支付

    5、持续点击 是否会出现多次扣款

    6、如果发生多次扣款,如何退款到支付账号

    第三方支付接口测试点

    1、订单是否可以正常提交

    2、同一订单是否可以重复提交

    3、提交的订单能否取消

    4、后台收到订单能否进行保存

    5、支付接口收到订单信息是否和提交订单信息一致

    6、点击确认支付,页面能否跳转至选择支付接口页面

    7、返回的订单页面,是否有订单信息

    8、点击确认支付,能否选择微信支付

    9、点击确认支付,能否选择支付宝支付10、点击确认支付,能否选择网银支付

    11、输入错误的密码能否支付成功

    12、不输入密码能否支付成功

    13、输入账号和密码不相符,能否支付成功

    14、连续多次输入错误密码,是否还能继续支付

    15、无网络状态下,能否扣款成功

    16、弱网状态下,能否扣款成功

    17、点击多次提交支付,能否多次扣款

    18、余额不足情况下

    19、扣款金额是否和订单金额一致

    20、后台商家能否收到支付成功消息

    21、支付成功后,页面是否跳转至指定页面

    22、支付成功后,订单状态是否更新为已付款

    人人乐ui自动化例子:

    例如:前端客户下了一个模式为自提的订单,

    系统这边生成订单到订单关闭的一个操作流程的

    首先需要导入selenium库,然后定义一个浏览器,从selenium库中导入webdriver模块,from selenium import webdriver

    因为我们平台默认是谷歌,所以这里是生成一个谷歌浏览器的对象  driver = webdriver.Chrome()

    通过对象调用get实例方法打开网页 driver.get('https://ip+端口号')  

    再通过对象调用maximize_window进行窗口最大化操作防止有元素定位不到的情况 driver.maximize_window()

    通过driver对象调用find_element_by元素的方法定位用户名的输入框和密码的输入框,然后send_keys输入用户名和密码

    driver.find_element_by_name('user').send_keys('ure006')

    driver.find_element_by_name('pwd').send_keys('123456')

    继续通过元素定位方法定位到登录按钮,click 登录按钮

    这里需要调用implicitly-wait进行等待,让页面进行加载

    加载完成后,同样通过元素定位到订单管理,click订单管理

    继续通过元素定位到备货单click备货单

    然后定位到一张备货单,用click进行点击操作

    然后定位到审核单据按钮,用click点击(此时订单状态为:打包中)

    然后复制上一步,继续用click点击审核单据(此时订单状态为:可提货)

    继续复制上一步,然后click审核单据(此时的订单状态为:已完成)

    以上就是从系统生成订单到订单完成的一个自动化流程

    购物车ui自动化例子

    比如说:添加某个商品入购物车

    1.首先需要导入selenium库,然后定义一个浏览器,从selenium库中导入webdriver模块,from selenium import webdriver

    2.我们平台默认是谷歌,所以这里是生成一个谷歌浏览器的对象  driver = webdriver.Chrome()

    3.通过对象调用get实例方法打开网页 driver.get('https://ip+端口号')  (备注:端口号是tomcat的端口号,因为测试环境是基于tomcat搭建的)

    4.再进行窗口最大化操作 driver.maximize_window() 防止有元素定位不到的情况

    5.通过元素定位到输入框 driver.find_element_by_id('user').send_keys('ure006') 输入用户名

    driver.find_element_by_id('pwd').send_keys('123456') 输入密码

    6.点击登录按钮 driver.find_element_by_link_text("登录").click()

    7.然后进行等待 driver.implicitly_wait(3) 让页面进行加载

    8.加载完成后,通过元素定位到搜索框 driver.find_element_by_id('p').send_keys('衬衫')

    9.点击搜索按钮 driver.find_element_by_link_text("搜索").click()

    10.选择一件商品 driver.find_element_by_class_name("J_ClickStat").click()

    11.通过xpath路径选择相应规格(尺寸/颜色)  driver.find_element_by_xpath("xpath路径").click()

    12.同样通过xpath路径来添加数量 driver.find_element_by_xpath("xpath路径").click()

    13.通过xpath来定位加入购物车按钮并进行点击 driver.find_element_by_xpath("//*[@id="J_LinkBasket"]").click()

    这就是添加商品进入购物车的主流程的自动化

  • 相关阅读:
    flask 使用Flask-SQLAlchemy管理数据库(连接数据库服务器、定义数据库模型、创建库和表) --
    flask 操作数据库(分类) --
    flask渲染模板时报错TypeError: 'UnboundField' object is not callable --
    flask用宏渲染表单模板时,表单提交后,如果form.validate_on_submit()返回的是false的可能原因 --
    flask 单个页面多个表单(单视图处理、多视图处理) --
    flask 单个表单多个提交按钮 --
    jython 2.7.1 版本开发历史
    TP v5中Url Compat模式
    乱弹
    改改"坏"代码
  • 原文地址:https://www.cnblogs.com/xiaolehua/p/16444092.html
Copyright © 2020-2023  润新知