测试熟手:功能性测试的简单自动化
UI测试背景知识
什么是测试
- 通俗的来讲,程序测试就是运行程序,并发现程序中的错误。
- 专业一点来讲,验证软件的正确性,完整性,安全性和质量过程。
- 用程序员的话就是找bug
- 软件测试是一个过程
目录- UI测试背景知识
- 接口介绍
- 什么是Fiddler
- 如何在Linux上安装Fiddler
- 代理设置
- Inspector 模块
- 包过滤 filter
- AutoPesponder模块
- 改包及重新发包
- https协议的抓取
- 接口与安全
- XSS漏洞简介
- 什么是DevOps
- 准备
- 服务器端安装jenkins
- docker对测试来说有什么用
- Dcoker常见的命令
- docker 下如何部署测试环境
- Jenkins
- Github Action
- 参考资料
- 思考
- 什么是Github Actions
- Dockerfile
- 去买一个便宜的服务器,操作系统选择centos 7.X 配置测试机 阿里云较贵,可以考虑 腾讯云,华为云等 学习用,只要是一个服务器而已,不用太考虑稳定性和其他扩展能力
- jenkins 持续交付
- 持续角度系列课程概览
- 实战项目简介
- 实战项目构成
- 环境准备
- 项目配置、调试、运行
- 本章小结
- Tomcat 部署持续交付实战
- Docker部署持续交付实战
- 生产与持续分离
- UI测试框架
- 如何多设备执行UI自动化的测试
- APP功能测试
- adb
接口介绍
作为测试工具的练习项目,我建议选一些公开的培训公司的项目像 程序员的 "黑马头条",尚学堂的"品优购", 选取培训机构的项目作为测试的理由有:1. 这些项目的源码一般是公开的,且不会出现特别离奇的bug, 2.一般他们的后台是公开的(这种培训机构一般是把后端开放在网上,让学员写前端,要么把前端代码给学员让他们写后端)且不会出现太大的限制
接口工具使用
JMeter
启动JMeter
- 在系统桌面上右键鼠标,点击在此打开终端,打开Terminal 终端
- 输入命令:jmeter ,然后按回车,会打开JMeter主窗口,记住保持Termal 终端窗口不要被关闭,否则JMeter也将被关闭
- 点击左上方工具条的Options --> Choose Language --> Chinese (Simplified), 将软件的语言转换成中文,但其实汉化的不好,很多界面上的控件都没有被汉化
保存JMeter 工程 - 点击上方工具条的”文件“,然后带点击”保存测试计划“ 或”保存测试计划为“
- 在新打开的保存窗口输入File Name 文件名称(后缀名 .jmx)
- 选择保存路径
- 点击Save 后保存成功,因此文件的绝对路径是
- 在JMeter 的世界里,一个Test Plan 测试计划就是一个JMeter 文件(jmx文件)
线程组
- JMeter中,最核心的就是线程组,所有的测试活动(接口测试,性能测试,数据库压力测试)都是基于线程组进行工作的
- 一个线程相当于一个用户,多个线程(用户)形成了一个线程(用户)组,线程数默认是1
- 做接口的功能测试时,线程数保持是1即可,即一个测试人员在进行测试
- 对接口进行压力测试时,可以根据实际情况把组内的线程数改成我们需要的数量,即一组测试人员一起进行测试
线程组的添加
- 鼠标右键”测试计划“,依次点击:添加 --> 线程--> 线程组 (默认名称线程组)
- 企业实战中,做接口测试一般会把一个线程组作为一个项目工程,所以建议命名为项目名称
- 修改完名称后 按回车是没有用的,仅以鼠标左击一下Test Plan ,线程组的名称才会变化
线程组的操作管理
JMeter的线程组支持:剪切,复制, 粘贴, 复写,删除和多线程之间的顺序调整
启用、禁用线程组
- 新建的线程组默认是启用状态的
- 右键线程组名称,启用或禁用该线程组
- 线程组被禁用后,线程组及下面的所有内容将不被JMeter 运行,类似与代码被注释掉
JMeter 的第一个HTTP 请求(管理员登录,post 方法)
- 右键线程组,点击”添加“---> 取样器----> HTTP 请求,前面如果已经有其他请求,新的请求永远排列在最后
- 修改HTTP 请求的名称,由于JMeter 没有Collection 目录也没有子文件夹,所以请求的命名一般建议使用”模块化的方式“(鼠标移动到请求名称上会显示请求的注释)
- 设置HTTP 请求的”基本信息”:
- 协议: Http
- 服务器名称或IP:localhost
- 端口号:6088
- HTTP 请求: POST
- 路径:/api/User
- 内容编码: utf-8
- 保持默认勾选的“跟随重定向”和使用KeepAlive,其他勾选框保持不动,不要勾选
- 点击“具体数据” ,填入json 字符串
{
"username":"admin",
"password":"123"
}
6.由于JMeter默认的请求Header 的Content-Type是:application/x-www-form-urlencode,所以当请求体内容是json字符串时,需要更高请求头里的Content-type ,步骤如下
右键指定的HTTP 请求
点击“添加--> 配置元件--> HTTP 信息头管理器”,在HTTP请求下创建了一个“HTTP消息头管理器”(默认名称)
点击最下方【添加】,名称输入content-type, 值输入 application/json - JMeter 的响应结果时需要手工添加“查看结果树才看见的”
7.1 右键指定HTTP 请求
7.2 点击“添加--->监听器---> 查看结果树” 在HTTP 请求下创建了一个结果树(默认名称) - 在JMeter 中,无论时HTTP 信息头管理器,查看结果树还是其它任何配置组件,生效作用域的规则是
- 如果配置组建在HTTP 请求下,则只对这个单个请求生效
- 如果配置组建在线程组下,则对整个线程组下的所有请求生效(全局配置组建)
- 如果有了全局配置组建,但单个请求下还有相同类型的配置组件,则生效的单个的请求下的配置组件
9 点击上方工具条中的“绿色的三角图标”启动和运行JMeter, 开始从上到下逐个发送请求(禁用的请求会跳过)
10 . JMeter的HTTP 请求支持:剪切,复制,粘贴,复写,删除和多请求之间的顺序调整(和线程组基本差不多)
查看结果树
1,运行结束后,点击[查看结果树]
2. “查看结果树”有3大模块
2.1 取样器结果:请求与响应的一些概要信息,比较重要的是Response code 和Response message
2.2 请求:分Request Body 和Request Header 两个模块,前者记录发送请求的请求体内容,后者记录请求头,当请求错误时,我们经常会去做请求的分析,看看到底是请求时内容写错了,还是确实是服务器返回的内容不正确
2.3 响应数据: 分Response Body 和Response headers 两个模块,前者记录服务器响应内容,后者记录服务器的响应头信息
用户定义的变量
- 接口测试的理念是一样的,我们需要设置公共的变量,不然接口的IP地址等
- 右键线程组,点击“添加-->配置元件--> 用户定义的变量(有两个同名,上面那个)”
- 添加以后再线程组内的最下方创建一个自定义 变量组件
使用JMeter 进行借口的性能测试以及MySQL数据库的性能测试
被测系统 XXX 管理系统
接口需求文档:
MySQL 数据库驱动包
性能测试, 线程组属性的配置,集合点的用法, 事务的概念和用法, 常用的性能测试报告,Jmeter 性能指标
MySQL 数据库性能测试
线程属性
- 线程数: 设置虚拟用户数,一个虚拟用户占用一个进程或一个线程。 线程数就相当于虚拟用户数
- Ramp-up时间:设置的线程启动时长,单位为秒。如果线程数为100,准备时常为20秒,那么需要20秒启动100个线程,平均每秒启动5个线程
- 循环次数:每个线程发送请求的个数,如果线程数为100,循环次数为2,总请求数为100*2=200 次。如果勾选了“永远”复选框,那么线程会循环发送请求,知道手工点击工具栏停止按钮,或者设置的线程运行时间结束才会停止运行
- 持续时间(秒): Jmeter持续运行的时间,建议配合永远循环使用
- 启动延迟(秒): 做准备工作,但是延迟创建线程
集合点(真正的并发)
- 添加集合点: 右键线程组---> 添加---> 定时器--->Synchronzing Timer
- 模拟用户组的数量:集合到多少用户后就瞬间释放,不可大于线程数,不然永远释放不掉; 如果设置为0,等同于为线程组中的线程数
- 超时时间以毫秒为单位: 即使线程用户没有达到设定的数量, 但是时间到了也就释放掉;设置为0,将等待线程数达到了设置的值才释放
事务控制器 - 添加事务 :右键线程组---> 添加---> 逻辑控制器---> 事态控制器
- 如果把多个接口放到事务控制器里,代表用户做一系列动作,如果有一个请求失败,整个事务就算失败
- Generate parent sample:如果勾选,则只有事务才会被显示在性能测试报告中,如果不勾选事务中和事务内的每一个请求都会显示在报告中
- Include duration of time and pre-post proccessors in generated sample: 事务的计算时间包括计时器、预处理的时间,个人建议不要勾选
-性能报告查看
聚合报告; 图形结果; 汇总图
聚合报告
Label:接口请求或事务等的自定义名称
样本:各个请求的取样数量
平均值: 平均响应时间,单位(毫秒)默认是单个请求的平均响应时间,当使用了事务控制器时,也可以是以事务为单位显示平均响应时间
中位数:50% 的用户响应时间小于这个值
90% 百分位 :90%的用户响应时间小于这个值
95% 百分位: 95%的用户响应时间小于这个值
99% 百分位 99% 的用户响应时间小于这个值
最小值: 用户响应时间最小值
最大值: 用户响应时间最大值
异常%:请求错误率 = 错误请求的数量/请求的总数
吞吐量:也叫吞吐率, 吞吐量= 请求数/总时间, 每秒完成处理的用户请求数,一般认为它为TPS,注意单位变化,当TPS很低时,jmeter 中默认认统计为每分钟的值,这是我们需要换算成以秒为单位
接受 KB/sec :每秒从服务器接受到的数据量
发送 KB/sec: 每秒发送给服务器端的数据量
MySQL数据库性能测试
- 选中 Test Plan 测试计划,在最下方的“添加目录或jar包到Class Path 区域”点击“浏览”把MySQL数据库驱动包(jar包)加载进来
- 打开JMeter,右键 Test Plan测试计划---> 添加--->配置---> 原件--->JDBC Connection
- 设置各配置项及重要配置项的名词解释
- Variable Name Bound to Pool区域
Variable Name Bound to Pool 区域
Variable Name for created Pool :xxx 创建一个数据库连接池变量名,名字可以任取 和后续的取样器中的JDBC Request 中设置的Variable Name 要是指一致
两个变量一致代表绑定成功,JDBC请求就会根据这里的JDBC 连接配置访问数据库 - Connection Pool Configuration 区域
Max Number of Connections:100 测试的数据的最大连接数(可以通过SQL语句查看)Max Number like 'max_connections%'
Max Wait (ms):10000(默认等10秒钟) 最大建立连接时间,大于该时间的话是视为请求连接数据库失败
Time Between Eviction Runs(ms):60000 (默认等于1分钟) 每xx 毫秒运行一次空闲连接回收器,清理掉已经连接但没有工作的“连接”
这个回收器时独立线程不会影响到JMeter 的线程
Auto Commit :True(默认) 事务自动提交,选择 True ,请求中的SQL 语句执行结束后会自动提交, 选择False ,请求中的SQL语句结束后不会自动提交,需要手写commit 语句
Connection Valiation By Pool区域
Test While Idle True(默认) 测试数据连接池的空闲状态
Soft Min Evicatable Idle Timer(ms) :5000(默认等于5秒)每个5000毫秒(5秒)执行一次“select 1 查询语句”来确认数据库连接池里面的”连接“ 仍然有效
Validation Query:选择 select 1 选择一个用于确认数据库连接池的“连接”是否有效的SQL语句,, select 1 意思时查到所有的值都是它要的结果,而且select 1语句执行性能也最快
Database Connection Configuration 区域
DataBase URL:jdbc:mysql:// 127.0.0.1:3306/xxx_forstudy // 数据库地址
jdbc :数据库产品名称://数据库服务器地址: 数据库端口号/需要测试的具体是哪一个数据库
虽然localhost的ip地址就是 127.0.0.1, 但是这里填写数据库服务器地址时不可以localhost
JDBC Driver calss: com.msql.jdbc.Driver
下拉列表中选择一个对应的MySql 数据库
Username:root 访问数据库的用户名
Password:123456 访问数据库密码
4. 在Test Plan 下添加一个线程组并右键,然后一次点击“添加”--> 取样器-->JDBC Request
5. 在Variable Name of Pool declared In JDBC Connection Configuration 后填写变量名称,必须要和JDBC连接配置组建中声明的变量名称一致,代表绑定成功;刚才设置的变量名称xxx,所以这里也要填写xxx
SQL Query 区域的Query Type(查询类型) 保持默认的Select Statement(选择语句,即SQL 查询语句)
6. 在下方区域输入查询语句 select * from OKR_forstudy.V_User;
7. 添加合适的响应断言,网络状态码,SQL 语句查询结果的内容
8. 添加合适的监听器
9. 设置线程组的性能指标,开始执行MySQL 数据库的性能测试
Mock Server
为什么会出现Mock Server
项目邻近上线,但是前后端完成度不一样,如果等前后端代码都完成后会影响测试,所以产了Mock技术.
什么是Mock Server?
Mock Server 模拟服务器: 通过模拟真实的服务器,提供对来自客户端的真实请求,Mock Server 可以搭建在本地也可以搭建在远程,可以返回静态的数据也可以返回动态的数据
Mock Server 通常被用来干什么
在工作中,通常以接口的形式以Mock API Server 对外提供服务
- 前后端联调使用,通过实现约定的接口规范,使前端可以不依赖后端服务,独立开始工作
- 使用Mock Server 屏蔽无关的真实服务,从而专注于要测试的服务
- 供测试工程师使用, 在测试环境避免调用第三方收费服务
- 屏蔽第三方依赖
Mock Server
不写代码:postman
写代码
1java Mock-Server:https://github.com/mock-server/mockserver - python response: https://github.com/getsentry/responses
- javascript easy-mock https://github.com/easy-mock/easy-mock
自己实现一个demo版的Mock Server
flask 中文文档: https://flask.net.cn/
from flask import Flask,request,json,abort
app = Flask(__name__)
@app.route('/mock', methods=['GET'])
def index():
return "Hello world"
@app.route('/mock',methods=['POST','GET'])
def mock():
if request.method =="GET":
abort(404)
else:
try:
name = request.form['name']
print(name)
if name=="Alex":
data = {"status":200,"message":"True","response":{"orderId":"100"}}
else:
data = {"status":400,"message":"False","response":{}}
except:
data = {"status":400,"message":"False","response":{}}
return json.dumps(data)
if __name__ == '__main__':
app.run()
cypress
前端单元测试工具 cypress
https://www.cypress.io/
- 安装cypress
- 找到要Mock的接口,观察它的请求和返回
- 使用cy.server().route() 达到Mock的目的
什么是Fiddler
Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据(指cookie,html,js,css等文件)。Fiddler 是用C##写出来的,它包含一个简单却功能强大的基于JScript .NET 事件脚本子系统,它的灵活性非常棒,可以支持众多的http调试任务,并且能够使用.net框架语言进行扩展。
如何在Linux上安装Fiddler
- 安装mono:apt-get install mono-complete
- 执行:mono Fiddler.exe
- linux下进行云手机的反向代理
- adb sub
- adb reverse tcp:8888 tcp:8888
- scrcpy -m 540 -b 1M
代理设置
web端设置代理
App端设置代理
通过包颜色初步判断请求状态
包的颜色:
红色 HTTP状态错误
黄色 HTTP状态需用户认证
灰色 数据流类型CONNECT 或 响应内容是图片
紫色 响应内容是CSS文件
蓝色 响应内容是HTML
绿色 响应内容是Script文件
Inspector 模块
包过滤 filter
AutoPesponder模块
改包及重新发包
https协议的抓取
接口与安全
黑客视角下为业务流程
OWASP组织
-
OWASP Mobile
-
所有的做法都是面向安全工程师,而非测试工程师
-
提供的解决方法无法在有限的项目周期内完成
-
主要聚焦于测试工程师需要掌握的安全技能
- 移动端安全
- 服务端安全
安全测试模拟环境
-
安全模拟环境
- DVWA
- https://dvwa.ceshiren.com/index.php
- admin password
服务端
-
安全问题例子
-
服务端安全分类
-
网络安全
-
系统安全
-
应用安全(业务安全)
- 应用代码:Java Python PHP Ruby
- 应用框架:Spring Structs
- 应用服务器:Tomcat JBoss Apache Nginx
常见安全工具
-
OWASP ZAP
-
WVS
-
AppScan
-
BurpSuite
-
Sqlmap
安全工具关注维度 -
传输
- 敏感信息传输
- 链路加密
-
接口
- 访问控制
-
参数
- 注入:SQL注入,命令注入,文件注入
- 越权:越过更高权限,越过同级权限
-
业务安全常见的checklist
- 业务数据传输链路分析
- http是否传输敏感信息
- tcp 等协议是否可被解密
- 资产分析
- api 清单收集:明确敏感信息分级,可访问验证
- api 参数收集,明确参数分类针对分析
- token 可遍历
- 文件上传
- 身份参数的有效验证
- 建立安全测试流程
- 白盒代码分析:自动化
- sonar, findbugs等
- 黑盒扫描机制:自动化
- zap,wvs,burpsuite,appscan,sqlmap
- 业务流程安全搜索: 人工检测
- burpsuite,zap
命令注入漏洞
- burpsuite,zap
- 白盒代码分析:自动化
- 业务数据传输链路分析
-
命令注入是一种攻击,其目标是通过易受攻击的应用程序在主操作系统上执行任意命令。当应用程序将用户提供的不安全数据(表格),cookie,HTTP标头等)传递到Shell时,可能会发生命令注入攻击。在这种攻击中,通常由易受攻击的应用程序以特权执行由攻击者提供的操作系统命令。由于没有足够的验证,因此可能发生命令注入攻击
- 常用漏洞利用payload
- 多语句分号:;
- 条件执行: && ||
- 管道符号: |
SQL 注入漏洞
- 常用漏洞利用payload
-
SQL 注入,也称SQL注入或SQL注码,是发生于应用程序与数据库层的安全漏洞。简而言之,是在输入的字符串中注入SQL指令,在设计不良的程序当中忽略了字符检查,那么这些注入进去的恶意指令就会被数据库服务器误以为是正常的SQL指而运行,因此遭到破坏或是入侵
-
常见的sql注入命令
-
sql危害与预防
- 危害: 漏洞可以让黑客无限制的使用sql,造成数据泄露甚至远程命令执行
- 预防:使用参数化查询避免数据被混在指令中
XSS 漏洞
-
XSS漏洞简介
-
常见的攻击手段
-
危害与防范
CSRF漏洞介绍与原理
接口测试
启动JMeter
- 在系统桌面上右键鼠标,点击在此打开终端,打开Terminal 终端
- 输入命令:jmeter ,然后按回车,会打开JMeter主窗口,记住保持Termal 终端窗口不要被关闭,否则JMeter也将被关闭
- 点击左上方工具条的Options --> Choose Language --> Chinese (Simplified), 将软件的语言转换成中文,但其实汉化的不好,很多界面上的控件都没有被汉化
保存JMeter 工程 - 点击上方工具条的”文件“,然后带点击”保存测试计划“ 或”保存测试计划为“
- 在新打开的保存窗口输入File Name 文件名称(后缀名 .jmx)
- 选择保存路径
- 点击Save 后保存成功,因此文件的绝对路径是
- 在JMeter 的世界里,一个Test Plan 测试计划就是一个JMeter 文件(jmx文件)
线程组
- JMeter中,最核心的就是线程组,所有的测试活动(接口测试,性能测试,数据库压力测试)都是基于线程组进行工作的
- 一个线程相当于一个用户,多个线程(用户)形成了一个线程(用户)组,线程数默认是1
- 做接口的功能测试时,线程数保持是1即可,即一个测试人员在进行测试
- 对接口进行压力测试时,可以根据实际情况把组内的线程数改成我们需要的数量,即一组测试人员一起进行测试
线程组的添加
- 鼠标右键”测试计划“,依次点击:添加 --> 线程--> 线程组 (默认名称线程组)
- 企业实战中,做接口测试一般会把一个线程组作为一个项目工程,所以建议命名为项目名称
- 修改完名称后 按回车是没有用的,仅以鼠标左击一下Test Plan ,线程组的名称才会变化
线程组的操作管理
JMeter的线程组支持:剪切,复制, 粘贴, 复写,删除和多线程之间的顺序调整
启用、禁用线程组
- 新建的线程组默认是启用状态的
- 右键线程组名称,启用或禁用该线程组
- 线程组被禁用后,线程组及下面的所有内容将不被JMeter 运行,类似与代码被注释掉
JMeter 的第一个HTTP 请求(管理员登录,post 方法)
- 右键线程组,点击”添加“---> 取样器----> HTTP 请求,前面如果已经有其他请求,新的请求永远排列在最后
- 修改HTTP 请求的名称,由于JMeter 没有Collection 目录也没有子文件夹,所以请求的命名一般建议使用”模块化的方式“(鼠标移动到请求名称上会显示请求的注释)
- 设置HTTP 请求的”基本信息”:
- 协议: Http
- 服务器名称或IP:localhost
- 端口号:6088
- HTTP 请求: POST
- 路径:/api/User
- 内容编码: utf-8
- 保持默认勾选的“跟随重定向”和使用KeepAlive,其他勾选框保持不动,不要勾选
- 点击“具体数据” ,填入json 字符串
{
"username":"admin",
"password":"123"
}
6.由于JMeter默认的请求Header 的Content-Type是:application/x-www-form-urlencode,所以当请求体内容是json字符串时,需要更高请求头里的Content-type ,步骤如下
右键指定的HTTP 请求
点击“添加--> 配置元件--> HTTP 信息头管理器”,在HTTP请求下创建了一个“HTTP消息头管理器”(默认名称)
点击最下方【添加】,名称输入content-type, 值输入 application/json - JMeter 的响应结果时需要手工添加“查看结果树才看见的”
7.1 右键指定HTTP 请求
7.2 点击“添加--->监听器---> 查看结果树” 在HTTP 请求下创建了一个结果树(默认名称) - 在JMeter 中,无论时HTTP 信息头管理器,查看结果树还是其它任何配置组件,生效作用域的规则是
- 如果配置组建在HTTP 请求下,则只对这个单个请求生效
- 如果配置组建在线程组下,则对整个线程组下的所有请求生效(全局配置组建)
- 如果有了全局配置组建,但单个请求下还有相同类型的配置组件,则生效的单个的请求下的配置组件
9 点击上方工具条中的“绿色的三角图标”启动和运行JMeter, 开始从上到下逐个发送请求(禁用的请求会跳过)
10 . JMeter的HTTP 请求支持:剪切,复制,粘贴,复写,删除和多请求之间的顺序调整(和线程组基本差不多)
查看结果树
1,运行结束后,点击[查看结果树]
2. “查看结果树”有3大模块
2.1 取样器结果:请求与响应的一些概要信息,比较重要的是Response code 和Response message
2.2 请求:分Request Body 和Request Header 两个模块,前者记录发送请求的请求体内容,后者记录请求头,当请求错误时,我们经常会去做请求的分析,看看到底是请求时内容写错了,还是确实是服务器返回的内容不正确
2.3 响应数据: 分Response Body 和Response headers 两个模块,前者记录服务器响应内容,后者记录服务器的响应头信息
用户定义的变量
- 接口测试的理念是一样的,我们需要设置公共的变量,不然接口的IP地址等
- 右键线程组,点击“添加-->配置元件--> 用户定义的变量(有两个同名,上面那个)”
- 添加以后再线程组内的最下方创建一个自定义 变量组件
使用JMeter 进行借口的性能测试以及MySQL数据库的性能测试
被测系统 XXX 管理系统
接口需求文档:
MySQL 数据库驱动包
性能测试, 线程组属性的配置,集合点的用法, 事务的概念和用法, 常用的性能测试报告,Jmeter 性能指标
MySQL 数据库性能测试
线程属性
- 线程数: 设置虚拟用户数,一个虚拟用户占用一个进程或一个线程。 线程数就相当于虚拟用户数
- Ramp-up时间:设置的线程启动时长,单位为秒。如果线程数为100,准备时常为20秒,那么需要20秒启动100个线程,平均每秒启动5个线程
- 循环次数:每个线程发送请求的个数,如果线程数为100,循环次数为2,总请求数为100*2=200 次。如果勾选了“永远”复选框,那么线程会循环发送请求,知道手工点击工具栏停止按钮,或者设置的线程运行时间结束才会停止运行
- 持续时间(秒): Jmeter持续运行的时间,建议配合永远循环使用
- 启动延迟(秒): 做准备工作,但是延迟创建线程
集合点(真正的并发)
- 添加集合点: 右键线程组---> 添加---> 定时器--->Synchronzing Timer
- 模拟用户组的数量:集合到多少用户后就瞬间释放,不可大于线程数,不然永远释放不掉; 如果设置为0,等同于为线程组中的线程数
- 超时时间以毫秒为单位: 即使线程用户没有达到设定的数量, 但是时间到了也就释放掉;设置为0,将等待线程数达到了设置的值才释放
事务控制器 - 添加事务 :右键线程组---> 添加---> 逻辑控制器---> 事态控制器
- 如果把多个接口放到事务控制器里,代表用户做一系列动作,如果有一个请求失败,整个事务就算失败
- Generate parent sample:如果勾选,则只有事务才会被显示在性能测试报告中,如果不勾选事务中和事务内的每一个请求都会显示在报告中
- Include duration of time and pre-post proccessors in generated sample: 事务的计算时间包括计时器、预处理的时间,个人建议不要勾选
-性能报告查看
聚合报告; 图形结果; 汇总图
聚合报告
Label:接口请求或事务等的自定义名称
样本:各个请求的取样数量
平均值: 平均响应时间,单位(毫秒)默认是单个请求的平均响应时间,当使用了事务控制器时,也可以是以事务为单位显示平均响应时间
中位数:50% 的用户响应时间小于这个值
90% 百分位 :90%的用户响应时间小于这个值
95% 百分位: 95%的用户响应时间小于这个值
99% 百分位 99% 的用户响应时间小于这个值
最小值: 用户响应时间最小值
最大值: 用户响应时间最大值
异常%:请求错误率 = 错误请求的数量/请求的总数
吞吐量:也叫吞吐率, 吞吐量= 请求数/总时间, 每秒完成处理的用户请求数,一般认为它为TPS,注意单位变化,当TPS很低时,jmeter 中默认认统计为每分钟的值,这是我们需要换算成以秒为单位
接受 KB/sec :每秒从服务器接受到的数据量
发送 KB/sec: 每秒发送给服务器端的数据量
MySQL数据库性能测试
- 选中 Test Plan 测试计划,在最下方的“添加目录或jar包到Class Path 区域”点击“浏览”把MySQL数据库驱动包(jar包)加载进来
- 打开JMeter,右键 Test Plan测试计划---> 添加--->配置---> 原件--->JDBC Connection
- 设置各配置项及重要配置项的名词解释
- Variable Name Bound to Pool区域
Variable Name Bound to Pool 区域
Variable Name for created Pool :xxx 创建一个数据库连接池变量名,名字可以任取 和后续的取样器中的JDBC Request 中设置的Variable Name 要是指一致
两个变量一致代表绑定成功,JDBC请求就会根据这里的JDBC 连接配置访问数据库 - Connection Pool Configuration 区域
Max Number of Connections:100 测试的数据的最大连接数(可以通过SQL语句查看)Max Number like 'max_connections%'
Max Wait (ms):10000(默认等10秒钟) 最大建立连接时间,大于该时间的话是视为请求连接数据库失败
Time Between Eviction Runs(ms):60000 (默认等于1分钟) 每xx 毫秒运行一次空闲连接回收器,清理掉已经连接但没有工作的“连接”
这个回收器时独立线程不会影响到JMeter 的线程
Auto Commit :True(默认) 事务自动提交,选择 True ,请求中的SQL 语句执行结束后会自动提交, 选择False ,请求中的SQL语句结束后不会自动提交,需要手写commit 语句
Connection Valiation By Pool区域
Test While Idle True(默认) 测试数据连接池的空闲状态
Soft Min Evicatable Idle Timer(ms) :5000(默认等于5秒)每个5000毫秒(5秒)执行一次“select 1 查询语句”来确认数据库连接池里面的”连接“ 仍然有效
Validation Query:选择 select 1 选择一个用于确认数据库连接池的“连接”是否有效的SQL语句,, select 1 意思时查到所有的值都是它要的结果,而且select 1语句执行性能也最快
Database Connection Configuration 区域
DataBase URL:jdbc:mysql:// 127.0.0.1:3306/xxx_forstudy // 数据库地址
jdbc :数据库产品名称://数据库服务器地址: 数据库端口号/需要测试的具体是哪一个数据库
虽然localhost的ip地址就是 127.0.0.1, 但是这里填写数据库服务器地址时不可以localhost
JDBC Driver calss: com.msql.jdbc.Driver
下拉列表中选择一个对应的MySql 数据库
Username:root 访问数据库的用户名
Password:123456 访问数据库密码
4. 在Test Plan 下添加一个线程组并右键,然后一次点击“添加”--> 取样器-->JDBC Request
5. 在Variable Name of Pool declared In JDBC Connection Configuration 后填写变量名称,必须要和JDBC连接配置组建中声明的变量名称一致,代表绑定成功;刚才设置的变量名称xxx,所以这里也要填写xxx
SQL Query 区域的Query Type(查询类型) 保持默认的Select Statement(选择语句,即SQL 查询语句)
6. 在下方区域输入查询语句 select * from OKR_forstudy.V_User;
7. 添加合适的响应断言,网络状态码,SQL 语句查询结果的内容
8. 添加合适的监听器
9. 设置线程组的性能指标,开始执行MySQL 数据库的性能测试
什么是DevOps
https://roadmap.sh/devops
DevOps岗位职责
- 整合公司现有工具,推动工具链的使用,借助新技术完善公司的工具链。
- 连接开发运维测试, 以用户为中心,不断重构自己
DevOps的要求 - 代码能力: 脚本语言+ 高级语言能力
- 自动化能力:熟练使用并理解CI/CD 各个关键节点上的典型工具
- IT基础能力: K8S,优化 业务流程
如何增强DevOps能力 - 强化代码能力 + 跨职能领域核心能力+ 潜移默化的软实力建设
准备
项目:https://gitee.com/shuaiqiangliu/studentmanager
所用软件
服务器端安装jenkins
- 时间同步---> 确保工具集成时间一致
- 安装 ntpdate
yum install ntp ntpdate
- 设置时间为阿里服务器的时间
**ntpdate ntp1.aliyun.com**
- 将系统时间写入硬件
**hwclock --systohc**
- 查看时间
date
- 安装 ntpdate
- 安装Jenkins
- 安装JDK
yum install java-1.8.0-openjdk *-y
- 安装目录: /usr/lib/jvm
- 获取Jenkins安装包
- 下载页面:https://www.jenkins.io/download/
- 安装:
rpm -ivh jenkins-2.190.3-1.1.noarch.rpm
- 修改配置文件(这里声明的时Linux 用户 root使用的jenkins)
vi /etc/sysconfig/jenkins
- 安装JDK
修改内容如下:
JENKINS_USER="root"
JENKINS_PORT="8888"
systemctl start jenkins
systemctl enable jenkins
d. 打开浏览器访问: http://安装Jenkins的IP:8888
获取并输入admin管理员账户密码( jenkins自动生成密码)
cat /var/lib/jenkins/secrets/initialAdminPassword
- 安装插件
- 创建管理员用户
- Jenkins用户权限配置
Jenkins下不同用户可以看到不同的工程拥有不同的权限
Jenkins的用户权限配置需要
docker对测试来说有什么用
docker类似于Windows系统的虚拟机,对于测试来说docker意味着一种新的测试环境部署方式,由于其镜像分层的设置,我们可以在一台物理机上同过docker的方式部署多套测试环境
Dcoker常见的命令
启动
centos : systemctl start docker
ununtu: service docker start
获取镜像
上网下载: docker pull 镜像名称
(必须依赖网络,亦可以创建公司私有仓库)
使用离线文件导入:docker load <镜像文件 tar包
生成容器
docker run -d 镜像名
docker run -it 镜像名 /bin/bash
** 退出容器**
ctrl + p
ctrl + q
docker 下如何部署测试环境
使用docker发布网站的思路
1. 拿到开发成果物(网站内容)
2. 镜像lamp(别人的镜像)
3. 拿到镜像的端口和容器发布路径
4. 成果物放到我们想要放的位置(数据卷)
5. 启动容器run -d -p linux的端口:容器端口 -v 开发成果物路径:容器发布路径
自己封装镜像
- 编写dockerfile文件
思路:
1、开发成果物,几个网页
2、下载或者导入apache镜像
3、建立临时容器
确认容器端口 -p
确认容器发布路径 -v
--- docker run -d -p -v
4、自定义镜像
在一个文件中Dockerfile,指定容器新的操作
比如 把网页 给 容器发布路径,让镜像记住这些,通过命令产生新的镜像,新的镜像一旦启动生成容器,网页就自动发布成功
5、dockerfile命令
FROM 指定是哪个镜像,我们要在哪个镜像进行包装
COPY 把指定的文件(网页信息)复制到容器中的发布路径
RUN 执行linux命令
echo 把内容写入相应的文件中,如果文件不存在,则自动生成文件
6、验证:打开浏览器,自带的网页,可以访问
作业提示:思路
1、下载或者导入镜像php-nginx
2、生成临时容器,看端口号以及容器发布路径
3、开发成果物,helloworld.php
4、启动容器 -p -v
5、验证,在宿主机上访问php网页
查看配置文件获取端口号和容器发布路径
cat /opt/docker/etc/nginx/vhost.conf
验证的注意点
http://127.0.0.1:8082/hello.php 对于nginx服务,访问的时候要写全访问路径(网页也哟要写上
Jenkins
jenkins + maven 构建
在Jenkins集成服务器上, 安装maven来编译和打包项目
- 上传Maven软件到Linux上(linux上安装maven)
apache-maven-3.3.9-bin.zip ## 解压
mkdir -p /opt/maven ## 创建目录
mv apache-maven-3.3.9/* /opt/maven ##移动文件
- 在Linux下配置环境变量
vi /etc/profile
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export MAVEN_HOME=/opt/maven
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
source /etc/profile ## 配置生效
mvn -v ## 查找Maven版本
- jenkins 关联JDK和Maven
- 配置Jenkins全局变量
Manage Jenkins->Confifigure System->Global Properties(全局属性) ,添加三个全局变量
- 修改Linux上maven配置
5.1 创建本地仓库mkdir /root/repo
5.2 修改配置文件vi /opt/maven/conf/settings.xml
5.2.1
5.2.2 声明maven下载jar包地址<mirrors>
下增加mirror标签
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
6. 验证
自己把项目重新打包下
jenkins下master和slave
Jenkins 进行的大量工作(拉取代码 构建代码 发布运行),但是发现自己(master 主人)一个忙不过来,分发给一堆别的机器(slave --奴隶)干
master机器
1.启动GitLab
sudo gitlab-ctl restart
验证http://192.168.58.178:82
用户名 root 12345678
2. 启动jenkins
验证 http://192.168.178:8888/
sqxy 123456
slave机器
选择另一台Linux机器
slave机器也要配置了jdk和maven 并且路径要和在master里面配置的路径一致(因为master机器将来slave奴隶干活,slave工具 需要jdk和maven!)
## 在slave机器上配置jdk和maven
yum install java-1.8.0-openjdk* -y ## 安装JDK
## 安装maven
yum install -y lrzsz
## 上传Maven软件到Linux上(Linux上安装maven)
## unzip apache-maven-3.3.9-bin.zip
mkdir -p /opt/maven ## 创建目录
mv apache-maven-3.3.9/* /opt/maven ## 移动文件
## linux下配置环境变量 (让系统可以知道maven安装位置)
vi /etc/profile
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export MAVEN_HOME=/opt/maven
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
source/etc/profile ## 配置生效
mvn -v ##查找版本
## 修改linux上maven配置(阿里云 下载maven路径)
mkdir /root/repo ## 创建本地仓库目录
vi /opt/maven/conf/settings.xml
本地仓库改为 :/root/repo/
声明maven下载jar包地址
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
在master机器联通slave机器
Github Action
GitHub把 克隆代码、编译代码,运行,单元测试,构建,和发布镜像这些称为Action。
awesome-actions: https://github.com/sdras/awesome-actions
Github Action 术语
- workflow:一个.yml文件对应一个workflow,也就是一次持续集成,一个Github仓库可以对应多个workflow
- job : 一个workflow由一个或多个job构成,每个job代表一个持续集成任务
- step:每个 job 由多个 step 构成,一步步完成。
- action:每个 step 可以依次执行一个或多个命令(action)
- on : 一个 workflow 的触发条件,决定了当前的 workflow 在什么时候被执行。
workflow
参考资料
- 石雪峰 DevOps实战笔记
思考
- DevOps应该是测试同学推动的
测试同学如果要更高的工资需要向测试开发发展,测试开发要让开发“信服”需要编写自动化测试工具甚至是测试平台来参与到软件开发中去。
什么是Github Actions
Github Actions是Github为托管在github.com站点的项目提供的持续集成服务,于2018年推出。
Dockerfile
一个简单的配置文件,描述如何构建一个新的image镜像(必须是Dockerfile这个文件名),必须放在项目的根目录。
Dockerfile 语法
FROM node:14
WORKDIR
COPY
## 构建镜像时,一般用于一些系统配置,安装必备的软件,可有多个RUN.
RUN
RUN
RUN
## 启动容器时,只能有一个CMD
CMD XXXX
## 环境变量
ENV k1=v1
ENV k2 =v2
构建
docker build -t <name> . ## 最后的 `.` 指Dockerfile在当前目录下
docker images
自动发布到测试机
github actions 监听git 提交, 并执行自定义命令
docker 一键部署开发环境
两者结合,即可·=自动发布到测试机
主要产出
- dev 分支push时,自动部署到测试机
主要内容 - 配置测试机
- 自动发布到测试机
- 远程接口测试
去买一个便宜的服务器,操作系统选择centos 7.X
配置测试机
阿里云较贵,可以考虑 腾讯云,华为云等
学习用,只要是一个服务器而已,不用太考虑稳定性和其他扩展能力
创建work账号
处于安全考虑,日常使用不会用root账号登录,权限太高了
用root登录,创建work账号
adduser work
passwd work
添加work 的sudo 权限
whereis sudoer ## 找到文件位置 /etc/studers
sudo u+w /etc/sudoers ## 修改权限, U表示所有者, w 表示写权限, + 表示加
vim /etc/sudoers ## 编辑文件
## 找到 `root ALL=(ALL) ALL`
再加一行 `work ALL=(ALL) ALL`
chmod u-w /etc/sudoers
然后使用worker 登录机器
ssk登录
登录信任
git
sudo yum -y install git
git --version
docker
安装docker:
docker 镜像加速
安装docker-compose
docker version
docker-compose --version
开放端口
开放需要的端口,否则外网无法访问该端口
B端 FE:80
B端 server:8081
C端:8082
统计服务,收集日志: 8083
admin FE: 8085
admin server: 8084
线上环境不会开放这么多的端口,而是使用nginx 反向代理
jenkins 持续交付
- 持续交付系列概览
- 实战项目简介
- 环境准备
- 项目配置、调试、运行
持续角度系列课程概览
- Jenkins 功能
- 基础功能
- 自动化测试持续集成
- APP源码打包、发布、自动测试全流程
- 持续交付系列系列课程目标:应用自动化部署
- 测试工程师的常见需求
- 自动化部署技术最好自己掌握,即便研发、运维已经会了
- 语言多,架构多,部署打包工具都不一样,我们怎么应对
- 持续交付系课程学习过程
- 应用部署的过程
- 运行环境的搭建
- 代码细节可以循序渐进的学
- 持续交付系列实战课程安排
- 基础内容学习,部署环境准备,运行演练
- Spring-boot 架构项目Server容器中运行持续交付演练
- Spring-boot 架构项目Docker运行持续交付演练
实战项目简介
- 实战项目 -JeeSite
- 基于spring Boot 2.0
- 数据存储 mysql
- 技术选型 :主流
- 语言: Java
- 规模适中,不大不小
- 适合初学者的教学项目
实战项目构成
➢实战项目- JeeSite
-源码位置: https://github.com/princeqizh/JeeSite4
-原始工程的位置: https://Gitee.com/thinkgem/jeesite4
-社区版项目,我们拿来学习
➢Demo
-源码库演示
-运行应用演示
实战项目构成
- 实战项目小结
- 多模块组合项目
- 基础公共引擎模块:Common
- 核心模块: core
- 模块实例模板:template
- 模块父节点:parent
- 入口模块:root
- Web模块:web
- Deploy:部署代码
环境准备
-
准备了环境,才能运行程序
- 初学者常见痛点
- 环境配置关键点:配置过程,验证方法,错误日志
-
Spring Boot项目运行配置,验证方法,错误日志
- Spring Boot 项目运行配置 MySQL + Java + maven
-
MySQL 的部署
- 首推 Docker部署,实在太方便了无法拒绝
- 下载docker 镜像:Docker pull mysql
- 启动MySQL docker container 实例
- docker run -d --name
-e MYSQL. ROOT_ PASSWORD= -P 3306:3306 mysq/:
- docker run -d --name
项目配置、调试、运行
(作为测试来说,自己有信心,项目能够成功部署)
本章小结
-
jeesite 后台数据准备
-
maven 项目编译,打包的方法
-
通过maven运行spring-boot模块的方法
-
Jenkins 部署运行技巧
-
Jenkins 直接建个maven项目
-
工作中运行项目的命令,是写在Git的项目中,再调用
-
mvn ,package install deploy
Tomcat 部署持续交付实战
Docker部署持续交付实战
生产与持续分离
Tomcat基础知识
- 了解Tomcat
cataling.out
拉取源码---> maven打包----> 停止Tomcat-----> 清理环境-----> 部署war 包-------> 启动Tomcat
什么是自动化测试
- 自动化测试就是,假定一些预设值,由机器自动完成
- Web自动化测试,将自动化测试技术应用到Web测试中,是假定一些预设值,由程序驱动Web浏览器来来完成Web程序的测试
自动化测试的技术选型
- 发展趋势要稳定上升
- 要有一个活跃的社区能够讨论
- 要是开源软件
- 支持主流编程语言
- 要支持主流浏览器
web自动化测试Selenium
- 简单介绍
- Selenium是一个Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中就像真正的用户在操作一样。
- 主要功能
- 测试与浏览器的兼容性---测试你的应用程序看是否能够很好的工作在不同浏览器和操作系统之上
- 测试系统功能---创建回归测试对象检验软件功能和用户需求
Selenium 三剑客
- Selenium WebDriver
- Selenium WebDriver是客户端API接口,测试人员通过调用这些接口,来访问浏览器驱动,浏览器驱动再访问浏览器。
- 与浏览器的通信也可以是通过Selenium Server 或RemoteWebDriver的远程通信。RemoteWebDriver与驱动程序和浏览器在同一系统中运行。
- 还可以使用Selenium Server 或Selenium Grid 进行分布式测试。
- Selenium IDE
- Selenium IDE 是一个浏览器插件,支持Chrome浏览器和Firefox 浏览器,可以将手动测试过程记录下来,并生产自动化测试脚本,可以实现回放。
- Selenium Gird
- 分布式部署Selenium
搭建测试环境
- pip install Selenium
- https://www.selenium.dev/documentation/zh-cn/webdriver/driver_requirements/
- 配置环境变量
- 测试jdk
简单的实例
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
sleep(2)
driver.quit()
Selenium 核心
Selenium元素定位
Selenium 操作表单
- Selenium操作表单的顺序
- 定位表单元素
- 输入测试值
- 判断表单元素属性
- 获得表单元素属性
- 提交表单进行验证
- check
- 如果checkbox有id属性可以直接通过id定位,如果没有可以通过input标签名称定位,然后通过type属性过滤
- 选择或反选checkbox, 使用click()方法
- radiobutton
- raadiobutton有相同的名称,多个值,可以先通过名称获得,然后通过值判断
- 选择或者反选checkbox,使用click()方法
- check
- Selenium 操作下拉列表
- select
- select 处理弹窗
- alert: 用来提示
- confirm: 用来确认
- prompt:输入内容
Selenium三种等待模式
- time.sleep: 固定等待(不建议使用)
- implicitly_wait(隐式等待)
- WebDriverWait(显式等待)
- WebDriverWait是Selenium提供显式等待模块引入路径
from selenium.webdriver.support.wait import WebDriverWait
- Selenium的等待条件
- Selenium鼠标和键盘事件
- Selenium的鼠标和键盘事件被封装在ActionChains类中,使用的方法是:ActionChains(driver).clilck(btn).perform()
- Seleniuum执行JavaScript脚本
- exectue_script 同步执行
- exectue_async_script 异步执行
Selenium屏幕截图
- save_screenshot(filename) # 获取当前屏幕截图保存为指定文件,filename指定保存路径或图片的文件名
- get_screenshot_as_base(64) # 获取当前屏幕截图base64 编码
- get_screenshot_as_file(filename) # 获取当前屏幕截图,使用完整路径
- get_screenshot_as_png() # 获取当前屏幕的二进制文件数据
- selenium定位frame iframe
Selenium多浏览器
- 传递不同的参数来实现多浏览
class Base(): def setup(self): browser = os.getenv("browser") if browser == "firefox": self.driver = webdriver.Firefox()
Selenium 执行JavaScript脚本
- 浏览器常见的JavaScript操作现象
- Selenium能够执行js,这使得Selenium、拥有更为强大的能力。既然能执行JavaScript,那么js能够做的事,Selenium应该大部分也能做
- 直接使用js操作页面,能够解决很多click()不生效的问题
- 页面滚动到底部,顶部
- 处理富文本,时间控件的输入
- Selenium如何调用js
- excute_script :执行js
- return :可以返回js 的返回结果
- excute_script : arguments 传参
selenium对文件上传, 弹框的处理,的处理
- send_keys
UI测试框架
github:https://github.com/uupt007/UI_test_base
为什么会出现这个半自动化UI测试框架
我进入公司的前一个月从事的手工测试,为了提高自己的测试效率在工作时间之外写了一个半自动化的UI测试(害怕手工测试做久了,忘记自己还学过软件开发),
为什么我把它叫做半自动化
- 框架本身的业务代码是写死的
- 一些测试配置的变化需要手工修改配置文件
- 缺少很多功能
需求分析
- 多用例测试
- 测试数据(用户名,密码,视频号)
- 用例业务结果记录
- 页面元素定位信息和py文件分离,页面元素定位信息(配置文件ini)和py文件分离(PO思想 page object)
- 测试配置: 把测试驱动和测试服务器统一管理起来
框架设计
C:.
├─.idea
├─business // 测试业务包含的定位信息
├─config // ini 文件定义了被测项目的地址+被测浏览器 +被测元素的定位信息
├─data // 测试数据
├─driver //存放 浏览器驱动
├─reports // 测试报告
└─testcase // 多用例测试
功能验证
假设要测试的功能是
- 在B站搜索UUPT,点击最新的视频, 在视频下方留言,你好UU
2.在B站给该用户发送"你好UU" 的私信
3.预期结果:
测试框架未来的改造思路
- 增加一些异常处理,不能每次执行UI自动化测试都需要开发关闭一些东西
- 单元测试框架使用pytest,unitest难以应付比较复杂的测试环境
- 测试报告采用录屏+ 拆帧的形式帮助开发快速定位问题
用JavaScript代码高亮显示被操作的元素,高亮的实现方式是利用JavaScript在对象框的边框上渲染一个5-8个像素的边缘。
2. 调用screenshot函数完成点击前的截图, 调用selenium原生的click函数完成真正的点击操作
如何多设备执行UI自动化的测试
在自动化测试中UI自动化测试可以模拟人进行界面操作但是UI自动化测试特别慢,目前UI自动化测试常用的策略是 :多设备并行
UIAuto
APP功能测试
APP的测试分为几个维度
- 功能测试
- 性能测试
- 兼容性测试
- 网络测试
- 其他测试
Web端功能测试
测试模块:网站留言板
- 功能点本身的测试
不考虑业务,单纯从控件的角度进行测试
1. 匿名留言
1. 选择打钩是否能提交
1. 不打钩是否能提交
2. 电子邮件地址
1. 输入长度(5~100位)
有效等价类:5~100之间长度的字符串
无效等价类:长度小于5的字符串;长度大于100的字符串
1. [输入类型(必须包含@和.,格式是<1>@<2>.<3>,<1>、<2>、<3>只能包含数字和字母)](mailto:输入类型(必须包含@和.,格式是%3c1%3e@%3c2%3e.%3c3%3e,%3c1%3e、%3c2%3e、%3c3%3e只能包含数字和字母))
有效等价类:
包含@和.,其它内容只包含数字和字母的字符串
无效等价类:
<1>为空
<2>为空
<3>为空
<1>不为数字或字母(多个等价类:中文、特殊字符、空格等)
<2>不为数字或字母(多个等价类:中文、特殊字符、空格等)
<3>不为数字或字母(多个等价类:中文、特殊字符、空格等)
C. 为必填项
有效等价类:
输入内容
无效等价类:
不输内容
(1)留言类型(5个选项,必选一个)
(2)主题(不超过100字符)
(3)验证码(4个字符,且必须和图片一致,点击图片刷新)
(4)留言内容(不超过1000字符)
- 场景测试
- 本身场景
- 匿名留言/不匿名留言,提交后数据库里保存的留言人姓名
- 留言主题、内容中如果包含敏感字会怎么处理
- 提交多条主题完全相同的留言
- 关联场景
- 和本系统内其它模块的交互、或者和其它系统的交互
- 登录或不登录情况下提交留言
- 匿名留言/非匿名留言,后台审核时看到的提交人姓名(后台系统)
- 匿名留言/非匿名留言,后台审核通过后,在前台看到的提交人姓名
- 不同的留言类型,后台是否会有不同的标记(后台系统)
- 本身场景
- 特殊测试
- 快速点击‘我要留言’多次,看是否生成多条重复数据,提交完留言用F5刷新页面,是否重复提交
APP端的功能测试
测试模块: 某聊天APP的聊天功能
- 功能点本身的测试
不考虑业务,单纯从控件的角度进行测试
- 发文字
- 发语音
- 发文件
- 发图片
发现成照片
当场拍照 - 发定位
- 发红包
- 发表情
发一个表情
发多个表情 - 发转账
- 发链接
- 发通话请求
语音通话请求
视频通话请求 - 发卡卷
- 发名片
- 发二维码
- 发收藏
场景测试- 本身场景
- 发混合内容,比如发文字和发表情混合、发文字和发网址混合。。
- 发完撤回,再次发送
- 发待带有敏感字的信息
- 发送给不同的对象,比如发给个人、在群里发送、在公众号里发
- 发消息是不是有声音
- 关联场景(和本app内其它模块的交互、或者和其它app的交互)
- 发出去的信息能否被撤回、复制、转发、收藏、引用、提醒、选中、翻译等
- 语音转文字
- 给被自己拉黑的人发消息
- 给把自己拉黑的人发消息
- 给被腾讯拉黑的人发消息
- 把消息转发给企业微信(其它app)
- 和设备的交互
- 用耳麦发送语音
- 手机设置不同的音量发送语音
- 用前置/后置摄像头进行视频聊天
- 发送信息时来电话了(比如选中了图片还没发送时来电了)
- 发送信息时提示操作系统升级
- 发送信息时断网
- 电量不足时发送消息
- 发送信息时闹钟响了
- 本地空间不够了,能否收发消息
- 特殊测试
- 横竖屏下功能测试
- 快速点击多次发送
- 常见的手机操作
- 双卡双待手机
- Back等常用按键功能
- 本身场景
adb
什么是adb
- 全称:Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具
- adb 的运行原理是 PC 端的 adb server 与手机端的守护进程 adbd 建立连接,然后 PC 端的 adb client 通过 adb server 转发命令,adbd 接收命令后解析运行
- 安卓开发者网站 下载对应的adb安装包
- 解压后,配置环境变量,即有adb.exe的那层目录文件路径配置在环境变量中path中
- cmd输入adb,如果有adb版本信息,证明电脑已经安装adb工具成功
adb 用来干嘛
- 用于app的测试
- 安装,卸载
- 查看日志
- 手机与电脑之间传东西
- 用于整机测试
开启adb
- adb :Android Debug Bridge
- adb devices: 查看设备
- adb kill-server: 关闭adb 的后台进程
- adb tcpip:让Android脱离USB线的TCP连接方式
- adb connect:连接开启TCP连接方式的手机
- adb logcat:Android 日志查看
- adb bugreport: 收集日志数据,用于后续的分析
获取APP的信息
- app信息
- 获取当前界面元素:adb shell dumpsys activity top
- 获取任务列表:adb shell dumpsys activity activities
- App入口
- adb locat |grep -i displayed
- aapt dump badging mobike.apk |grep launchable-activity
- apkanalyzer最新版SDK 中才有
- 启动应用
- adb shell am start -W -n com.xueqiu.android/.view.WelocmeActivityAlias -S
adb shell
- adb shell 本身就是一个Linux的shell, 可以调用Android内置命令
- adb shell
- adb shell dumpsys
- adb shell pm
- adb shell am
- adb shell ps
- adb shell monkey
常用的测试命令
pm ,am , dumpsys, uiautomator
Android 性能统计dumpsys
- 获取所有的dumpsys子命令 dumpsys |grep -i DUMP
- android获取当前activity adb shell dumpsys activity top
- 获取activitys的记录,可以获取到appium 依赖的原始activity dumpsys
- 获取特定包基本信息adb shell dumpsys package com.xueqiu.android
- 获取系统通知 adb shell dumpsys memimfo com.android.settings
- 获取cpu信息 adb shell dumpsys cpuinfo
- 获取gpu 绘制分析 adb shell dumpsys gfxinfo com.android.settings
- 获取短信 adb shell dumpsys activity broadcasts | grep senderName=