您好,这是我的简历
我叫XXX,今年26岁啦,做测试有4年多啦,刚开始是做开发的,然后是开发+测试,到最近两个项目是纯测试的,上家公司是在四惠东,公司做一个xxx小视频app,还有一个是xxxapp,
测试的时候主要是对功能测试 自动化测试,还接口测试,数据库,性能测试着一些,公司用的bug管理工具是禅道,版本控制器是git,常用到的软件有linux,charles,jmeter这些
xxx是做小视频方面的,做这个app的初衷是让学生交作业的,去年8月的时候做啦整体的改版,改成和抖音差不多,只不过多啦一个商城模块,抖音的首页是视频,我们的这个app也是,但是每个视频下面都挂的有一个商品,右下角有点赞,评论,分享和商品四个小按钮,点击商品的时候显示商品的条目,有(商品图片,标题,点击进去到上商品介绍页面,就和淘宝搜索一个羽绒服,点开一个喜欢的羽绒服,跳转到这个羽绒服的详情页面,商品的图片是最多展示6张,最少展示一张的,可滑动,里面有商品介绍,最下面有详情购买,加入购物车功能,进入店铺等按钮),购买是用支付宝和微信购买方式,购买的这块测试的时候是让后台把接口里面的支付金额固定为0.01元,让开发打包给我测试,运行的本地项目,线上的话就是真实的购买,公司所有工作的费用都可以找商务报销,第二个模块商城模块是淘宝首页一样的,第三个模块是聊天的模块第四个模块是我的,和抖音的聊天和我的模块是一样的,完全一样(领导想的是超过抖音,加上商城功能)
还有一个xxx是一个关于医疗的,对接机器人的测试
公司总部在四川,不止一个项目总部让研发团队要和四川的合并到一块,我不想去四川,还是喜欢北京
工作经历:
2019年8月— 至今 北京XXX公司
公司地址:北京朝阳区xxxxxx
路线 :8号线平西府—10号线北土城—1号线xxx 一小时时间,下地铁步行5分钟
住址 :平西府地铁站的XXX
经营范围:总部在四川,30多亿建啦个影视学校 还有餐饮这方面 北京这边主要是写这一
个app,
公司规模:我们北京这个团队20多人,总经理办公室和产品经理 研发经理和我们开发小组在2层,人事
部门和商务在一层,董事长在3层,没见过董事长
开发人员:2个测试(另外一个是功能测试)
2个android开发
2个ios
2个ui
3个h5
一个运维
4个产品
职责 :
1,测试用例 计划 测试报告编写
2,用例评审,并执行用例,复现bug,对修改的部分针对性测试
3,用monkey进行随机测试和压力测试并生成日志发给开发
4,编写脚本利用Python,appium selenium工具对核心主功能进行自动化测试
5,结合使用禅道提交bug,跟踪管理bug
6,和研发和产品沟通项目进度
info:接口功能,接口URL地址,请求方式,请求头,请求参数,请求参数值,预期响应结果,测试结果,测试人
测试用例,测试计划,测试报告的区别:
测试计划(需求评审之后,开始测试人员开会研讨测试计划,测试模块的分工)----测试用例(规划完测试计划后,就开始写测试用例)------测试报告(版本上线前或者领导要看测试情况的时候交给领导的)
功能测试用例编写:
所属模块----功能编号----优先级----执行条件----输入数据----输入步骤----预期结果----实际结果----测试人员----测试版本
讲解:
性能测试用例也不太一样,用例id,测试步骤,测试模块这块是一样的,但是性能测试用例里边我们一般还会包含,事务设置,前置条件等信息,就是在做压测或者负载测试的时候,我们会设置一些事务,从xx开始到xx结束,叫做一个完整的事务,前置条件就是在执行这些测试,是否有什么必须的条件,比如是否要登录。
再就是设计测试场景,这块是性能测试特殊的地方。比如在用例中指定并发用户数,指定压力方式,是随,,机,还是一次启动,还是逐步递增,指定负载测试时间,是10分钟还是1小时,把这些信息也要包含到用例中。
还有就是期望结果,期望结果应该包含多项内容,比如事务成功率,CPU利用率,内存利用率,硬盘利用率,响应时间等信息,这些的预期结果都是跟我们的测试需求上相匹配的。
性能测试用例:
基本信息——用例编号,用例名称,测试接口——前置条件——性能输入参数——并发量,迭代册数,思考时间,压测时间——预期结果,响应时间,吞吐量,错误率
接口测试用例:
用例编号——接口名称——url地址——请求头——请求参数——输入参数——预期结果——实际结果——测试人员——测试版本
测试流程:
1,需求评审:
从用户角度提供设计建议
从开发经验角度,分析设计是否存在风险,是否能够实现
联合其他模块分析,设计是否存在漏洞,逻辑功能存在缺陷
2,测试计划制定:
测试用例设计
测试用例评审,和测试时间估计
测试资源申请
3,测试计划执行:
用例执行
Bug修复验证和推动版本进度
性能监控,压力测试,兼容测试
4,发布与测试报告总结:
版本发布和线上质量监控,用户反馈实时响应
测试用例更新整合,测试计划评估
提供版本最终测试报告,包含用例覆盖率,bug数据分析等
项目流程:
立项
需求文档(需求人员)
需求评审(开发,测试,项目经理,需求)
详细设计(开发人员)
测试用例(测试人员)
测试用例评审(开发,测试,项目经理,需求)
编码
部署环境(测试)
冒烟测试
bug(禅道)
测试报告
上线(运维)
测试分类:
按阶段划分:单元测试,集成测试,系统测试,验收测试
按是否运行程序划分:静态测试,动态测试
按是否查看源代码划分:白盒测试,黑盒测试
黑盒测试:功能测试:逻辑功能测试,界面测试,易用性测试,安装测试,兼容性测试
性能测试:一般性能测试,稳定性测试,负载测试,压力测试
1,首先考虑环境问题,看是否能还原原来的环境
2,遇到问题就要提,不能放过任何一个bug,在提交bug描述中加上一句话,那就是复现概率,尝试20次,出现一次或尝试10次,交给开发,开发会根据bug的复现概率,调整bug的优先级
3,尽量回想发生问题时的复现步骤,不要漏掉任何一个细节,按照步骤的组合尝试复现
4,查看代码,也许是代码变更,引起的Bug
5,保留发生bug的log,附加到提交的bug中,希望可以通过log中找到一些蛛丝马迹
单元测试 白盒测试
集成测试 代码和界面
功能测试 界面测试
项目中的测试分为黑盒测试和白盒测试。
黑盒测试是是对功能测试(界面测试),检查软件功能是否实现符合需求。
白盒测试是单元测试自动化测试,主要是对代码的测试
python和android在写的过程中没什么太大的区别,android用的是androidstudio,python用pycharm写,这两个软件里面的功能几乎也都是一样样的
代码深入区别的话python虚拟机没有java强,java虚拟机是java的核心,python的核心是可以很方便地使用c语言函数或c++库
Java开发偏向于软件工程,团队协同,Python更适合小型开发,效率极低;
Java是一种静态类型语言,Python是一种动态类型语言;
Python比Java简单,Java语法定义较复杂,Python语法比较简洁,就比如
android创建一个类是public class 类名{}
python只用class 类名:就可以
方法:
android写一个方法需要public 返回值类型 方法名(){}
python只需要def 方法名()
变量:
android定义变量需要写变量的类型 int sum = 0;
python只需要写 变量名=值
创建对象:
android定义变量需要new一个对象
python省去new
if语句 : 也是也是比较简单
例:
在测试中用python主要是写app和web端的自动化测试,比如测试购物车,支付测试的时候需要用到加入购物车后支付,查看购物车里面加入的商品,查看购物车里面的商品,开发写一个功能你测试一个,全部写完你还需要在测试一遍,等到上线前还是需要测试,下一个版本上线前需要做一个回归测试,重复的测试,重复的点点点,用自动化只用运行一下自己写好的自动化测试用例代码就可以啦,方便复用,省去很多时间也可以完整的测试代码,以免回归测试或者上线前的测试,可能有些细节漏掉测试这样的问题
request是一个很实用的python的HTTP客户端库,编写爬虫和测试服务器响应数据时候经常用到,request是pyehon语言的第三方的库,专门用于发送HTTP请求判断接口有没有问题,可以查看请求头,请求体和返回的code码,用这个主要就是方便后期测试接口的时候方便,通常是创建一个csv文件,里面放着每个接口需要测试的数据,接口,然后编写脚本,读取对应的csv文件数据,将数据存储列表中通过索引取出,输入对应的索引取出(例如:0.0获取第一个参数,0.1获取第二个参数)传到页面上代码的地址拼接后面,不用下次回归测试的时候,一个个参数手动输入,这个测试接口传参只需要读取csv文档之前测试过的参数就可以
get请求:
rr = requests . get(“http:www.baidu.com”)
传参:
pay = {‘key1’:‘value1’,‘key2’:‘value2’,‘key3’:‘value4’}
rr = requests . get(“http:www.baidu.com” , params = pay)
响应:
rr.status_code 响应状态码
rr.heards 响应头
rr.cookies 响应cookies
rr.test 响应文本
rr.encoding 当前编码
rr.content 以字节形式(二进制)返回
unittest测试导入第三方插件HTMLTestRunner.py
python+unittest+HtmlTestRunner单元测试
将传递参数利用csv/xml等文档存储,使业务与数据分离
编写脚本获取文档中的数据
导入unittest模块,在测试用例中(test开头的方··法)调用被测的程序的最小模块(函数)并传递参数,通过断言的方式(assertEqual)验证被测程序中返回值和预期结果是否相同
最后导入第三方模块HtmlTestRunner生成对应的测试报告
pytest代码自动化测试
unittest测试导入第三方插件HTMLTestRunner.py
pytest需要导入allure第三方插件,用allure生成测试报告,pytest也可以生成测试报告,但是不能自定义设置一些参数,allure更详细一些,可以自定制,在代码中写入想要的元素,想要的元素可以在测试报告展示出来,所以就经常结合导入allure插件
pytest比unittes更严谨
pytest自带的插件使用:
pytest.main([“test_1.py”]) 只运行test_1.py模块中的测试用例
pytest.main()运行所有test-开头或者-test结尾的.py文件
pytest.main(["–html=./report.html", “test_aaa.py”])#打印test_aaa.py的全部用例,生成测试报告
pytest.main(["–html=./report.html", “test_aaa.py::TestClass::test002”])# 只打印test002里面的
allure使用:
首先要安装allure
pip install allure-pytest
allure常用的几个特性
@allure.feature # 用于描述呗测试产品需求
@allure.story # 用于描述feature的用户场景,即测试需求
Withallure.step(): #用于描述测试步骤,将会输出到报告中
Allure.attach #用于向测试报告中输入一些附加的信息,通常是一些测试数据,截图等
pytest.main([’–alluredir’, ‘report/result’, ‘testshop.py’])
将json转换成HTML文件
split = ‘allure’+ ‘generate’+ ‘./report/result’+ ‘-o’ + ‘./report/html’ +’–clean’
os.system(split) # system函数可以将字符串转化成命令在服务器上运行
unittest代码自动化测试
unittest方法名要test开头和结尾
unittest测试导入第三方插件HTMLTestRunner.py
pytest 类名要test开头 , 模块名.py字和方法名用test-开头或者-_test结尾
首先要安装allure的pip install allure-pytest
存储bug的工具用到两个存储,一个是公司自己写的一套和禅道功能差不多,我们的测试用例也是在公司的bug工具里面写的,上家公司和第一家公司都是用的禅道写的,
添加人员是运维添加的,把自己的邮箱号发给运维,运维把你添加到禅道测试人员分组里面,并且把登陆禅道的密码发给你,账号就是自己的邮箱号
用禅道提交缺陷报告:
缺陷标题,简要描述,缺陷类型,缺陷的详细步骤描述(难复现的bug上传图片),缺陷的实际结果,期望结果,缺陷等级,日志信息,指派给哪个开发同事
Git是一个开源的分布式版本控制系统,可以有效的,高速的处理从很小到非常大的项目版本管理
操作步骤:
1.新建一个仓库(网页点击+)
2.把远程仓库clone到我们的本地仓库
git clone <你仓库的地址> -->cd 仓库名–>git status 查看状态
3.把项目拖拽到你的文件夹(查看一下 git status 是否多了什么东西) 并输入命令 git add . 进行提交 git status 查看状态
4.我们进行提交 git commit -m ‘这是一次提交’ git status 查看状态
5.先拉取 git pull -Already up to date.-你的当前日期是没问题的
6.最后一步 git push 一下 上传成功
Svn 使用 :
集中式
码云使用 :
Git svn 码云的区别: ·
配置服务器的时候,默认不对外开放的话是访问不到的,因为他比较安全
pwd 查看当前位置
ifconfig ip地址
mkdir 创建目录
touch touch aaa.txt文件夹中创建新文件
rm -rf 强制删除
find 查,查找/root下的与test相关的目录(文件) find / -name ‘test*
ls -a 查看隐藏文件
ls -l 查看非隐藏文件的访问权限
ls -l 在当前目录 / 下使用ls -l,可以看到该目录下的所有目录和文件的详细信息可以缩写成ll
ls 查询创建的文件或文件夹
cd/ 切换到根目录
cd…返回上一级
tail -f 是实时打印日志,在项目中如果是实时刷新的情况下,用-f会试试打印刷新的数据,可以对文件进行动态监控,例如tomcat的日志文件,会随着程序的运行,日志会变化
cp 复制 cp 目录名称 目录的新位置
mv 目录名称 新目录名称 修改目录名称
mv 目录名称 目录的新位置 “ 剪切 ” mv hrllo.txt …/aaaa/ 把当前目录下的文件hello.txt剪切到上一级目录的子目录aaaa目录里,
pring 查看通不通 (例如:pring www.baidu.com)
kill -9 进程的pid 杀死进程
grep 搜索命令,grep to /usr/sudu.conf搜索/usr/sudu.conf文件中包含字符串to的行
top 查看cpu使用率
| 对左边命令筛选,对右边进行过滤
ps -ef 查看进程
ps -ef | grep tomcat查看tomcat进程是否被开启
netstat -an 查看所有端口号
netstat -an | grep 9050 查看9050端口是否被占用
tar -zcvf xx.tar.gz xxx 打包并压缩(xx.tar.gz里面的xx是打包后的名字,最后的xxx是要打包文件的名字)
tar -zcvf xxx.tar xxx打包 打包文件一般是以.tar结尾的
tar -zcvf xxx.gz xxx压缩? 压缩的命令一般是以.gz结尾的
tar -xvf xxx.tar解压
tar -xvf xxx.tar.gz -C /usr 解压到根目录/usr下,C代表指定解压的位置
vim 编辑 vim aaa.txt
关于vim使用过程:
:wq 保存并退出编辑
:q 是不保存强制退出
在实际开发中,使用vim编辑器主要作用就是修改配置文件
vim 文件------>进入文件----->命令模式------>按a进入编辑模式----->编辑文件 ------->按Esc进入底行模式----->输入:wq/q!
777是什么意思
chmod 修改文件/目录的权限的命令,修改/test下的aaa.txt的权限为属主有全部权限,属主所在的组有读写权限,
其他用户只有读的权限chmod u=rwx,g=rw,o=r aaa.txt chmod 777 aaa.txt
文件的类型:
d:代表目录
-:代表文件
l:代表链接(可以认为是window中的快捷方式)
分别代表u属主的权限,g与当前用户同组的用户的权限,o其他用户的权限
r:代表权限是可读,r也可以用数字4表示
w:代表权限是可写,w也可以用数字2表示
x:代表权限是可执行,x也可以用数字1表示
文件权限:
—rwx rwx r——
文件类型 属主权限 属组权限 其他用户权限
r读取权限 w写入权限 x执行权限 —无操作权限
r=4 w=2 x=1
Q -9端口号杀死指定的端口号
部署linux时候接触过哪些版本:
centOS Ubuntu 付费的redhat
linux的安装:
安装SSH Secure shll虚拟机软件
安装CentOS(模拟出一台Linux系统电脑)
写的时候用SSH Secure shll远程连接Linux的工具,CentOS是服务器在机房里,我们只能远程连接
linux的环境搭建和服务部署
(1)环境搭建(linux)
先准备好jdk,和tomcat的tar包
连接对应的linux服务器,将对应的包放在服务器上
因为tomcat是基于Java来写的,所以先配置Java的环境变量
将jdk进行解压(tar-xvf 包名),在配置文件中添加jdk的路径,并重新加载配置文件
并验证Jdk是否配置成功,Java -version,如果能打印出对应的jdk版本号说明配置成功
然后解压tomcat对应的tar包,
开放Linux的对外访问的端口8080(/sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT /etc/rc.d/init.d/iptables save —将修改永久保存到防火墙中)
进入bin目录下,启动tomcat(./start.bat)
(2)服务部署
将开发打的包(tar包)进行解压,放在tomcat下的webapps目录下
启动tomcat,那么该服务就启动了,(验证tomcat是否启动ps -ef |grep tomcat)
数据库连接Linux需要输入Linux的IP地址
1)安卓app的稳定性常常使用monkey命令进行测试,通过随机事件流模拟人的操作,对检查程序的内存溢出、空指针有很大的作用。
2)Monkey主要用来检测系统ANR(应用无响应)及Crash(崩溃)等问题。
adb shell monkey -p com.zhihu.android -s 23 --throttle2000 --ignore-crashes --ignore-timeouts -v -v -v 100000>/data/local/tmp/log.txt 2>&1 &
我就简单的说一下测试的指令吧,我们用 adb shell mokey -p 指定要测试的包名----
-s后面是对应的种子数----- --throttle 38指定延迟时间毫秒 — ignore-crashs 忽略崩溃ignore-timeout 超时---- -v指定log打印的等级 — 点击次数10000 — log存放地址
将测试log存到某个位置,然后把测试出的bug 日志发送给开发
adb shell monkey 100 随机测试手机上任意app点击100次
adb shell monkey -p com.zhihu.android 110方法没用?测试某个app110次 (运行一次命令,app动一次?)
保存monkey生成的日志文件到C:\Users\yiyuan\Desktop\csApp\aa.txt
adb shell monkey -p com.zhihu.android -v 110 >C:\Users\yiyuan\Desktop\csApp\aa.txt
详细解释monkey:
案例
adb shell monkey -p com.tencent.mtaexample -s 23 --throttle2000 --ignore-crashes --ignore-timeouts -v -v -v 100000>/data/local/tmp/log.txt 2>&1 &
查看当前连接设备: adb devices
查看日志:adb logcat
安装apk文件:adb install c:/aaa.apk (apk的绝对路径)
覆盖安装: adb install -r c:/aaa.apk (apk的绝对路径)
卸载App: adb uninstall 包名 adb uninstall -k 包名 (保存配置及缓存文件)
列出所有的包名: adb shell pm list package
列出第三方的包名: adb shell pm list package - 3
列出系统应用的包名: adb shell pm list package - s
查看手机cpu情况:adb shell dumpsys cpuinfo
查看应用内存的命令: adb shell dumpsys meminfo 包名
查看app启动的时间:adb shell am start -W 包名/启动名
启动: adb start server
关闭: adb kill-server
adb logcat *:E >C:\log\e.txt
日志级别
V Verbose 最低
D Debug bug
I Info 信息
W Warn 警告
E Error 错误
F Fatal 致命
S Silent (sup(:
功能测试:
1.业务逻辑正确性测试:依据:产品文档->测试用例编写
2,ui测试,功能,性能测试,安装卸载测试,软件升级测试,登陆测试,安全性测试,消息推送,前后台切换,兼容性测试,网络环境测试,monkey测试。
兼容性测试:
1.系统版本:Android:官方版本,定制版本;IOS:官方提供版本
2.分辨率:720 * 1280 和1080* 1920
3.网络情况:2g 3g 4g 5g Wi-Fi
异常测试
1.热启动应用:应用在后台长时间待机;应用在后台待机过程中,手机重启
2.网络切换和中断恢复:网络切换;中断恢复:
3.电话信息中断恢复
升级,安装,卸载测试
1.升级测试:临近版本升级(1.0->1.1);跨版本(1.0->…->2.2)
2.安装测试:首次安装;覆盖安装(同版本,不同版本覆盖);卸载后安装
3.卸载测试:首次卸载;卸载安装后在卸载
健壮性测试
1.手机资源消耗:cpu,内存
2.流量消耗:图片,数据,视频
3.电量测试
4.崩溃恢复
app兼容测试
功能测试
机型测试
屏幕适配(720X1080)
版本测试
网络测试
推送和更新测试
弱网测试
安装卸载测试
web兼容测试:
不同浏览器之间测试
同一个浏览器不同版本的测试
操作系统的测试(weindow linux)
网络测试(内网外网)
电脑分辨率测试(分辨率低页面可能会错乱)
app和web端测试的区别:
bs和cs,bs是浏览器和服务端, cs客户端和服务器,cs比bs的成本要高,因为要开发,cs维护成本比bs高,浏览器只需要更新浏览器就可以,cs需要发布更新,cs是局域网,bs是广域网
1)客户端性能:
测试重点关注:安装卸载时间、启动时间、页面加载时间、事务响应时间、主要功能占用CPU、内存、流量、耗电量等, 容错率 多并发,以及同类产品相比较是否有优势:
1,时间性能:软件的一个具体事务的响应时间。比如点击一个登陆按钮,到登录成功(失败)的反应时间,浏览器非常常见, ANR(Application not responding 应用程序无响应)
2,空间性能:软件运行时所消耗的系统资源,比如对内存和cpu的消耗
3,一般性能测试:软件正常运行,不向其施加任何压力的测试
4,稳定性测试:也叫可靠性测试,是指连续运行被测系统,检查系统运行时的稳定成都。monkey
5,负载测试:让被测系统在其能够忍受的压力范围之内连续运行,来测试系统的稳定性。
6,压力测试:持续不断的给被测试的系统增加压力,直到被测试的系统压垮为止,用来测试系统所承受的最大压力。
其中页面加载时间可以利用Android调试工具DDMS获取到;
运行过程中主要功能占用CPU、内存、流量等可以借助开源工具(Emmagee、itest、gt)获取。
DDMS可以实现查询终端设备运行状态,终端设备进程状态,线程状态,文件系统,日志信息(logcat)等。以及控制终端设备,完成一些操作。总的来说它是一款性能分析工具,可以帮助开发者快速了APP的运行情况。
基准性能测试:主要通过压服务器端接口及客户端在不同网络环境下响应速度。主要为258原则。
大数据量的测试:主要在特定环境下,客户端一次性更新大量的数据,客户端能否正常处理,分为三种情况:
2)服务器端的性能:
主要利用接口对服务器施加压力,重点关注响应时间、吞吐量、并发数、事物通过率等,可以视同工具loadrunner、Jmeter等进行测试。
测试多并发,在服务器上测试最多能有多少用户,根据日活量来测试,比如800个用户,我并发1000次,然后看看占用了多少
之前有公司,写项目之前用户给的指标 cpu占用 磁盘内存 需要在服务器上创建虚拟机,模拟有多少个人能进行操作,这时候就需要创建多少个虚拟机
BS/CS架构的区别是什么?
**概念:**所谓的架构就是用来指导我们软件开发的一种思维,目前最长见的就是BS/CS.
B—browser 浏览器
C—clent 客户端
S—server 服务端
区别:
1,标准:相对于cs架构来说Bs架构的两端都是使用现成的成熟产品,bs会显示的标准一些。
2,效率:相对于bs架构来说cs中的客户端可以分担一些数据的处理,执行效率会高一些。
3,安全:bs架构当中得到数据的传输都是以Http协议进行传输的,而Http协议又是明文输出。可以被抓包,那么cs架构比Bs架构显得就不那么安全了,(其实都是相对的)。
4,升级:bs架构只需要在服务器端将数据进行更新,前台只需要刷新页面就可以升级,而cs架构必须要将两端都进行更新才可以。
5,开发成本:相对于bs架构来说cs当中的客户端需要自己开发,bs不用,所以说cs成本会高一些。
讲解:
Selenium,在使用的时候,首先应该配置好selenium的环境,selenium有几个核心的组件,一个是seleniumIDE,IDE主要用在浏览器录制环境上边,可以在浏览器上安装selenium IDE插件,打开录制按钮,录制用户操作,可以进行脚本回放,通过脚本回放,演示录制的脚本是否可用。还可以从浏览器上将录制的脚本导出,以执行脚本代码的形式,执行自动化测试。
我们使用Selenium主要是使用Python代码写脚本,这个需要在python中配置selenium的依赖包,我一般是在python的Scripts的文件夹中,在线下载selenium的相关包。
使用Python做selenium的自动化脚本编写,我一般情况下,会使用Python的unitest执行测试代码。而selenium中比较核心的API,是webDriver,可以通过webDriver完成相应的代码调用。我就简单介绍一下webDriver中常用的操作吧。
要做自动化测试,比较关键的是能够定位到页面元素,定位到元素之后,就可以执行相应元素操作。webDriver中提供了各种方式来定位页面元素,比如通过id,通过link Text,通过css,通过xpath来定位元素,一般,如果有id,我们就使用id,然后使用css或者xpath来定位,dom(document object model) 元素,当然定位的时候,需要在浏览器里边安装firebug firepath来抓取页面元素对应的xpath信息。
定位到元素之后,可以对元素进行操作,比如最简单的操作,我们对文本框使用send_keys设置值,可以使用clear清除值,也可以调用一些键盘的按钮做值得操作,比如回车,比如删除一个字母,还可以调用按钮的点击,其实就是模拟我们人为的操作。通过这些操作,我们就可以完成界面基本的操作,比如登录注册,跳转界面,可以使用这些api来做到。
当然除了这些,Selenium中还有其他一些API的操作,比如关闭浏览器,设置浏览器界面的大小,回退前进操作,还可以获取当前界面的title,获取当前界面的url,还可以设置当前操作等待,当然了,我们使用python中的API time.sleep本身是可以做到的,而webDriver中提供了对应的显示等待和隐式等待的方式,
另外,在Selenium中,还有切换弹框,切换Frame,切换Window的操作。这种操作也挺常见的。比如有弹框弹出来,元素就没法定位了,我们需要将焦点切换到弹框上,比如页面上是有frame框架的,需要切换frame,才能找到对应的frame所在的页面的元素。还比如会在某个页面操作的时候,会换到一个新的窗口中,就需要切换window。这里边关键词都会用到switch关键词。
再就是我们写自动化代码,肯定是要进行封装的。在这里我用到的思想是PageObject。将每个页面独立分开,都继承一个统一的Page类,各自执行各自页面的逻辑。
我们公司在做selenium自动化测试的时候,还会生成测试报告,我们使用的是HTMLTestRunner这个工具包来形成html形式的报告,测试fail的信息,会呈现在报告中,并且可以点击查看错误内容。然后将测试信息发送到开发或者我们测试自己的手里。
以上就是我们使用selenium的基本操作吧
介绍:
自动化测试,一般就需要使用脚本来进行测试,也可以叫做白盒测试,技术含量相对来说比较高 , 我会的语言是python,基本上python的代码基础我是掌握了的
selenium是对web做自动化测试的框架,导入IDE插件还可以录制脚本,输入要测试的网址,脚本录制完成后点击把录制好的脚本用python unittest webDriver的的格式导出,在python中打开运行(如果用java运行的话就导出java格式的)
自动化:
自动化代码我用的是火狐浏览器,用火狐浏览器是因为火狐2代的自带的有驱动,使用起来也比较稳定,火狐对应的selenitm需要下载2代的,如果下载3代的就需要下载火狐的驱动啦,用google的话或者ie需要手动下载驱动(驱动chromedriver.exe放在pyCharm里面),而且Goole使用起来会不断的升级,自动升级一次遇到一次问题,设置不让自动升级的话,有些地方会提示需要升级
selenium环境搭建:
材料1,python不要超过3.8(python3.7)
材料2,Firefox35(火狐不超过43)
材料3,selenium2框架用2代的 稳定版本2.48.0(pip install selenium=2.48.0)
selenium编写:
1,库导入:
from selenium import webdiver
2,创建浏览器对象
driver = webdriver.浏览器()
driver .get(url) 请求某个url对应的响应
driver .refresh() 刷新页面操作
driver .forward() 前进到之后的页面
deiver.title() 获取浏览器的标题
deiver.page_source 获取网页源码
driver .back() 回退到之前的页面
deiver.close() 关闭当前标签/窗口
deiver.quit() 关闭所有标签/窗口
八大定位元素:
安装完插件后>鼠标右键>使用Firebug查看元素
1,find_element_by_xpath()查找(选中元素>FirePath>XPath)
2,find_element_by_id()通过id定位
3,find_element_by_name() 通过name查找4.find_element_by_css_selector() 选择器(点击完元素,点击代码右键>复制唯一选择器)
5,find_element_by_class_name() 通过class查找
6,通过页面文字模糊查询,精准查询
#精确查询跳转 hao123
# diver.find_element_by_partial_link_text(“hao123”).click()
# time.sleep(5)
#模糊查询跳转 hao123
diver.find_element_by_partial_link_text(“hao1”).click()
Selenium IDE录制脚本步骤:
安装插件 > 填写被测试网站 > 控制运行速度 > 录制(点击录制,记录你对浏览器的操作) > 导出录制好的脚本 > 文件 > Export Test cast as > Python2 /unittext/webDriver > 文件保存到桌面上,复制到python中运行
录制脚本常见问题:
1,录制的时候把速度调慢点,速度太快的话再录制的过程中会因为没加载出来而暂停录制脚本
2,录制完成后,运行的时候打开窗口需要添加打开窗的方法,录制的脚本里面没有自带的打开窗口
tb.switch_to.window(tb.window_handles[1])
3,录制好的脚本,可能有些定位的也有问题,需要修改
Fiddler:
1,设置Http代理,设置端口号,在手机上设置与fiddler在同一网段上,设置代理ip,设置代理端口,手机上的请求就能获取到了。
2,抓取请求查看,可以过滤,找到自己域名下的请求,通过分析请求地址,请求参数,响应结果来查找问题。
1,http与Https协议区别在于Https多了一个ssL协议,更加安全,默认端口是443,而http默认端口是80.
2,抓取Https时,需要获取申请证书,在fiddler与charles两个工具中,可以模拟下载966证书,下载后,在手机上访问代理服务器的ip与端口,下载证书,就可以抓取到HTTPS的请求了。
get请求通常从服务器获取数据,请求参数在地址栏之后,数据量有限制,不够安全
Post请求通常往服务器提交数据,请求参数在请求实体中,数据量无限制,较为安全。
在postman中post请求中设置form-data类型,上传文件,也可以设置raw类型,可以上传xml类型的文件。
答:
200:请求发送成功。
302:代表重定向。
400:客户端发送的请求语法错误。
401:请问的页面没有授权。
403:没有权限访问这个页面。
404:没有这个页面。
500:服务器内部异常。
501:当前不能处理客户端的请求。
504:服务器端超时,没返回结果。
使用appium之前,确保adb连接真机成功进行操作
1.启动appium软件,主机号默认为127.0.0.1 端口号默认为4732 启动服务器,点击 搜索框 进入编辑页面
2.需要填写元素,进行保存
platformName : 平台名称 (iOS, Android)
platformVersion : 设备系统号版本号 (adb shell getprop ro.build.version.release)
deviceName : 设备号 (adb devices)
打开要测试的app,输入命令查看包名和启动项(adb shell dumpsys window |findstr mCurrentFocus)
appPackage : (查看包名和启动项/ 前面的)
appActivity : (查看包名和启动项/ 后面的)
对号入座 点击 启动会话
我们在界面点击 可在右侧获取元素 可点击查找 确保锁定页面是否正确
1、标题简洁、提供缺陷的本质信息即可
2、复现的步骤要详细,应包含如何使别人能够很容易的复现该缺陷的完整步骤。用数字编
码。
3、实际结果要描述清楚,及错误的结果。
4、列出预期结果
5、测试数据
6、提供附件
7、提供严重属性和公司需要填写的属性
性能测试:
常用于测试 :模拟并发测试 压力测试 负载测试 性能测试
性能指标:
查看系统指标: 并发数,cpu内存使用情况,吞吐量,请求时间,响应时间 258 ,查看结果树里面的平均请求时间,最大请求时间,TPS,并发数,点击率
资源使用率: CPU使用率 75% 内存使用率 80% 磁盘吞吐率 80% 网络吞吐率 80%
使用流程:
下载jmeter连接数据库的jar包 在测试计划添加数据库连接jar包
右键添加 --> 线程 --> 线程组 --> 并发数量 --> 指定测试接口
创建响应监听器
添加查看结果树 聚合报告
通过监听器来监听是否通过或者存在什么问题
其中在结果树中可以监测到整体的请求信息,就拿Http请求这种来讲,其实就是整个http协议的所有信息,包括请求头,请求参数,请求路径,还有响应头,响应结果等信息。
对于表格查看结果,可以看到每个请求的简单信息,本次请求的时间,以及平均的时间。
在聚合报告中,我们就可以看到整体的信息了。比如可以看到平均响应时间,90%Line 也就是90%的用户请求低于的时间。还有吞吐量 TPS,还有错误率,还有用流量来计算的吞吐量。这些都可以看到。通常,聚合报告就是反应整体的数据。
在进行多线程并发的时候,如果需要多个参数,可以使用csv配置元件。比如做登陆操作,后台有可能会限制一个用户不能重复登陆多次,如果演示登陆的并发操作,可以使用Jmeter中csv配置元件,将用户信息导出来,放到文件中,就可以让线程共享这些数据。另外,对于一些随机变化的参数,可以使用Jmeter中的函数助手,生成随机函数,进行参数化测试。比如注册这样的操作,用户名要求唯一的,那就可以使用随机函数来模拟出来。
jemeter可以服务器响应的最大时间和最小时间,但是看单个接口的响应时间需要用fiddler,在fidler里面点击接口鼠标右键选中properties,会打开一个文件,在里面可以看到接口的一些信息,可以看到接口的响应时间
性能测试主要看到是tps,容错率,吞吐量,最大响应时间,最小响应时间,平均值
吞吐量:是服务器每秒处理的请求次数
容错率 : 是测试接口测错误率百分比
平均值:是总运行时间除以总共发送到服务器的请求数量
tps:是每秒的事务数,(从请求时间开始计算到请求结束算一个事务)就比如我首页视频点赞接口测试,我并发1000次,每秒点赞成功3个,也就是3个事务的意思也就是一秒产生3个tps,也可以后台测出来的一秒点赞成功1个,是一秒一个tps,当然压测一秒点赞成功的越多越好
系统的性能由TPS决定,跟并发用户数没有多大关系。在同样的TPS下,可以由不同的用户数去压
Test Plan(测试计划)–>add(添加)–>Threads(线程)–>线程组
线程组–>添加–>Sampler(采样器)–>HTTP请求
HTTP请求—>添加–>定时器–>固定定时器–>(设置定时时间,这里是毫秒)
在Jmeter中,逻辑控制器的应用比较广泛,我们可以把一组操作放到简答控制器中,用来声明范围。也可以设置循环控制器,比如我们注册1次,登陆10次,就可以使用循环控制器。还有事务控制器,对于一个完整的事务,可以使用事务控制器来控制。
线程组–>添加–>逻辑控制器–>循环控制器–>(填写循环数)
循环控制器–>添加–>Sampler(采样器)–>HTTP请求
线程组–>添加–>逻辑控制器–>事务控制器–>(选中 Generate parent sample 只显示一条数据当做一个整体)
事务控制器–>添加–>Sampler(采样器)–>HTTP请求
在测试中,断言操作经常用到,jmeter的断言操作可以在请求后边设置一个断言结果,判断响应结果或者是响应状态码是否和预期的一致。
HTTP请求–>添加–>断言–>响应断言
响应断言–>要测试的模式(填入你想要的数据)–>(数据里面有想要的数据就正确(STATUS OK是可以匹配成功的),没有就报错(没有匹配到字符串STATUS OKK))
线程组–>添加–>配置元件–>用户自定义变量–>自定义变量–>HTTP请求–>调用值
线程组–>添加–>配置元件–>CSV数据文件设置–>文件名(编辑)–>文件编码(编辑)–>变量名称(自定义 根据所对应的变量)–>HTTP请求(调用这个变量)
CSV数据文件设置–>遇到文件结束符再次循环(true/false(超过文件数量时就报错,不超过就循环))
略
HTTP请求–>添加–>后置处理器–>正则表达式提取器–>引用名称(自定义)–>正则表达式(“head”:"(.*?)")–>模板( 1 1 1)–>匹配数字(0)–>缺省值(null)
在新建一个HTTP请求–>调用请求参数的值(${变量名})
一个JDBC的配置文件 连接库 配置账号密码
一个JDBC request 增删改查
测试计划–>浏览(输入数据库jar包位置) E:\jmeter\jmeter\apache-jmeter-4.0\bin
线程组–>添加–>配置元件–>JDBC Connection Configuration(连接数据库)–>Variable Name for created pool(设置的名称)–>Max Number of Connections(最大连接数据库的数量)–>Max Wait(最大等待的时长)–>Time Between Eviction Runs(打开运行的时间)–> Database URL(jdbc:mysql://127.0.0.1:3306/库名)–>JDBC Driver class(com.mysql.jdbc.Driver)连接数据库的驱动–>Username(用户名)–>Password(密码)
线程组–>添加–>Sampler(采样器)–>JDBC Request–>(绑定设置的名称必须一致)–>(输入sql语句进行测试)
类型:
Query Type(Select Statement) 查询语句
仅支持测试 select语句,并且一次只能测试一条
Update Statement 更新语句
支持测试非select语句,并且支持测试多条,若其中夹杂select语句,自动忽略,若第一条语句为select语句,报错
Callable Statement 所有语句
只要语法正确,任何语句,再多的条数都能支持
1.?serverTimezone=UTC(添加到 Database URL后面) 解决时间不统一的问题
2.allowMultiQueries=true 支持允许多条查询
3.有的时候还需要把服务关掉(mysqlzt禁用) 否则获取不到数据库元素
linux服务器性能测试:
下载对应的插件(JMeterPlugins-Extras.jar和JMeterPlugins-Standard.jar)
将serveragent插件监控服务器资源部署在对应测试的服务器上(linux),启动服务(linux上./startAgent.sh)
然后对外暴露4444端口(/sbin/iptables -I INPUT -p tcp --dport 4444 -j ACCEPT /etc/rc.d/init.d/iptables save —将修改永久保存到防火墙中)
接着在jmeter上添加监听器( PerfMon Metrics Collector),在里面添加需要监控的指标(cpu,内存…)其中对应的服务器是监控的服务器的ip和端口4444
添加聚合报告和查看结果树
最后在线程组中进行不断添加虚拟用户进行增压,查看对应的服务器中cpu和内存以及其他性能指标的变化
服务器(window):
下载对应的插件(JMeterPlugins-Extras.jar和JMeterPlugins-Standard.jar)
将serveragent插件监控服务器资源部署在对应测试的服务器上(window),启动服务(双击startAgent.bat)
接着在jmeter上添加监听器( PerfMon Metrics Collector),在里面添加需要监控的指标(cpu,内存…)其中对应的服务器是监控的服务器的ip和端口4444
添加聚合报告和查看结果树
最后在线程组中进行不断添加虚拟用户进行增压,查看对应的服务器中cpu和内存以及其他性能指标的变化
数据库性能测试
在测试计划中添加数据库的jar包
添加线程组模拟虚拟用户进行并发测试
添加JDBC的连接配置,进行数据库的基本配置url/ip/端口/库名/参数,以及选定数据库的驱动,我们使用的是mysql测试,那么选择MySQL的驱动(oralce则选择对应的oralce的驱动),
最后是连接数据库的用户名和密码添加JDBC的请求,添加变量名称和JDBC的连接配置的变量名称一致,那么两者能进行关联,选择不同的查询类型添加语句进行数据库操作
应用的有csv进行批量数据的操作(使用csv模拟多个用户登录…)
charles使用:
CHarles只能抓取网页的
web端抓包流程:
配置ssh证书----设置代理—配置SSL Proxy Setting添加80和443----打开百度----右键抓包到的网址,Breakpoints设置断点
----Proxy点击Breakpoint Settings写入抓包地址(Query用*)----点击Breakpoints可以编辑Reauest----点击Excute刷新浏览器 Abort停止断点
遇到问题怎样看是前端问题还是后端问题
1,用chalse看返回结果是5是后台 ,4前端,请求问题是前端,响应是后端
2,查看日志,在日志里面看到空指针,内存溢出,oom这些就是后端的问题,如果界面上出现undefund的一般是前端的问题
复制response内容 保存为TXT文件 存放到本地 编码的格式为’utf-8’ 否则可能会出现乱码
接口返回值右击 选择 save response 后 选择response
选中需要修改的response值的接口后右击 选择maplocal功能 query(参数)修改为 *
(map to 下 local path 填TXT文件的绝对路径)
修改TXT文件中 需要修改的字段值
重新请求此接口
完毕后 点击 tools(工具) 点击 map local 取消勾选的 enable map local
选择需要进行测试的接口 右键 选中repeat advance(重复之前)
填写 迭代次数 每次迭代的并发量 每次迭代中多个请求之间的间隔时间
和每次迭代之间的间隔时间
3.勾选 use ranges (使用间隔时间区间) 点击ok
是存储数据库一个仓库,可以存储图片,视频,文字
常见的数据库
大型oracle,db2
中型mysql,sqlserver…
小型sqlite
mysql安装和卸载
停服务mysql
删除对应的文件夹
删除注册表(mysql)
mysql使用
1:黑窗口
2:使用工具 navicat
sql语句分类
数据定义语言DDL create,drop,alter,truncate
数据查询语言DQL select
数据操纵语言DML insert,delete,update
数据控制功能DCL grant 授权 ,revoke回收
字段
主键:primary key
自增:auto_increment
空:null
默认:default
唯一:unique
外键:foreign
…
类型
int
float
double
char 固定长度
varchar 长度变
text
date
time
datetime
…
– create DATABASE 77777 charset=utf8
– 使用数据库
– use 77777
– 创建表
– create table student(
– 主键自增长
– id int PRIMARY key auto_increment,
– sname VARCHAR(20),
– ssex VARCHAR(2),
– sage int,
– sscore FLOAT(4,2)
– )
– 单条添加
– INSERT INTO student (sname, ssex, sscore )VALUES( “张小”, “男”, 10.23 )
– 多条添加
– INSERT into student VALUES(0,“姓名”,“男”,2,19.23),(0,“姓名”,“男”,3,29.23)
------数据库添加字段
alter table 表名 add 字段名 约束(varchar(20));
------修改字段名
alter table 表名 change column 旧字段名 新字段名 新数据类型;
------修改表名
alter table 旧表名 rename to 新表名
------删除字段
alter table 表名 drop column 字段名
------删除表
drop table 表名
------删除库
drop database 库名
– 修改数据
– update 表名 set 字段=修改的数据(name =zhangsan) where 字段=值(id=1)
– UPDATE student set sname=“jingling” where id=4
– 查询(全查,条件查询,模糊查询,排序,分组)
– 全查
– select * from 表名
– select * from student
– 条件查询,查询id为1和2的数据
– select * from 表名 where id=1 or id =2
– select * from 表名 where id=1 or id =2
– select * from student where id BETWEEN 1 and 4
– 查询id为1,2,3,4的这4条数据
– select * from 表名 where id in(1,2,3,4)
– 查询第二条到第四条id的数据
– select * from 表名 where id BETWEEN 2 and 4
– select * from student where id BETWEEN 2 and 4
–模糊查询
–查询以小开头的名字
– SELECT * FROM student where sname like ‘小%’
–查询以小结尾的名字
– SELECT * FROM student where sname like ‘%小’
– 查询sname参数里面包含有小字的条目
– SELECT * FROM student where sname like ‘%小%’
– 升序 sscore参数升序排序
– select * from 表名 ORDER BY 升序的参数名
– select * from student ORDER BY aaaaa
– 降序 sscore参数降序排序
– select * from 表名 ORDER BY 降序的参数名 desc
– select * from student ORDER BY aaaaa desc
– 分组查询
HAVING + GROUP BY
select count(*) from student GROUP BY ssex HAVING sum(sscore)>=85
– 删除id为17的条目
– DELETE from student where id=17
– 删除sscore为10.23的条目
– DELETE from student where sscore=10.23
select 字段,… from 表名 group by 字段,…
select sum(字段名) from 表名 group by 字段名 having sum(字段名) < 10 (查询某字段总和小于10的)
select * from 表名 limit 0,2 (每页显示2个,第一个页面)
– 聚合函数
count()记录总条数
select count(*) from 表名
sum()所有值的总和
select sum(字段名) from 表名
AVG()平均值
select AVG(字段名) from 表名
max()最大值
select max(字段名) from 表名
min()最小值
select min(字段名) from 表名
db.tablename.remove({‘name’:‘value’})
//删除表
db.tablename.drop()
//删除库
db.dropDatabase()
inner join … on 等值连接
left join … on 左连接
right join … on 右连接
select 表A.字段1,表B.字段1 from 表A [inner | left | right] join 表B on 表A.字段2 = 表B.字段2
–多表联查:
Where 查询条件,内连接可以使用
on内外连接时候用 查询的意思
取别名 as 或者是不写
in查询某值是否在某条件里
多表联查 2表
SELECT c.classroom,s.sex FROM class as c INNER JOIN student s on c.id=s.id
多表联查 3表
SELECT c.classroom,s.sex,sc.school FROM class as c INNER JOIN student as s on c.id=s.id INNER JOIN school as sc on c.id=sc.id
-----子查询(一个表的查询的结果作为另一个表的条件)
SELECT cid from school where school =‘北京’
SELECT classroom from class where cid=(SELECT cid from school where school =‘北京’)
详细解释
多表联查
内连接 inner join
外连接 left join ,right join
全连接 full join (不适用mysql,使用oracle) = left join+ union+right join
--------sql语句
select s.字段,c.字段,,, from student(表1) as s inner join(left join ,right join) class(表2) c on s.字段 = c.字段
------内连接
select s.sname,s.sex,c.classroom from class c INNER JOIN student s on s.sid = c.sid
SELECT sc.school,c.classroom from school as sc INNER JOIN class as c on sc.cid = c.cid
---------左外连接
select s.sname,s.sex,c.classroom from class c left JOIN student s on s.sid = c.sid (左边为主表,右边有则填充,没有用null)
---------右外连接
select s.sname,s.sex,c.classroom from class c RIGHT JOIN student s on s.sid = c.sid (右边为主表,左边有则填充,没有用null)
----------全连接(不适用mysql)
select s.sname,s.sex,c.classroom from class c full JOIN student s on s.sid = c.sid
-------全连接
select s.sname,s.sex,c.classroom from class c left JOIN student s on s.sid = c.sid UNION select s.sname,s.sex,c.classroom from class c RIGHT JOIN student s on s.sid = c.sid
------多表联查(后面的id是,3个表里面都有的id会显示出来)
select c.classroom,st.sname,st.sex ,sc.school from class as c INNER join student as st on c.sid = st.sid
INNER JOIN school as sc on c.cid = sc.cid
–子查询:
(子查询比较耗时,子查询的响应时间比较繁琐,响应时间比较慢,可能会超过8秒,我们在测试接口的时候有一个258原则(就是请求时间不超过2秒是非常好的,2到5秒还可以,超过8秒就不能接受啦,如果超过8秒的就得找开发优化数据库里面的数据啦))
select id from class WHERE id=2
select sname from student WHERE id=(select id from class WHERE id=2)
数据库卸载:
卸载
mysql卸载的话要卸载干净,不卸载干净的话下次安装不上去(卸载的时候先先给mysql的服务给停啦)
1,停服务
2,删除对应的文件夹
3,删除注册表
然后还有注册表以及mysql全部文件夹都要全部删掉
比较坑的是到公司用别人的电脑,人家离职啦,没给卸载干净,然后自己安装一直安装不上
WEB测试点:
页面:页面清单是否显示,是否显示完整正确
提示信息:操作页面成功,失败提示
危险操作,重要操作,比图删除某些重要信息
容错性:非空,唯一性,特殊字符
权限部分:
功能权限:用户可以使用哪些功能,不能使用哪些功能
数据权限:指定用户可以处理哪些功能,不能使用哪些功能
操作权限:在逻辑关系上,操作前后顺序,数据处理情况
兼容性:
操作系统兼容性:windows windows7 win8 win10 mac Linux
浏览器兼容:IE 8,9,10 google 火狐 QQ浏览器,360 搜狗 苹果的safari
安全性:
1.用户验证:登陆密码验证,
用户超时,登陆超过30分钟,重新登陆(安全设置,cookie过去时间超过30秒) 权限验证
安全 sql注入 xss攻击 加密
业务安全,账号 资金 超时验证
安装插件 安装测试报告插件
配置变量
配置jdk和ant
创建项目------写入名字------自由风------设置触发检查时间------配置git,ant,jdk
开发修改提交最新的代码,jenkins会一直监测git的提交状态,设置测试报告多久检测一次的时间,他会不断的监测,就比如半夜12点左右,想看最新的开发包,这时候你还得找开发打包,用持续集成的话,他根据你设定好的时间来监测开发在git中提交的最新的代码,给你发最新的包,你随时想测试最新的包,就在邮件中下载就可以啦
界面,功能,安全,可靠,可移植,兼容,易用
1,界面测试:和原型图UI图是否一致 ,颜色字体大小,位置,是否正确
2,功能测试:用水杯装水看漏不漏,水能不能被喝到
3,安全性:杯子有没有细菌,有没有毒
4,可靠性:被子从不同高低扔下来的损坏程度
5,可移植性:杯子在不同的地方,温度等环境下是否都可以正常使用
6,兼容性:被子是否能容纳果汁,白水,酒精,汽油等
7,易用性:被子是否烫手,是否有防滑措施,是否方便喝水
8,用户文档:使用手册是否对杯子的用法,限制,使用条件都可以正常使用
9,疲劳测试:将杯子盛水放24小时以上检查泄露时间和情况,将杯子盛汽油放24小时以上检查泄露时间和情况
10,压力测试:用跟针在针上面不断施加重量,看压强多大能穿透
11,跌落测试:杯子里面有东西,在多高情况下扔下去不破