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

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

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

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

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

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

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

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

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

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

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

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

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

3、需求

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

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

问题1:需求评审流程

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

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

问题2:如何分析需求

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

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

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

问题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测试阶段,回归测试阶段)

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

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

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

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

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

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

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

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

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

5、用例

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

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

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

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

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

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

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

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

用例覆盖率这一点的话

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

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

(1、确保文档没有缺陷

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

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

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

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

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

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

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

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

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

①用例谁写的谁执行

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

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

6、BUG、缺陷

问题1:bug流程

问题2:bug包含哪些信息

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

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

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

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

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

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

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

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

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

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

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

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

解决方法:

问题5:排查bug方法

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

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

查看日志文件

先进入到日志文件路径

cd/data/bizdata

然后打开日志内容

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

web测试定位Bug的方法

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

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

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

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

定位后端Bug

(1)查看报错日志

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

(2)查看数据库的数据

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

问题6:处理偶现bug

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

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

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

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

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

7、上线

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

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

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

上线前:

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

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

上线时:

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

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

上线后:

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

问题2:测试报告包含

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

测试报告包含:

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

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

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

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

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

6、测试风险:

8、项目

问题1:准备后台模块

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

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

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–15aa.txt)

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

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

ln–s:建立软连接

ln–d:建立硬连接

2、系统常用指令

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

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、文件权限操作

chmod777+文件名修改文件权限

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

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

4、压缩解压

Zip包/unzip/gzip

zip+xxxx.zipxxxx(文件)

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

unzipxxxx.zip(解压)

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

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

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

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

tar–xvfaa.tar

tar–zcvfaa.tar.gza.txt

tar–zxvfaa.tar.gz

rpm-ivhxxxx.rpm(安装rpm包)

5、修改文本

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

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

setnu:显示行号

setnonu:取消行号

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

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

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

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

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

Vim有哪三种模式及区别:

1.命令模式

作用:用于键盘输入命令

2.编辑模式

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

3.末行模式

作用:用于输入末行命令

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

单独查看内存:free-m

问题2:搭建环境

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

就用tomcat、数据库、jdk搭建

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

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

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

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

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

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

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

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

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

改端口号:viconf/server.xml--setnu--修改第70行port=“8080“为‘8081’--保存后退出

过滤端口号:cdetc/sysconfig--viiptables--复制端口号那一串到下一行,然后改为自己想要端口号即可

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

问题1:怎么导库导表

mysql-uroot-p123465testdb

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

问题2:DDL和DML

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

create,altertable,drop

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

insertinto,delete,select,update

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

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

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

Orderbydesc降序

Orderbyasc升序

Between

Limit

问题5:分页功能

select*fromtableNamewhere条件limit当前页码*页面容量-1,页面容量

两个参数:PageNo,PageSize

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

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

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

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

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

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

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

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

(同内连接)

问题7:外键

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

添加外键sql语句:altertabledcs2addCONSTRAINTfk_sidFOREIGN

key(sid)REFERENCESdcs1(id)ENGINE=INNODB

Altertable表名addconstraint外键名foreignkey(子表字段名)references父表(父表表名)

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

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

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

问题9:索引index

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

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

①创建普通索引:

createindexttondcs02(name);

②创建唯一索引:

createuniqueindexbbondcs02(money);

备注:

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

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

删除普通和唯一索引:altertabledcs02dropindextt;

③创建主键索引:

创建索引:altertabledcsaddprimarykey(id);

查索引:showindexfromdcs

删除索引:altertabledcsdropPRIMARYkey

问题10:视图view

createviewyyas(selectsex,scorefromdcs01);

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

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

showcreateviewyy;====查看视图

dropviewyy;====删除视图(备注:不能使用droptable去删除视图)

问题11:增删改查

增:insertinto+表名values(字段1value,字段2value,字段3value...)

删:deletefrom+表名where条件/truncate+表名/droptable+表名

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

