一、自我介绍
面试官您好!我叫xx,来自深圳,毕业之后一直从事于软件测试的工作,有做过保险、金融、电商等项目;有做过做功能测试、接口测试,自动化测试,在工作中积极主动、可以独立的完成测试工作、具有良好的沟通协调能力,我本人性格开朗、以上就是我的一个简单自我介绍,谢谢!
【自我介绍就自我发挥,注意的是时间不要太久,大概的情况说完就可以了】
二、讲解项目
项目概况:1、阳光保险_ (保险) 2、(萧山银行) 金融 3、宜和购物 (电商)
(1)项目1
阳光保险_保险系统(app+web)
讲解:
我最近做的保险系统按产品需求来做的;可分为车险、健康险、意外险、人寿险、财产险;我最近做的“爱满分互联网重疾险” ;
我们测试首先需要在后台:产品管理中使用操作新增产品;新增产品内容包含:产品代码、产品分类、产品状态、支付方式、生效时间、保险期限、适用年龄、接入方式等;然后对产品进行编辑,编辑审核之后进行提交,然后我们需要在前端页面查看是否显示提交成功的产品信息,如果没有则需要提bug,前端页面显示成功之后就可以进行投保(web、app、小程序、二维码)。
首先需要选择险种,然后系统会自动审核用户是否登录,未登录是需要用户先登录的,登录之后查看是否能够正确跳转页面,跳转到正确的页面会显示我们的一个保障详情
投保人了解完所有保障详情后点击立即投保后有弹框提示即将进入投保流程请仔细阅读相关的条款,这里需要投保人点击同意授权的弹框,点击按钮之后才能进行下一步操作,否则不能进行下一步的操作;
进入投保流程页面后投保人选择需要的投保套餐后需要输入相关投保信息,投保人必填项有投保类型、姓名、证件信息、电子邮箱、手机号、常住城市,这些信息都是采用等价类边界值的方法去校验的;
投保人信息填写完后还需要填写被保险人的信息,被保险人可选择本人、配偶、子女、父母中的其中一项,此时需要校验被投保人是否符合产品的保障范围,不在则需要重新填写,在保障范围的话则可以进行下一步操作
被保险人投保信息填写完成后系统会自动校验各项信息无误后会提示“符合本次投保条件”,然后勾选相关隐私协议后点击立即投保会跳转到订单支付页面,页面包含订单信息、支付信息,客户名称,到账截止时间,金额,然后请选择支付方式,支付方式为扫码支付,时间是倒计时30分钟,倒计时结束后仍未支付,界面就会提示支付时间已超时,二维码就会失效,不能继续支付,会以短信的形式提醒客户进行支付投保人支付完成后,,在数据库也会生成保单数据,去查看和和核对;保单会推送到核保一块的话我们是有专门负责核保的同事去做的;核保完成后保单会有生效的等待期,长期保险的等待期可能会有90天,一般意外险是次日点就开始生效,也就是T+1的生效模式,以上就是我的一个投保流程。
(2)银行项目
一、贷款业务
1、信贷系统主要分为贷前,贷中、贷后
我主要负责贷前:
新建贷款产品:如信用贷、房贷、车贷;三个产品
产品会在前端页面或H5,小程序显示产品,点击借款、填写借款细信息(姓名、身份证、手机号、借款金额、借款用途等)进行提交资料;
客户信息建立:后端对客户信息核对包含客户类型自然人、法人、客户号、姓名、性别,联系方式、影像资料上传等,在提交保存。
对公客户信用评级:个人授信额度申请(银联系统:通过造白名单、黑名单、)(授信额度分为:(1)循环额度(2)单一额度):客户号,客户名称和客户类型回显,其他输入框正常录入;授信模块===单一客户额度===授信额度申请===输入建立号客户号和信息==提交。
额度=根据基础信息额度+押品(质押和抵押);我们进入押品模块,信贷系统中押品的信息录入界面(添加具体押品信息,完善押品详细信息,录入押品价信息,完善押品权证信息)===循环额度建立==需要审批===审批流程(1、业务,金额核查人员,2、总经理,3、授信评审部、4、信贷审批委员会、5、总行行长)==评级流程(评级申请信息项,信用等级评估表,根据等级表获取机评分)====担保合同建立(新建最高额担保合同,)===合同签订===
出账申请====出账申请进入审批====通知出账(核心)====放款(贷款的发放:借款号。借款亏金额,交易金额,放款账号校验:如已销户、封闭冻结、禁止放款,放款金额大于合同金额)===会计分录
贷后:贷款回收===还款确认(封闭冻结,只收不付,久悬户)===主动还款(1.还款模式:主动部分还款或结清还款)===贷款展期(展期生效日等于交易日)===贷款核销归还(核销本金,核销利息)===
后台:(1)贷款展期查询 (2)核销信息查询(3)还款计划查询(4)贷款详细信息查询
(5)借据号查询(6)利息试算 (7)会计分录
(3)宜和购物
宜和购物电商系统:主要现在后端对商品管理、(新增商品、删除商品、修改产品等)、====有商品在前端显示、以后就可以点击产品查看详情页面(产品介绍、产品的库存、价格、购买数量、邮寄地址、立即购买、加入购物车等)====选择产品后点击立即购买=====校验用户是否登录(未登录跳转到登录界面)===输入账号,密码=======进入“确认订单信息”界面(商品数量、实际价格、地址等),显示待支付状态=========跳转到支付界面(选择支付方式:微信、支付宝、银行卡)===输入支付密码===点击确定=====支付成功====跳转“订单成功界面”显示订单详细==在我的订单终可以查看到订单状态”已支付代发货“==发货后,状态更改为(已发货、待签收)====订单签收后,状态更改为(已签收、待评价)====评价===(退换货),这就我做项目的大概流程;
负责订单系统:测试订单状态、订单的流转、订单数量、订单详细、订单显示、所有订单显示、部分订单查询、订单倒计时、订单的失效、订单的库存加减等
=======================================================
功能bug:
(1)你在保险中遇到什么bug?如何解决?
mr.xiao:
1、有意义bug:宜和购物
满减活动中:每满300减50
先拼单,在满减,在退货(假设三件,退两件),优惠劵正常使用,减免按比例减价,
解决方法:按比例退货
mr.xiao:
2、在投保中我们可以客户发起退单,后台商户可以发起退单,在我提交订单时候当出现自动退单时,后台没有统计订单数?
原因:订单的异常,不统计订单数量,也不做幂等处理,导致订单流失
解决方法:补偿机制、在此发送订单
mr.xiao:
3、统计成交单,失败单的数据,一周后退单,单天计算,把退单算成单天退单,造成当天的数据单错误?
解决方法:核销
编辑切换为居中
添加图片注释,不超过 140 字(可选)
=======================================================
接口
1、你做过接口测试?做过
2、做过哪些接口测试?
保险接口:
(1)、投保确认
入参:保单信息
返回参数:信息不符合要求返回相应的错误信息
信息符合要求,非见费单:返回保单号和保单激活状态码(70);见费单有预存保费返回保单号和保单已激活状态,没有足够的预存保费返回保单号和保单未激活的状态码(60)
(2)保单状态查询
入参:安联保单号码
返回参数:保单号、保单状态、保单总保费和各个被保险人的保费信息
(3)保单注销
入参:安联保单号码和保单注销信息
返回参数:校验成功后注销该张保单并返回成功信息
(4)保单查询
入参:安联保单号码
返回参数:返回属于该出单账号的该保单的信息
(5)保单打印
入参:安联保单号码
返回参数:返回该保单的二进制数据流;第三方渠道公司将返回的二进制数据流转化为PDF文件
(6)授权计划查询
入参:险种类型代码传
返回参数:返回该出单账号关联的渠道已授权了的此险种类型的计划列表信息
(7)计划明细查询
入参:计划代码
返回参数:计划的明细信息:包括基本信息,保障利益信息,费率表信息
(9)计划报价查询
入参:计划代码、开始日期和结束日期
返回参数:出单账号关联的渠道已授权了的此计划此时间段的儿童保费价格、成人保费价格和老人保费价格
编辑切换为居中
添加图片注释,不超过 140 字(可选)
3、你如何做接口?(postman、jmeter、python+request)
(1)==单个接口:
我做接口用的jmeter,首先拿到接口文档(如果没有接口文档就通过fidder抓包)===分析接口文档===设计接口用例====评审接口用例====开发提交代码包====部署好环境====可以使用jmeter进行接口测试====打开jmeter===
新建线程(在测试计划右键新建线程)==新建http请求(在sample中新建http请求==在请求中添加参数(协议:http,服务器:ip或域名,端口号:8080,请求方式:post 、get, 接口路径: 编码格式:utf-8 )===在填写请求参数:(json、键值格式)密码如:账号、密码====请求填写好,接口需要断言=====右键断言,添加响应断言(包含断言内容、断言状态码、断言时间)=====在监听器中添加查看结果树====在点击运行,然后进行保存,==在查看结果树中有请求参数,取样器、响应参数 ( 查看结果树中绿色表示接口是通的,红色表示接口失败)
(2)===关联接口
将第一个接口的返回参数进行提取、通过后置处理器(正则表达式:变量、模板、正则表达式写法)提取;在下一个接口应用就要设置变量来引用,正则提取中的引用名称;就可以实现
(3)====接口参数化
一、在前置处理器中添加用户参数,设置变量、和用户数;在接口中将值改为变量来接受
二、在配置原件中===添加csv data set config ===引用本地txt文档或csv文档来进行参数化,
(4)依赖接口
在配置原件中添加 http cookie 管理器 保持会话
==================================================
接口自动化
自动化是通过了分层思维搭建接口自动化框架的,可以将接口分为6层
第一层创建一个全局的配置文件,用来放置项目的路径,可以命名为”config“
第二层主要是用来存放我们的测试数据 可以命名为”data“
第三层是用来存放工具类的包,读取excel表格、ini文件、发送文件等 可以命名为”utils“
第四主要是存放我们的自动化测试报告的包可以命名为”report“
第五层主要封装了一个运行所有用例的方法,用来运行所有的用例 可以命名为”run“
第六层主要编写测试用例和管理测试用例,可以命名为”testcase“
==================================================
接口中遇到什么bug?
1、接口返回错误,正确的是A,目前显示的是B,该如何定位这个问题?
用工具绕过前台,发一个查询页面元素数据的接口请求给后台,看后台的返回数据,若后台返回数据显示是A的话,那这个bug就是前台的,若后台返回数据显示为B的话,则需要判断是数据库的问题,还是属于后台业务逻辑的问题,用工具通过直连数据库,查看数据库的返回结果,若数据库返回数据显示为A,则是后台业务逻辑的问题,否则是数据库的问题
2、在测试注册接口的时候,pOst方式,报文格式是x-ww这种,但是什么参数没有输入,服务器直接500异常,说明服务器没有容错性提示/校验
3、添加购物车的时候,商品数量没有限制(库存.充足的时候会有最大值).接口测试添加数量没有限制,如果商品数量超大,报错400异常状态码(bad
4、在前台注册存在的用户时,会提示用户名已存在,但是接口测试的时候直接可以注册成功
5、添加购物车,商品pid不存在的时候没有提示而是直接报错
6添加购物车的时候,商品数量没有限制(库存充足的时候会有最大值),接口测试添加数量没有限制,如果商品数量超大,报错400异常状态码(badrequest出错的请求)
7、测试根据商品类别id查看商品列表的时候如果输入类别id格式有问题json返回内容是错误信息,并没有直接的良好提示
8、搜索关键词接口中,当搜正确关键词的时候没有问题,但是搜索内容前后或者中间带空格,搜索内容为空,说明后台接受到关键词没有对关键词进行去除空格的处理
=====================================
ui自动化
1、你做过ui自动化?做过
2、如何做ui自动化?(写一个线性脚本)
python+selenium
(我之前在公司做ui自动化使用的是python+selenium库,使用的是谷歌浏览器,就我之前做的健康保险投保流程来讲一下自动化的流程
首先导入selenium模块,time模块,from selenium import webdriver语句和from time import * ;然后创建一个driver对象:drive=webdriver.chrome(),再通过driver.get来打开项目官网的首页,再使用 driver.maximize_window()最大化浏览器窗口,目的是防止窗口过小页面元素加载不完全或者点击不到,然后会使用driver.implicitly_ wait()设置一个隐式等待,因为程序的运行速度比网速快,要给网页一些反应的时间
进入网页之后通过xpath去定位平安严选并点击,点击是用的click;然后同样使用元素定位来点击健康保险,点击之后通过添加滚动条滑动来找到我们需要参保的险种,用到的语句是window.scrollTo(),同时设置变量为js,然后通过driver.execute_script()来调用js变量来达到滑动滚动条的目的;那在这里我需要参保的险种是“女性关爱险”,定位了解详情的元素,点击进入到险种的详情页面,投保人在我们的详情页面了解完所以参保条件后点击立即投保后弹框提示“我已了解,并同意授权”,弹框的话我们需要先进入弹框:确认型弹框driver.switch_to.alert(),accept确定,dismiss 取消 ;iframe弹框:switch_to.frame(),然后用click点击,然后switch_to.default_content()退出弹框;退出弹框后就进入到我们的一个投保界面,主要有投保人、被保人的姓名、证件信息、手机号码、常住地址等,通过id、name、class、xpath的方法定位到每个输入框,然后用send_keys来输入相关信息;证件信息是需要通过点击下拉框来选择身份证或者护照
下拉框的话我们是需要先导入一个select的类,然后通过value属性值定位下拉选项select_by_value();我们的被投保人可用click点击来选择本人、父母、配偶、子女;当被投入不为本人的时候,需要用id、name、class、xpath的方法定位到姓名、电话、证件信息、常住地址、邮箱,然后通过send_keys来传入相关的信息;信息填写完成后需要用到click点击健康告知,若没有告知中的相关疾病则用click点击全部未有,再用click点击确认被投保人信息,到最后需要用到click勾选相关的协议,勾选完成之后再次利用xpath来定位立即投保并用click点击,随机页面会跳转并打开一个新的支付窗口,当打开新窗口的时候就需要用到句柄,否则我们是定位不到新窗口的页面元素的。handle = driver.current_window_handle :获取当前窗口的句柄
handles=driver.window_handles :获取所有窗口的句柄
driver.switch_to.window(handles[index]) :通过句柄的索引进行切换
以上就是我的一个自动化的流程。)
3、ui自动化框架?
po框架,
4、自动化中遇到什么问题?如何解决?
1、动态元素定位不到
解决方法:尽量使用固定元素定位,如没有固定元素,则采用绝对路径进行定位,因为元素路径是唯一且不变的
2、自动化脚本执行速度较慢
尽量使用css方法定位元素,使用等待时,少用sleep方法,尽量不用隐式等待,涉及到一些if elif条件判断时,尽量把可能发生的条件放在前面写,这样可以减少程序判断的次数,提高效率
3、弹框内有按钮点击不到
解决方法:弹框里面有设置滚动条,首先进入弹框里面,将滚动条滑动到最底部才可以点击确定或者取消按钮
4、
报错:启动后,打开谷歌浏览器,不出现内容,报浏览器不安全|data
解决方法:webdriver-chrome版本升级
5、元素没有加载出来
因为时间等待原因:显示等待(只匹配目标元素),隐式等待(等待页面加载完成),强制等待
6、定位的元素是随机变化的
解:通过元素xpath或者css来定位
7、定位动态元素?
解决:通过相对位置来定位
=============================================
5.selenium 中隐藏元素如何定位?
【这个是很多面试官喜欢问的一个题,】
如果单纯的定位的话,隐藏元素和普通不隐藏元素定位没啥区别,用正常定位方法
就行了
但是吧~~~很多面试官自己都搞不清楚啥叫定位,啥叫操作元素(如 click,clear,send_keys)
隐藏元素
如下图有个输入框和一个登录的按钮,本来是显示的
编辑切换为居中
添加图片注释,不超过 140 字(可选)
元素的属性隐藏和显示,主要是 type="hidden"和 style="display: none;"属
性来控制的,接下来在元素属性里面让它隐藏
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>这里有个按钮,是隐藏的
<!-- type="hidden" -->
<br>
输入账号<input id="yoyo" name="hello" type="hidden">
<!-- type="display: none;" -->
<br>
<button id="yy" name="heo" style="display: none;">登录</button>
<br>
<a hidden id="baidu" href="https://www.baidu.com">访问百度</a>
</p>
</body>
</html>
这样元素就不会显示了,也就是面试官所说的隐藏属性了
六:
1.如何判断一个页面上元素是否存在? 这个可以说是被问烂的题了,判断元素存在方法有三种:
方法一,用 try...except...
def is_element_exsist(driver, locator):
'''
判断元素是否存在,存在返回 True,不存返回 False
:param locator: locator 为元组类型,如("id", "yoyo")
:return: bool 值,True or False
'''
try:
driver.find_element(*locator)
return True
except Exception as msg:
print("元素%s 找不到:%s" % (locator, msg))
return False
if
name
== ' main ':
loc1 = ("id", "yoyo") # 元 素 1
print(is_element_exsist(driver, loc1))
方法二:用 elements 定义一组元素方法
def is_element_exsist1(driver, locator):
'''
判断元素是否存在,存在返回 True,不存返回 False
:param locator: locator 为元组类型,如("id", "yoyo")
:return: bool 值,True or False
'''
eles = driver.find_elements(*locator)
if len(eles) < 1:
return False
else:
return True
if
name
== ' main ':
loc1 = ("id", "yoyo") # 元 素 1
print(is_element_exsist1(driver, loc1))
(强烈推荐!)方法三:结合 WebDriverWait 和expected_conditions 判断
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
def is_element_exsist2(driver, locator):
'''
结合 WebDriverWait 和expected_conditions 判断元素是否存在,
每间隔 1 秒判断一次,30s 超时,存在返回 True,不存返回 False
:param locator: locator 为元组类型,如("id", "yoyo")
:return: bool 值,True or False
'''
try:
WebDriverWait(driver, 30,
1).until(EC.presence_of_element_located(locator))
return True
except:
return False
if
name
== ' main ':
loc1 = ("id", "yoyo") # 元 素 1
print(is_element_exsist2(driver, loc1))
2.如何提高脚本的稳定性 相关类似问题还有“用例在运行过程中经常会出现不稳定的情况,也就是说这次
可以通过,下次就没办法通过了,如何去提升用例的稳定性?”
“如何提高 selenium 脚本的执行速度?”
“selenium 中如何保证操作元素的成功率?也就是说不管网络加载慢还是快
如果一个元素今天你能定位到,过两天就定位不到了,只要这个页面没变过,说
明定位方法是没啥问题的。
优化方向:1.不要右键复制 xpath(十万八千里那种路径,肯定不稳定),自己写
相对路径,多用 id 为节点查找
2.定位没问题,第二个影响因素那就是等待了,sleep 等待尽量少用(影响执行
时间)
driver.implicitly_wait(30)这个等待也不要用,不要以为是全局的就是好事,
有些 js 加载失败时候会一直等,并且页面跳转时候也无法识别
3.定位元素方法重新封装,结合 WebDriverWait 和expected_conditions 判断元
素方法,自己封装一套定位元素方法
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
def find(locator, timeout=30):
'''定位元素,参数 locator 是元祖类型, 如("id", "yoyo")'''
element = WebDriverWait(driver, timeout,
1).until(EC.presence_of_element_located(locator))
return element
3.如何定位动态元素 动态元素有 2 种情况,一个是属性动态,比如 id 是动态的,定位时候,那就不
要用 id 定位就是了
<p id="yo" class="hello world">
<button id="yy_auto_1929292" name="heo" >登录</button>
<br>
</p>
比如上面这个 button 元素,id 是动态的,定位方法千千万,何必死在 id 上,
可以用 name 定位,
哪怕这个元素属性都是动态的,它的标签不可能动态吧,那就定位父元素
id="yo"啊: .//*[@id='yo']/button
还有一种情况动态的,那就是这个元素一会在页面上方,一会在下方,飘忽不定
的动态元素,定位方法也是一样,按 f12,根据元素属性定位(元素的 tag、name
的步伐属性是不会变的,动的只是 class 属性和 styles 属性)
二:性能测试
1、性测试流程?
2、性能测试流程?结合场景讲解
我们产品经理首先会评审性能需求,产品经理把需求分析过后,我们就根据需求做性能场景的设计,比如我就拿登录-贷款资料录入-初审-回退-重新提交-复审-签约接口这样的一个场景,和您这边大概说一下:
首先我会设计好这个性能测试用例之后,然后接着在Jmeter里面开始组建接口,把接口请求组建好之后,然后再添加吞吐量定时器,再添加TPS插件,HPS插件,以及混合图表,查看结果树,聚合报告,以及对应的一个并发线程数比如50,然后选择压测10分钟,然后就开始点击运行,进行压测,在压测过程当中,我一般会通过混合图表去看当负载不断升高的时候,也就是我的并发线程数,它负载升高的时候我的接口的响应时间跟我的TPS之间的一个曲线变化,当我的TPS到达最高点,响应时间开始急剧上升的时候,这个时候一般就会出现一些捌点或瓶颈点,那我们去看一下它后续的一个曲线变化是怎么样的,后续如果TPS没有很快的急剧上升而是平缓的运行,我们这个时候就会去看它的、监控它的TPS是否符合我们原来设定的那个TPS、因为之前我们计算得出来的TPS需要高于105笔/秒,但我压的时候平均都能达到300多TPS,TPS这块就是符合需求的,但是只关注这个标指标还不行,还需要关注这个接口它的平均响应时间是不是在3秒钟之内。0到1秒一般是比较优秀,说明这个接口响应时间必较快速,1到3秒合格,超过了3秒我这边就会调整并发或者rps并且重新去压,还有就是错误率。我们之前的错误率指标需要低于0.1%,如果错误大于了0.1%此时说明接口有很多的报错,也是不符合性能要求的, 直到我们压完之后如果TPS达标,接口平均响应时间达标,错误率达标之后。
我们还需要在服务器端用top和iostat和dstat命令去监控它的cpu和内存,如果CPU和内存的使用率都能低于70%的话那就说明没问题,我会去输出性能测试报告,然后再发送报告给到我整个项目组。
3、性能中遇到什么问题?如何解决?
案例1:数据库CPU高
问题现象:后台指令发送满负荷工作时,数据库CPU高。
问题原因:后台指令发送线程每次对全量查询结果排序,结果集很大,然后取一条记录;索引区分度不高,满负荷执行时;查询频率很高;压测显示,并行发送指令的后台线程越多,数据库CPU越高,效率越低。
解决方法:
去掉ORDER BY,增加索引后,效果不明显。因为结果集大和查询频繁两个问题没有解决,因此考虑使用设计新的方案。
新方案:设计指令发送线程池,生产者线程每台任务服务器只有一个线程,负责查询待发送指令,每次查询50条指令。每条指令包装成一个Runnable对象,放进ThreadPoolExecutor线程池,线程池大小参数设置为100或200。每当线程池满时,生产者停止生产指令,休息15秒后继续。消费者线程即线程池里的线程,参数设置为4,8或12(和不同指令类型的指令数据量成正比)。
改进后的方案,数据库CPU降到10%一下,发送效率单机提升6倍,且可线性扩展任务服务器。
案例2:内存溢出(堆溢出、栈溢出、持久代溢出)
解决思路:1、调整堆内存参数,一般是增加堆内存
2、减少批处理数据量
案例3:
线程死锁:容量(压力)测试压测一段时间后,报连接超时
解决思路:
1、造成这种现象的原因很多,比如带宽不够,中间件线程池不够用,数据库连接池不够,连接数占满等都会造成连接不上而报超时 错误
2、找到死锁的线程,分析对应的代码
案例4:压测TPS曲线剧烈下降或抖动
问题现象:50并发压测,TPS曲线正常应该是平缓的,波动不大,如果突然出现剧烈下降,并且短时间内无法恢复,则可能存在问题。
问题原因:一般是由于前置或bp的jvm进行垃圾回收,或者日志记录磁盘满导致的。
解决方法:如果不是特别剧烈的波动或者TPS曲线下降后长时间不反弹,则可以忽略该问题。否则,需要分析曲线下降的时刻,系统当时正在发生的事情。可以通过top命令监控当时CPU占用比价高的线程,也可以kill -3 pid杀javacore来查看线程堆栈。
4、性能指标?
软件性能指标:响应时间、吞吐量、tps、 qps、点击率、资源率、错误率、最大响应时间、最小响应时间、并发数、最大并发数、最佳并发数、
硬件性能指标: cpu、内存、磁盘、网络(i/o)
===============================================
app测试
1、web和app区别?
单纯从功能测试的层面上来讲的话,APP 测试、web 测试 在流程和功能测试上是没有区别的。
根据两者载体不一样,则区别如下:
系统结构方面
web项目,b/s架构,基于浏览器的;web测试只要更新了服务器端,客户端就会同步会更新。
app项目,c/s结构的,必须要有客户端;app 修改了服务端,则客户端用户所有核心版本都需要进行回归测试一遍。
性能方面
web项目 需监测 响应时间、CPU、Memory
app项目 除了监测 响应时间、CPU、Memory外,还需监测 流量、电量等
兼容方面
web项目:
1. 浏览器(火狐、谷歌、IE等)
2. 操作系统(Windows7、Windows10、Linux等)
app项目:
1. 设备系统: iOS(ipad、iphone)、Android(三星、华为、联想等) 、Windows(Win7、Win8)、OSX(Mac)
2. 手机设备可根据 手机型号、分辨率不同
相对于 Wed 项目,APP有专项测试
1. 干扰测试:中断,来电,短信,关机,重启等
2. 弱网络测试(模拟2g、3g、4g,wifi网络状态以及丢包情况);网络切换测试(网络断开后重连、3g切换到4g/wifi 等)
3. 安装、更新、卸载
安装:需考虑安装时的中断、弱网、安装后删除安装文件等情况
卸载:需考虑 卸载后是否删除app相关的文件
更新:分强制更新、非强制更新、增量包更新、断点续传、弱网状态下更新
4. 界面操作:关于手机端测试,需注意手势,横竖屏切换,多点触控,前后台切换
5. 安全测试:安装包是否可反编译代码、安装包是否签名、权限设置,例如访问通讯录等
6. 边界测试:可用存储空间少、没有SD卡/双SD卡、飞行模式、系统时间有误、第三方依赖(QQ、微信登录)等
7. 权限测试:设置某个App是否可以获取该权限,例如是否可访问通讯录、相册、照相机等
测试工具方面
自动化工具:APP 一般使用 Appium; Web 一般使用 Selenium
性能测试工具:APP 一般使用 JMeter; Web 一般使用 LR、JMeter
app专项测试:卡顿、闪退、白屏、弱电、弱网、耗电、耗流量、中断、来电、短信、
拓展:
2、adb命令?
ADB常用的指令:
查看当前连接设备 : adb devices
进入到shell : adb shell
查看日志 : adb logcat
安装apk文件 : adb install xxx.apk
卸载APP : adb uninstall +包名
查看包名 : aapt d badging +包的路径
往手机SDCard传递文件:adb push 文件名 手机端SDCard路径
从手机端下载文件 : adb pull + 文件
查看手机端安装的所有包名:adb shell pm list packages
启动Activity : adb shell am start 包名/完整Activity路径
屏幕截图 : adb shell screencap
启动adb server命令 :adb start-server
停止adb server命令 :adb kill-server
查看adb版本 :adb version
通过 IP 地址连接设备:adb connect
断开无线连接 : adb disconnect
===============================================
测试点总结:
发红包、点赞、二维码、
功能
界面
兼容性
易用性
安全
===============================================
总结:
现阶段很多人都在说软件测试太内卷了,工作太难找了,竞争太激烈了。那么如何在这样的现状下使得自己更具有竞争力呢?笔者认为大家需要迅速学习软件测试的硬技能,
现阶段很多人都在说软件测试太内卷了,工作太难找了,竞争太激烈了。那么如何在这样的现状下使得自己更具有竞争力呢?笔者认为大家需要迅速学习软件测试的硬技能,