问题12:存储过程

dropprocedureifexiststest01;

createproceduretest01(nint)

begin

declareiintdefault(selectcount(*)fromstudent);

declareaintdefault(selectmax(id)fromstudent);

declarecintdefault(selectmax(score)fromstudent);

declarebvarchar(20);

ifi>=nthen

select*fromstudent;

else

whilei

seta=a+1;

setc=c+1;

setb=concat('dcs',a);

insertintostudent(id,name,score)values(a,b,c);

seti=i+1;

endwhile;

endif;

end

calltest01(100)

11、接口

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

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

HTTP常见的状态码

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

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

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

比如200,表示请求成功

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

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

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

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

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

400表示请求的语法错误

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

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

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

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

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

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

一、传输信息安全性不同

二、连接方式不同

三、端口不同

四、证书申请方式不同

问题3:get和post的区别

get请求:

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

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

(3)请求的数据量比较小

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

post请求:

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

(2)安全性比较高

(3)请求的数据量比较大

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

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

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

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

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

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

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

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

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

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

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

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

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

InterconnectionReferenceModel,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,至此,完成四次挥手。

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

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

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

请求头信息:

post:请求的方法

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

host:请求服务器的网址url

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

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

Keep-Alive:表示持久连接

content_type:请求体类型

acceptEncoding:设置接受的编码格式

acceptlanguage:设置接受的语言

Cookie:记录客户端用户信息

响应头信息:

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

server:服务器名

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

content_type:设置响应体类型

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

1.协议

2.服务器的ip地址

3.端口号

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

5.参数

6.协议版本

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

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

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

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

①Jmeter

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

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

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

②Python+requests

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

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

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

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

4、进行断言

print('接口调用成功')

else:

print('接口调用失败')

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

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

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

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

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

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

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

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

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

1、用户参数

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

2、利用配置原件CSVDataSetConfig/CSV

a、添加一个配置原件CSVDataSetConfig

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、安全性错误:明文传输或者没对用户身份信息做校验

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打断点

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

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

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

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

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

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

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

问题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值是否能接通。

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

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处理速度快

①jmeter

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

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

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

(keytool-import-alias"my.store"-file"C:sersdministrator\Desktop证书\ca.cer"-keystoremy.store)

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

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

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

②python

importrequests

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

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

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

printresponse.status_code#返回状态码

printresponse.headers#返回响应头信息

printresponse.cookies#打印cookie信息

12、支付

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

这个需要自己去搭建一个mock服务,模拟接口返回数据,也就是我们常说的挡板服务。可以使用的工具有很多,比如在线版的easymock,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到现在的经过的秒数

sleep(3)#休眠单位是秒

②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里面的withopen方法就可以读取,

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

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

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

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

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)执行jsexecute_script()

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

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

foriinss:

ifi==ss[7]:

i.send_keys('多测师')

8、xpath定位

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

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

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

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

2、下拉框

fromseleniumimportwebdriver

importtime

driver=webdriver.Chrome()

driver.maximize_window()

fromselenium.webdriver.support.selectimportSelect#先要引用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)

百度一下,你就知道

淘宝网-淘!我喜欢

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

foriinall_handle:#百度和淘宝

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

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

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

4、弹窗

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

fromtimeimportsleep

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

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模块,加载一个类例如谷歌类,里面有方法可以调用对应浏览器驱动,打开对应浏览器谷歌,然后通过一些页面定位方法定位页面元素实现自动化

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

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

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

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

问题8:unittest中断言方式

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

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

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

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

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

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

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

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

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实例中

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运行完后运行一次

绑定对象不一样:setupclass绑定类,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生成

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

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

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

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

2、多加注释

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

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

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

15~20min

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

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

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

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

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

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

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

解决思路:

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

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

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

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

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

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

3、启动浏览器报错

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

问题16:UI自动化流程

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

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

3、脚本的开发、编写

4、执行自动化脚本

5、分析

6、报告

问题17:接口自动化流程

1、接口文档--需求

2、环境

3、脚本

4、执行

6、总结报告

15、性能测试

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

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

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

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

问题3:性能测试流程

需求

环境准备

脚本准备

脚本执行

分析

总结

(1、确定好场景

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

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

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

5、脚本的执行

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

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

做为基础参考

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

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

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

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

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

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

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

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

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

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

5、执行脚本

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

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

问题7:QPS和TPS区别

QPS:每秒sql的执行数

TPS:每秒的事务数

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

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

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

问题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

结论:性能有待提高

并发用户数samples:

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

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

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

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

TPS:

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

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

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

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

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

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

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

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

①定时器

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

线程组右键添加定时器synchronizingtimer

将参数设置numberofsimulateduserstogroupby一般设置为和虚拟用户相同

②断言

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

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

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

3.jp@gc-HitsperSecond:每秒点击量

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

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

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

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

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

排列在第50%的值。

90%的值。

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

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

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

16、python+pymysql操作数据库

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

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

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

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

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

execute():方法执行SQL语句

实例:

importpymysql#导入pymysql库

#下载安装:pip3installpymysql/pycharm里面直接搜索下载

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

#host:mysql服务器ip地址

#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*fromaa'

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--手机品牌、手机系统、同一系统不同版本、屏幕大小、屏幕分辨率

3、操作类型:横屏、竖屏、手势测试

4、网络测试:不同网络下app功能的实现,弱网测试(①实体手机,封闭场景:电梯、地铁②fiddler控制弱网)

5、安装升级测试:WEB测试基本上没有客户端层面的安装测试,升级测试的提醒机制,升级取消是否会影响原有功能的使用,升级后用户数据是否被清除了

问题2:测app角度、测app怎么测(百度完善)

1、功能测试:

2、ui界面

3、易用性(用户体验)

4、兼容性

5、安全性

6、稳定性

7、性能

8、安装,卸载,升级测试

9、交叉事件测试

问题3:弱网测试怎么测

2、Fiddler模拟弱网环境

打开Fiddler,Rules->Performance->勾选SimulateModemSpeeds,勾选之后访问网站会发现网络慢了很多

3、Fiddler弱网的原理

Rules—>CutomizeRules打开CustomRules.js文档,在文件中搜索关键字,m_SimulateModem

首先来判断m_SimulateModem是否为true,也就是是否设置了弱网模式。

如果为弱网模式。则分析代码

oSession[“request-trickle-delay”]=“300”;注释的也很明白,Delaysendsby300msperKBuploaded.上传1KB需要300ms,转化一下上传速度:1Kb/0.3s=10/3(KB/s)

限制上传的速度,调整oSession[“response-trickle-delay”]即可

设置完成后,清空原有的log,并使用你的app进行弱网条件下的操作

问题4:手机抓包操作

同一wifi

代理,改端口号

问题5:adb指令(占用端口号5037)

查看当前连接设备:adbdevices

连接夜神模拟器:adbconnect127.0.0.1:62001

查看自己安装的app包名:adbshellpmlistpackages(或者安卓系统中:文件管理器访问目录/data/data下,文件夹即为包名)

断开无线连接:adbdisconnect

adb指令查app版本:adbshellpmdumpapk包名|grep"version"

安装apk文件:adbinstallxxx.apk

卸载APP:adbuninstall+包名

app封装.noteadbdevices列出当前所有可连设备

adbget-state获取设备状态(device(连接正常),offline(连接异常),unknown(未连接))

adbkill-server(关闭adb服务),adbstart-server(启动adb服务)

adbshell进入linux

adblogcat(显示安卓系统日志)

adbinstall(安装应用)带参数-r表示覆盖安装,后面接APK包名称adbinstallbaiduwangpan_589.apk

adbuninstall(卸载应用)带参数-k表示卸载后保留数据和缓存,后面接包路径adbuninstallcom.baidu.netdisk

adbreboot(重启手机)

adbreboot-bootloader(重启手机进入fastboot模式)

adbrecovery(重启手机进入刷机模式)

adbpull/sdcard/xingyongbao.apk:将手机(模拟器)中的文件发送到本地,存放路径就是你的当前dos路径

adbpushxx.apk/sdcard/将本地文件拷贝到模拟器和手机中

问题6:安卓版本、常见机型

问题7:测app常见问题

1、app出现ANR(无响应)根本原因

①主线程执行了耗时操作,比如数据库操作或网络编程

细分的话,导致ANR的原因有如下几点:

1.耗时的网络访问

2.大量的数据读写

3.数据库操作

4.硬件操作(比如camera)

5.调用thread的join()方法、sleep()方法、wait()方法或者等待线程锁的时候

6.servicebinder的数量达到上限

7.systemserver中发生WatchDogANR

8.service忙导致超时无响应

9.其他线程持有锁,导致主线程等待超时

10.其它线程终止或崩溃导致主线程一直等待。

2、App出现crash(崩溃)原因

2.程序逻辑错误:数组越界、堆栈溢出、并发操作、逻辑错误。

e.g.app新添加一个未经测试的新功能,调用了一个已释放的指针,运行的时候就会crash。

3.设备兼容:由于设备多样性,app在不同的设备上可能会有不同的表现。

3、处理app出现crash或者ANR操作

可以先把日志过滤出来:adblogcat|findstrxxxxx(过滤日志信息),然后再搜索其中的关键字,比如:exception、crash,看看是那些方法或者异常导致了问题的发送,初步定位问题原因后,可以交给开发人员去具体查找深层原因并修复。(findstr:文本搜寻)

问题8:app自动化(Python+appium)听录音

1、Appium原理

appium是cs架构,由客户端和服务端组成,用python做客户端,在Python中写脚本执行,提交给移动设备,移动设备(根据图讲)

(①appiumclient执行脚本,appiumserver把请求转发到bootstrap.js或者是bootstrap.jar

②然后由bootstrap驱动UiAutomation或者UiAutomator去设备上完成具体的命令操作。

③把执行结果通过bootstrap.js或者是bootstrap.jar返回给appiumserver

④最后由appiumserver发送给appiumclient。)

2、手机定位元素怎么定位

id定位:对应为resrouce-id属性

name定位:对应为text属性

xpath定位

class_name定位:对应为class属性

accessibility_id定位:对应为content-desc属性

CSS定位

link定位

tag定位

partiallink定位

问题9:手机定位(上下左右滑动)

向上滑动,x不变,y由大到小,向下滑动,x不变,y由小到大

向左滑动,y不变,x由大到小,向右滑动,y不变,x由小到大

defgetSize():

x=driver.get_window_size()['width']#获取屏幕宽

y=driver.get_window_size()['height']#获取屏幕高

return(x,y)

#屏幕向上滑动

defswipeup(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由大到小

#屏幕向下滑动defswipedown(t)

driver.swipe(x1,y2,x1,y1,t)#y由小到大

swipedown(1000)

#屏幕向左滑动

defswipLeft(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由大到小

#屏幕向右滑动

defswipRight(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各个页面是否显示完整

⑦系统超时,提示信息是否清晰明确

⑨请求回调未完成--驾考科四难题攻克弹窗

请求堆积:水池注水排水问题

step4:最后考虑网络状态之间的转变

①断开网络连接以后,操作APP各个功能是否正常

②同步数据过程中,断开网络连接,APP是否出现异常情况

③传输数据过程中,网络由wifi切换到gprs,APP是否出现异常情况

④弱网环境下发送的请求是否在恢复网络以后出现重复提交的情况

18、个人

1、辞职原因

并非个人意愿吧,没啥业务了,感觉公司都快要倒闭了,工资都是勉强发的

过完年跳槽的也多,竞争大

2、个人职业规划

短期规划:我现在是失业状态,尽快重新找到一份工作,快速融入新团体、胜任新工作

然后接触学习管理经验

3、加班的看法

正常情况情况下加班到八点半,九点十点都有看手里工作情况,周六周天看任务忙不忙

加班福利

任务没有完成或者说团队需要配合的情况下加班是义不容辞的,但是不喜欢那种无所事事无意义的强制加班

4、期望薪资

上家10.5

范围可谈

贵公司当前项目做哪一块的

贵公司招聘测试人员技术要求偏向哪一块

公司团队规模

哪家公司

面试形式

有无笔试、几轮

招哪一块,复习哪一块

问反馈

Linux常用命令:

购物车测试点:界面、功能、性能、兼容

一.验证购物车界面设计

界面设计验证点如下:

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.购物车业务功能

–购物车与用户模块关联

4.用户有会员折扣时,购物车内商品价格是否对应

购物车与商品订单模块关联

1.加入购物车商品有价格调整,购物车内商品价格是否跟随变化

2.加入购物车商品,库存变化时购物车是否有对应调整

3.购物车商品确认订单后是否会从购物车清除

4.订单价格是否与购物车内一致

购物车与优惠活动模块关联

1.商家发放用户优惠券购物车对应变化

2.商品满减活动,购物车价格对应变化

三.购物车非功能

购物车非功能测试可以从多方面进行考虑,举出部分进行说明,验证内容如下:

1.性能

1.进入购物车页面消耗时长

2.添加商品到购物车时长

3.进入购物车结算时长

4.对购物车页面内容变更,页面内容更新速度。(增加某个购买数量,页面对应显示更新速度)

2.兼容性

1.不同设备上显示和使用是否正常

2.不同浏览器显示和使用是否正常

第三方支付测试点

一、在支付金额上

1、金额的最小值:如0.01

2、无实际支付意义的金额:如0元订单

3、支付金额错误:格式错误、数字错误(支付金额为负数)

5、余额小于实际需要支付的金额

6、银行卡或其他设置当日消费金额或者是单笔消费金额超限

二、支付接口上

系统、手机银行、POS机的终端服务甚至是扫码枪等硬件设备也是有关系

的。

三、支付的操作问题上

1、指纹支付

2、免密支付

3、账号+密码支付

4、动态获取支付验证码支付

5、银行卡号+密码绑定支付

6、信用卡可能会设计到支付码等

如今的支付方式多样化、快捷支付和银行卡支付之间的差异性。信用卡和普通储

蓄卡之间的差异处。等都是需要考虑的。

四、产品的容错性上(异常处理)

1、如何处理退款

2、支付时出现断网

3、支付失败之后如何补单和退单

4、支付金额不足的情况下,充值后是否可以继续支付

5、持续点击是否会出现多次扣款

6、如果发生多次扣款,如何退款到支付账号

第三方支付接口测试点

1、订单是否可以正常提交

2、同一订单是否可以重复提交

3、提交的订单能否取消

4、后台收到订单能否进行保存

5、支付接口收到订单信息是否和提交订单信息一致

6、点击确认支付,页面能否跳转至选择支付接口页面

7、返回的订单页面,是否有订单信息

9、点击确认支付,能否选择支付宝支付10、点击确认支付,能否选择网银支付

11、输入错误的密码能否支付成功

12、不输入密码能否支付成功

13、输入账号和密码不相符,能否支付成功

14、连续多次输入错误密码,是否还能继续支付

15、无网络状态下,能否扣款成功

16、弱网状态下,能否扣款成功

17、点击多次提交支付,能否多次扣款

18、余额不足情况下

19、扣款金额是否和订单金额一致

20、后台商家能否收到支付成功消息

21、支付成功后,页面是否跳转至指定页面

22、支付成功后,订单状态是否更新为已付款

人人乐ui自动化例子:

例如:前端客户下了一个模式为自提的订单,

系统这边生成订单到订单关闭的一个操作流程的

首先需要导入selenium库,然后定义一个浏览器,从selenium库中导入webdriver模块,fromseleniumimportwebdriver

因为我们平台默认是谷歌,所以这里是生成一个谷歌浏览器的对象driver=webdriver.Chrome()

再通过对象调用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')

这里需要调用implicitly-wait进行等待,让页面进行加载

加载完成后,同样通过元素定位到订单管理,click订单管理

继续通过元素定位到备货单click备货单

然后定位到一张备货单,用click进行点击操作

然后定位到审核单据按钮,用click点击(此时订单状态为:打包中)

然后复制上一步,继续用click点击审核单据(此时订单状态为:可提货)

继续复制上一步,然后click审核单据(此时的订单状态为:已完成)

以上就是从系统生成订单到订单完成的一个自动化流程

购物车ui自动化例子

比如说:添加某个商品入购物车

1.首先需要导入selenium库,然后定义一个浏览器,从selenium库中导入webdriver模块,fromseleniumimportwebdriver

2.我们平台默认是谷歌,所以这里是生成一个谷歌浏览器的对象driver=webdriver.Chrome()

4.再进行窗口最大化操作driver.maximize_window()防止有元素定位不到的情况

5.通过元素定位到输入框driver.find_element_by_id('user').send_keys('ure006')输入用户名

driver.find_element_by_id('pwd').send_keys('123456')输入密码

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()

THE END
1.驾校模拟开车能替代实际练车吗驾校模拟开车不能替代实际练车。模拟器虽有一定作用,比如能让学员在上车前练习手脚配合与动作协调,消除初期的紧张感,熟悉汽车的基本操作,还能模拟一些基本的https://www.pcauto.com.cn/ask/511562.html
2.多功能工程车仿真考核模拟机计算机多功能工程车仿真考核模拟机,工程车,计算机,仿真考核模拟机https://www.163.com/dy/article/JIJ3M4Q205567OHH.html
3.汽车模拟器吧百度贴吧共同了解,互相交流,期待您的参与本吧热帖: 1-汽车驾驶训练机交流咨询群:398372961 2-广州赣之韵?汽车模拟器源头厂家 3-汽车模拟器手游下载,好玩,在光环助手上就可以下载哦! 4-汽车驾驶模拟器——让你体验真实驾驶的快感! 北京紫光基业 5-驾驭未来,从大型特种车驾驶模拟训练系统开始! 6-一款颠覆想象的http://nba.baidu.com/f?kw=%E6%B1%BD%E8%BD%A6%E6%A8%A1%E6%8B%9F%E5%99%A8&ie=utf-8
4.公安部互联网交通安全综合服务管理平台平台是由公安部统一研发、各地公安机关交通管理部门部署运营,为交通参与者提供公安交管业务办理、预约、宣传,信息告知、查询等服务的“互联网+”便民利民服务平台 (详细服务内容)。交通参与者可以通过以下方式获取服务:1、访问平台网站。网站域名为“地方字母码.122.gov.cn”(点击下方网站导航链接);2、下载安装“交管12http://www.122.gov.cn/
5.摩托车科目一模拟考试2025全新的版摩托车科目一模拟考试2025全新的版告诉您通过2025科目一的考试技巧,元贝驾考提供摩托车科目一模拟考试2025全新的版信息,2025新版的摩托车科目一模拟考试2025全新的版助您快速通过摩托车科目一模拟考试2025全新的版科目一考试,摩托车科目一模拟考试2025全新的版就在元贝驾https://www.ybjk.com/ks/qekkk.htm
6.驾考摩托车宝典科目一全真模拟题下载驾考摩托车宝典APP2驾考摩托车APP是一款非常好用的摩托车驾考模拟宝典app,根据2023年摩托车驾考最新大纲出的题目,2023年摩托车全新题库全在这里了,随时随地都能在这里刷题,海量真题在线联系,提供多种刷题的方式,让那个大家可以随时边学边练,牢牢巩固你的知识,让你能够快速提分、轻松拿下驾照考试,快来下载吧! https://www.doyo.cn/app/425636.html
7.哈尔滨驾校网哈尔滨学车考驾照·科目一交规模拟考试C1 2021版 新 ·科目三安全文明模拟考试 2021版 新 ·客车驾照模拟考试A1 A3 ·货车驾照模拟考试B2 摩托车驾考技巧 [详细][名岛驾校拼团大][现报名学车还有][正通驾校学车便] 直角转弯的挂科原 科目三老是出现问 选了自动档出现问 科三备考到考试注 4月份科目三有变 科目二考http://heb.zyue.com/
8.练车软件免费下载模拟练车的app推荐驾考模拟练车的AppStore 下载简要:驾考模拟3d苹果版是对ios系统制定的一款模拟驾驶应用,该软件能够真实模拟路面考试的各种情况,特别是科二、科三都不用死记硬背的去记忆各个点位和繁琐的操作,只需要来这里多模拟几把试题就能把考试要点熟记于心,自然而然的就能轻松应对考试。 该https://www.ddooo.com/zt/hcrtjgd.htm
9.驾考模拟3D全地图车辆解锁版下载驾考模拟3D全地图版是一款驾驶手游,玩家将扮演一位驾考学员,在模拟的驾考环境中学习停车技巧和掌握停车方法。游戏画面精美细腻,车辆模型和场景设计都非常真实,让玩家感受到真实的停车环境。 驾考模拟3D全地图版介绍 驾考模拟停车达人是一款逼真模拟驾考停车的练手益智休闲游戏,让玩家在家中也能进行停车模拟训练。游戏采用https://m.qqtn.com/q/888137
10.模拟练车游戏大全练开车的游戏手机版驾校练车游戏下载驾校模拟练车游戏大全之中包含了非常多的可以让玩家练习开车,轻松面对驾考的开车游戏,非常多与科目二、科目三相似的游戏内容让玩家可以熟悉驾驶的过程轻松度过考试,科目二模拟、倒车入库等游戏玩法都可以在游戏合集之中的手游中体验到,为玩家考驾照增添更多的把握,真实的场景模拟也为玩家体验游戏增添了更多的游戏趣味.不http://www.downyi.com/key/liancheyouxi/
11.驾考模拟练车软件排行榜前十名偏玩手游盒子分享十大驾考模拟练车软件排行榜前十名手机应用,编辑为您推荐手机驾考模拟练车软件排行榜第一名到前5名到前十名的应用。找驾考模拟练车软件有哪些、驾考模拟练车软件哪个好用,上偏玩手游盒子https://m.pianwan.com/s/zj-2700539
12.弘达车会(弘达车会模拟驾考)V1.10安卓中文版弘达车会,弘达车会(弘达车会模拟驾考)应用程序是一个驾驶考试服务软件,驾考刷题就在弘达车会APP。弘达车会应用程序提供了一系列功能,例如注册,教练选择,任命培训和模拟考试,使您更容易测试驾驶执照。https://m.greenxf.com/a/306436.html
13.摩托车驾考app哪个好?摩托车驾考软件有哪些?摩托车驾照模拟考试摩托车驾考软件哪个好?考摩托车驾照下载什么软件好用2021?考摩托车驾照app推荐了几款免费的驾考刷题、考试应用。像元贝驾考,搜索指数非常高,题库丰富,支持在线模拟考试,是学员使用率比较高的一款驾考软件!其次就是驾考一点通,整合了历年驾校考试真题和模拟试题,口碑也非常好。还有车轮驾考通,可以免费练题和考试。除了http://www.downcc.com/k/mtcjkapp/