软测笔记


软测笔记

软测概念

什么是软件测试? (找程序中的 bug? 找文档中的 bug?)

找软件中的 bug。(什么是 bug?bug 的严重级别? )

什么是软件?
软件是由程序,数据,文档三个部分组成的。

“程序: 用计算机语言 (java C,C#,C++net,python) 描述解决问题的方法和步骤。
数据:程序加工处理的原材料。
文档:生成软件的过程中所形成的图文资料,例如:需求规格说明书,用户使用于册,帮助文档。

实际测试过程中可能会遇到的文档?

  • 需求规格说明书
  • 概要设计说明书
  • 详细设计说明书
  • 安装手册
  • 用户使用手册
  • 帮助手册

文档测试的规范
文档测试只能对文档进行红色,绿色,蓝色标注

红色:文档里面不明白,不理解,有疑问或认为是错误的

绿色:测试人员发现的问题,组织好语言。

蓝色:和项目经理或需求调研人员确认的需求,需求评审会

冒烟测试:系统测试之前

[面试题]如何进行文档测试?

检查文档的完整性,一致性,易理解性,易浏览性,正确性

用户需求:需求调研人员从用户现场调研回来的第一版需求。

测试需求: 需求规格说明书中明确阐述出来的需求和需求存在不明白,不理解或认为是错误的和项目经理或需求调研人员确认的需求称为测试需求

总结:1.测试需求肯定大于需求规格说明书的。

2.完成需求文档的测试,实际上是完成了需求规格说明书向测试需求的转化

3.文档测试是程序测试的基础。

[面试题] 什么是测试思路?

了解清楚测试需求之后,从哪些角度进行测试。测试思路分析的时候先考虑正常的,然后在考虑异常的。

无效的规则,测试时一定要一个一个覆盖,因为发现 bug 好定位(发现bug,定位bug)

测试思路里面可能存在重复的情况,思路分析完成后一定要过滤。

[面试题] 什么是测试用例? 你是如何理解设计测试用例的?

根据测试需求分析出很多种情况 (测试思路),然后让软件按照我们设计的情况来运行,如果运行的结果与我们设计的结果一致的情况下即为通过,不一致的情况下即为 bug。

总给1、测试用例的输入一定要看软件的界面,怎么操作的就怎么写。

2、测试思路里面有几种情况,就要设计几条用例来进行覆盖。

3、保持用例步与步之间的独立性,因为测试用例每一步执行不通过都是 bug,如果步与步之间关联了,则发现 bug 不好跟踪。–[面试题]为什么要保持用例步与步之间的独立性?
4、测试用例中使用数据的地方必须要用数据。

5、测试用例的每一个输入必须有明确的结果

第一步:先进行分类

第二步:分析一下满足类的规则和不满足类的规则

第三步:根据分析出来的规则得出测试思路

第四步: 根据测试思路开发测试用例

bug 书写规范
第一、如何编写 bug 的标题标题: 位置,问题的概要描述 (40 字以内)【标题里面不要能出现 XXXX 错误,XXXXX 问题】

登录系统,正常登录系统时系统崩溃

开始-段落,选中一行文字左对齐时,系统没有响应

第二、如何编写 bug 的复现步骤-测试用例可以参照怎么操作的就怎么写

例如: 进入登录系统界面,用户名输入张三,密码输入 123456,点击确定

第三、实际结果(bug) +系统崩溃
预期结果 (正确的结果)

第四、登录成功,进入系统首页面+

第五、备注

Bug 前提,约束,复现概率等等

等价类

总结:
该案例背后所涉及到的测试方法 [面试题] 测试用例的设计方法有哪些?

一、等价类测试用例的设计方法”
(1) 等价类”
它是输入域的子集合,把输入域里面性质相同或相近的归为一类,每一类抽一个代表进行测试,如果这一代表测试过程中发现问题,则该类均有问题,如果这一代表测试过程中没有发现问题,证明这一类均没有问题。

“备注:“
输入域: 所有的子集合加起来就是输入域。

等价类:对输入域进行划分,把输入域划分为更小的类。

等价类作用: 有效的降低了测试的输入量,大大的减轻了测试的工作量。[面试题]等价类方法的作用?“

如果发现抽出的代表不能代表这一类的情况下,说明等价类划分的太大了,需要进一步进行划分。

(2) 等价类划分
第一、有效等价类:对程序规格说明书来说是合理的有意义的数据构成的集合。(满足类的
规则。)
第二、无效等价类: 对程序规格说明书来说是不合理的,无意义的数据构成的集合。(不满足类的规则。)

(3) 等价类原则

第一、如果输入条件规定了取值范围的情况下,一般可以确立一个有效等价类和两个无效等价类。例如: 体重输入框10-100

第二、如果输入条件是一个集合的情况下,可以确立一个有效等价类,一个无效等价类。例如:A输入只能输入整数。整数是一个集合。

第三、如果输入条件是一个 boolean 量的情况下可以确立一个有效等价类和一个无效等价类。例如: 1,0
第四、如果输入条件是一组值,假定有 N 个,程序要对这一组值分别处理的情况下,可以确立 N个有等价类和一个无效等价类。例如: 1,@,A,中

边界值

第一、ASCII 码
第二、为什么取边界附近的数据进行测试+
(1) 程序员写代码的时候按照边界来写。“
(2)因为大量的测试经验统计得出,程序最容易出错误的地方不在边界以内,而是在边界附近最容易出错误

测试思路:
支持数字验证(10 种) 0189(1种)
不支持英文字母的验证 (52 种(26个字母*2)) ABYZabyz (2种)
不支持汉字 (2种) 简体繁体
不支持特殊字符验证 (33 种) 1、空格/ 2、: @ 3、[` 4、{ ~ (4 种)

最大长度的验证 (2种) 19 个字符,20 个字符,21 个字符 (3种)
必填项验证 (1 种)

下拉列表格式的测试
测试需求:
点击下拉按钮正常打开下拉列表
点击下拉按钮正常打开下拉列表,选择内容,内容显示在下拉表里面,下拉列表自
动关闭
点击下拉按钮正常打开下拉列表再次点击下拉按钮,下拉列表自动关闭。“点击下拉按钮正常打开下拉列表.点击界面其他位置,下拉列表自动关闭。“
点击下拉按钮正常打开下拉列表显示水平滚动条和竖直滚动条,且正常使用。“
点击下拉按钮正常打开下拉列表,显示内容与顺序和需求文档一致。“
点击下拉按钮正常打开下拉列表,选择内容显示在列表内,再次选择内容成功替换
以前输入的内容。“
测试思路:
正常打开下拉列表验证 (1种)

自动关闭验证 (3 种)
滚动条显示验证 (2 种)
数据显示验证 (2 种)

下拉列表逻辑功能验证

测试需求:下拉列表只有5项或 5项以内的情况下

测试思路:全测试
测试需求:下拉列表有很多项的情况下

测试思路:
1、测试第一项和最后一项。(2 种)
2、如果每一项功能都不一样的情况下,测试时全部进行测试。(自动化测试工具)

因果图

监听器系统的测试思路,用例开发

第一步: 阅读需求的过程中识别出哪些是原因,哪些是结果,分析正常的原因和结果

第二步: 两种方案,画因果图,推导出测试思路根据原因推导出结果,先假设原因成立,推导出结果,然后在假设原因不成立,推导出很多种情况。“根据结果推导出原因,先假设结果成立,推导出原因,然后在假设原因不成立,推导出很多种情况

备注: 多个原因产生多个结果的情况下,必须使用中间节点进行转化。

场景法

此类系统的测试称为业务测试,现场需求一般是流程图

测试思路:
第一步: 阅读需求的过程中,不考虑不通过的情况,只考虑通过的情况,找出系统的基本业务流程。
一般用户提交一份申请一》科室秘书审核一》科室主任审核—》中心秘书审核—》院长审核—》调职调绩成功 (1 种)
第二步: 对基本业务流程上面的每一个环节进行分析,可能存在的异常情况,有多少考虑多少,然后过滤重复的测试思路。

总结:
第一、
先找出基本业务流程。(一个系统就一条基本业务流程吗? 不一定,根据系统的大小
来确定。)“
第二、基本业务流程:系统的核心流程,每个环节都通过的情况。备选业务流程:基本业务流程中每一个环节不通过的情况
第三、该方法的名称: 场景法,业务流程分析法,业务测试,流程测试。
第四、如果备选业务流程相同的情况下,只要取一支进行测试方可。
第五、高级测试人员一般把测试的重心放在系统的业务上进行测试。

H5测试

原生 (native) 和 H5 对比优点和缺点

native使用原生系统内核的,相当于直接在系统上操作

Native 优点:
运行速度快。“
可以应用底层的 api
比较节约流量
缺点:
不同的操作系统需要独立开发

更新需要重新打包,重新安装

做适配,需要非常多的机型

H5 特点:
优点:
只需要开发一次

更新不需要打包,直接更新服务器上的就可以了

开发成本低
缺点:
打开页面时候,得需要再次加载
网络
只调帮有限的底层 API

混合应用: 一部分用原生,一部分用 H5

1、部分功能给用户体验好的,不经常变动的就用原生

2、某些功能经常变动,就用 H5

如何判断一个 APP 中是否用 H5 页面
一、找开发或项目经理确认一下哪些地方用原生哪些地方用 H5。

二、 如果没有文档的情况下:
1、看断网的情况: 正常显示的即为原生,显示 404 域页面错误即为 html

2、看加载方式: 打开一个新的页面有加加载进度条,即为 H5 页面。

3、打开一个页面,能复制即为 H5,不能复制的一般即为原生。

4、看一下页面布局: 一般密密麻麻的即原生,一整块一整块的即为 H5

H5测试
(1) 功能测试,逻辑测试 (业务测试) 和传统系统一样
(2) 测试时需要注意:
登录
客户端已登录的情况,H5 以登录状态运行。

客户端没有登录的情况下,运行 H5 需要拉起原生登录

页面
关注一下页面加载时间

弱网络的环境下,加载 H5 时是否有“加载中的提示“

超时,页面提示信息是否友好

返回 button

横竖屏

兼容性 (适配)

系统是否支持 H5

H5 在 web 页上面是否能正常显示
刷新
1、主动刷新

翻页

翻页后是否正常显示,检查内容
手机操作
1、锁屏在解屏,检查 H5 是否正常显示
2、前后台切换,检查 H5 是否正常
弱网测试
弱网络的情况下,数据加载慢,检看一下是否有 loading 提示信息

H5 案例
备注: 一般情况下原生还没有开发出来,H5 已经写完了,这样的情况下,可以首先进行 H5测试。
第一方案: 使用 chrome 在 web 页上进行测试。(手机模式,手机型号)

第二方案: 把链接生成二维码,用手机扫一下进行测试

安装与卸载测试

安装测试–主要针对 C/S 模式的软件

第一、安装前的测试
安装包用杀毒软件杀毒“
双击 setup.exe
第三方软件进行安装

命令行进行安装

第二、安装过程的测试

安装界面的测试(对照安装 手册进行测试)

逻辑功能的测试(按照场景法进行测试) 基本业务流,备选业务流程

安装过程文档的测试(找项目经理或产品经理要文档)

安装过程输入框测试 (依照需求进行测试)

第三、安装后的测试

检查程序安装的位置: 桌面,安装目录,开始菜单,控制面板,注册表(HKEY_LOCAL_MACHINE/SOFTWARE/最下一项),服务

兼容性测试

案例
浏览器打开软件遇到的问题

下载一个软件,安装不上或是安装过程中报错

安装完成之后打不开

上网笔记本电脑,很小

拉手网:系统升级之后不有考虑与老数据之前的兼容性

什么兼容性测试
检测试被测试的软件在特定的硬件平台,不同的应用软件之间,不同的操作系统平台,不同的网络环境中是否能很好的运行。

第一、 与操作系统平台的兼容性测试
1、操作系统的种类选择:(1)常用操作系统(在线查询一下操作系统的排名)。(2) 根据用户来定
2、操作系统版本的选择: (1) 常用操作版本。(2) 根据用户来定。

3、测试思路:(1)安装和卸载测试。(2) 主要功能的测试 (主要功能的用例拿过来执行一下就可以了

4、 适合软件: C/S 模式的软件

备注
1、能否在虚拟机上进行测试?禁止在虚拟机上进行测试2、安装系统,U 盘安装系统

第二、与浏览器之间的兼容性测试
1、浏览器的种类选择: (1) 常用浏览器。(2) 根据用户来定。
2、浏览器版本的选择:(1) 常用浏览器版本。(2) 根据用户来定。(3) 选择最低版本和最高版本进行测试。(稳定版本)
3、测试思路:(1)软件大小界面显示规范测试。(执行界面用例)。(2) 主要功能的使用测试
4、适合软件: B/S
备注:
推荐一款工具: IEtest 工具

第三、与 office 办公软件之间的兼容性测试

1、office 办公软件种类的选择: 1) 根据用户来定。2) 常办公软件: 微软 office,金山 wps

2、office 办公软件版本的选择: 1) 常用版本。2) 根据用户来定。3) 选择一个最低版本和最高版本。(稳定版本)

3、测试思路:
1)导出: 正常调用(3 种),正常保存,正常打开,数据显示与软件中的保持一致

  1. 导入: 正常附加,导入数据与文档里面的数据显示一致,正常使用
    4、适合: C/S,B/S

第四、 与杀毒软件之间的兼容性测试

1、杀毒软件的种类选择: 1) 根据用户来定。2) 常用杀毒软件

2、杀毒软件的版本: 保证病毒库是最新的就可以了。

3、测试思路: (1) 安装卸载测试。(2) 主要功能的测试。

4、适合软件: C/S 模式的软件

第五、与同类软件的之间的兼容性测试

MSN qq 微软 windows

1、同类软件种类的选择: 排前三

2、同类软件版本的选择: 选择稳定的版本

3、测思路: 安装卸载测试

第六、与网络之间的兼容性测试
1、网络环境: 局域网,广域网
2、测试思路: 识别出系统哪些功能涉及到网络。1) 有局域网的环境测试。2) 在广域网环境测试。
3、适合软件: C/S,B/S

第七、 与显示器分辨率之间的兼容性测试
显示器的尺寸: 根据用来定
测试思路: 1) 常用显示器分辨率。2) 软件大小界面显示规范。3) 主要功能的使用适合软件: C/S,B/S

第八、 与数据库之间的兼容性测试

数据库种类: SQL server ,mysql,oradle

测试思路:
同一个数据库不同的表之间的数据兼容性

不同数据库之间: 接收,存储,正常使用

同一个数据库新老数据兼容性

总结:

兼容性测试的意义

提高软件的质量

保证软件在不同的环境中正常运行

软件销路更好

冒烟测试

(1) 冒烟测试的来源: 来致硬件行业

(2) 冒烟测试
针对软件中修改了一些典型问题及时验证是否真正的解决称为冒烟测备注:
冒烟测试的最大应用是验证软件版本是否稳定,版本稳定性测试

冒烟测试的特点
优点:

周期短

人员分配灵活

缺点:

覆盖率很低
随意性强

(4) 冒烟测试与回归测试
第一、冒烟工作量少
第二、冒烟覆盖率小
第三、测试环境: 冒烟测试可以在开发环境中进行
第四、测试方法

易用性测试

易用性
站在用户角度考虑软件是否好用

易用性测试

第一、基础功能的易用性《参照用例》

第二、易用性测试注意事项:

1、站在用户的角度去考虑问题,最好去用户现场体验一下

2、分析同行软件的优点,能复用的直接复用。

3、参照现行的标准和规范。(微软,apple.IBM)

测试用例设计主要采用那些方式

用例的设计流程

  • 需求分析
  • 确定测试范围
  • 选择测试方法(用例的设计方法)
    等价类划分,边界值分析,因果图法,正交实验法,场景法,错误推法…
  • 设计测试用例
  • 评审和修改
  • 执行测试用例
  • 缺陷跟踪和报告

怎么证明测试用例的覆盖率

  • 全面的需求分析(明显需求,隐形需求,用户主观感受,市场主流观点,不同需求进行划分,每一点进行测试分析 ,确定测试范围,生成完善的需求文档)

  • 采用多种测试方法(输入输出,异常情况,边界条件)

  • 单功能的测试用例与测试场景设计

    • 保证单功能的细节,也考虑整体业务流程的连贯性
  • 用例评审与跟踪缺陷

  • 使用用例覆盖率工具,allure,禅道,jiara

  • 持续监控与改进

绝大多数用例是功能还是自动化为主

接口
全面自动化测试:搭建接口自动化测试框织用例盖率可以达到99%及以上
web
搭建过web自动化测试恒架,覆养率:10-30%6

在实际项目中,主要结合手工测试及自动化一起实现用例执行

有没有接触过库级别的测试

功能库是软件测试中一个重要环境,主要目的是验证功能库中的各个功能是否按照预期工作,确保能够正确,稳定提供所需的服务。

关闭防火墙

如何查看自己的防火墙属于 iptables 还是 firewalld
运行命令:

sudo firewall-cmd --state 

iptables防火墙,则会出现内容:

iptables: Firewall is not running.
iptables: Firewall is running. //如果启动了会出现这个
firewalld 防火墙,则会出现内容:running

停止防火墙:(iptables是centos7之前常用的防火墙,在centos7上使用了firewall)

service iptables stop
chkconfig iptables off

对于 firewalld 防火墙:

sudo systemctl stop firewalld
sudo systemctl disable firewalld

永久关闭防火墙(通过配置文件)
1、对于 iptables 防火墙:
然后将文件中的所有规则都删除,保存并退出文件。这将完全禁用 iptables 防火墙。

sudo vi /etc/sysconfig/iptables
1
2、对于 firewalld 防火墙:
在该文件中找到 Enabled 字段,并将其值从 yes 修改为 no。然后保存并退出文件。这将完全禁用 firewalld 防火墙

sudo vi /etc/firewalld/firewalld.conf

bugfree使用

指派给:Bug 的当前处理人(开发人员)。如果不知道 Bug 的处理人,可以 指派给 Active,项目或模块负责人再重新分发、指派给具体人员。如果设定 了邮件通知,被指派者会收到邮件通知。状态为 Closed 的 Bug,默认会指派 给 Closed,表示 Bug 生命周期的结束。

抄送给:需要通知相关人员时填写,例如测试主管、该产品负责人或开发 主管等。可以同时指派多个,人员之间用逗号分隔。如果设定了邮件通知, 当 Bug 有任何更新时,被指派者都会收到邮件通知。

严重程度:Bug 的严重程度。由 Bug 的创建者视情况来指定,其中 1 为致命最严重的问题,4 为最小的问题。一般 1 级为系统崩溃或者数据丢失或、冒烟测试及每次测试都需执行的用例的问题;2 级为严重主要功能的问题;3 级为一般次要功能的问题;4 级为轻微细微的问题。

优先级:Bug 处理的优先级。由 Bug 的处理人员按照当前业务需求、开发计 划和资源状态指定,其中 1 的优先级最高,4 的优先级最低。一般 1 级为需 要立即解决的问题;2 级为需要在指定时间内解决的问题;3 级为项目开发 计划内解决的问题;4 级为资源充沛时解决的问题。 相关 Bug:填写 Bug 的 ID 号(1、2、3……),与当前 Bug 相关的 Bug。例如, 相同代码产生的不同问题,可以在相关 Bug 注明。

相关 Case:填写 Case 的 ID 号(1、2、3……),与当前 Bug 相关的 Case。例 如,测试遗漏的 Bug 可以在补充了 Case 之后,在 Bug 的相关 Case 注明。

上传附件:上传 Bug 的屏幕截图,Log 日志等,方便 Bug 处理人员。

注释:填写测试相关的事宜

三种无效的 Bug

By Design 设计需求就是这么设计的

Duplicate 这个问题别人已经发现,如果解决方案选择该项,需 要指定重复 bug 的编号

Not Repro 无法复现的问题

四种有效的 Bug

Fixed 问题被修复

External 外部原因(比如浏览器、 操作系统、其他第三方软 件)造成的问题

Postponed 发现的太晚了,下一个版本讨论是否解决

Won’t Fix 是个问题,但是不值得修复

Bug 的三种状态

在 Bugfree 中,一个 Bug 只有 3 种状态:Active(活动)、Resolved(已解决)、 Closed(关闭)。

Active ( 活 动) Bug 的初始状态。也是 Bug 激活的状态。任何新建的 Bug 状态都 是 Active。可以通过编辑修改 Bug 的内容,并指派给合适的人员 解决。 Resolved(已解决) 解决 Bug 之后的状态。

Closed(已关闭) 已修复 Bug 在验证无误之后关闭,该 Bug 处理完毕。如果没有 真正解决或者重新复现,可以重新激活,Bug 状态重新变为 Active

执行结果

Passed 运行成功的 Test Case

Failed 运行失败的 Test Case

Blocked 当前 Test Case 因为其他原因,无法正常运行。

N/A 对当前 Test Case 不适用

状态:

Completed 已完成的 Test Result

Investigating 待研究确认的 Test Result

Resolved 已解决的 Test Result

写用例的注意事项:
第一、思路有多少种情况,就写多少条测试用例覆盖

第二、保持用例步与步之间的独立性

第三、用例中该用数据的地方必须使用数据

第四、每一条测试用例必须有明确的输入和预期结果

第五、写用例时一定要参照软件的界面来写。

第六、用例的输入,怎么操作的就怎么写。

第七、用例中使用的数据不能关联。

启动bugfree:

/opt/lampp/lampp start

将xampp添加到系统启动项

ln -s /opt/lampp/lampp /etc/rc.d/init.d/lampp

chkconfig命令可以用来检查、设置系统的各种服务

chkconfig –add lampp

chkconfig –list | grep lampp

若上述的3、4、5为ON表示设置系统启动项成功

lampp设置安全密码

/opt/lampp/lampp security

bug跟踪流程

[面试题] 你们公司 bug 管理流程是什么? bug 跟踪流程是什么?

bug 跟踪流程 (200 以上字)

框架:软件测试工程师提交一个 bug–》测试组长进行审核–》开发组长在开发环境验证是否能复现-》开发工程师进行修复–》测试程师进行验证-》closed

错误推测法: 根据测试经验,推测系统里面可能的模块存在大量的 bug,因此测试时对该模块进行详细的测试。
微信的视频聊天功能,语音功能测试等等。

[面试题] 你是如何发现 bug 的? 测试用例如何设计出来的? 什么是测试思路? 你是如何理解需求的? 思考: 所有的 bug 都是用例发现的吗? 有的 bug 是用例之外发现的,说明我们的用例设计不全,需要下一个版本进行完善。

你们公司的测试人员与开发人员发生过矛盾吗? 你们公司测试和开发的关系怎么? )–[面试题]
第一步: 查一下有没有言语不当地方。

第二步:确认是不是程序问题 (界面问题,硬件问题,数据库问题,架构问题等等)

第三步: 明确不修改的原因是什么? 一锁定争议的焦点。

不好复现——解决方案
不影响主要功能——解决方案

存在技术难点一-解决方案

调用第三方问题——解决方案
第四步:
充分利用: PM,测试经理,QA(质量管理员)

如何定位 bug?

产品设计问题

需求问题

架构问题

数据库问题

源代码问题

硬件问题

界面问题

如果你遇到一个不能复现的问题该怎么处理?

第一、截图

第二、日志

第三、利用自动化工具进行复现

OSI分层

1.应用层(Application layer)
应用层(Application layer)是OSI模型的第7层,应用层是最靠近用户的OSI层。这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。

它是计算机用户,以及各种应用程序和网络之间的接口,其功能是直接向用户提供服务,完成用户希望在网络上完成的各种工作。它在其他6层工作的基础上,负责完成网络中应用程序与网络操作系统之间的联系,建立与结束使用者之间的联系,并完成网络用户提出的各种网络服务及应用所需的监督、管理和服务等各种协议。此外,该层还负责协调各个应用程序间的工作。

协议:HTTP、TFTP、FTP、NFS、WAIS、SMTP

2.表示层(Presentation Layer)
表示层(Presentation Layer)是OSI模型的第六层,数据的表示、安全、压缩。可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。

主要功能:处理用户信息的表示问题,如编码、数据格式转换和加密解密等。

协议:Telnet、Rlogin、

3.会话层(Presentation Layer)
会话层(Presentation Layer)是OSI模型的第五层,建立、管理、终止会话,对应主机进程,指本地主机与远程主机正在进行的会话。

主要任务是:向两个实体的表示层提供建立和使用连接的方法。将不同实体之间的表示层的连接称为会话。因此会话层的任务就是组织和协调两个会话进程之间的通信,并对数据交换进行管理。

协议:SMTP,DNS,

4.传输层(Transport Layer)
传输层(Transport Layer)是OSI模型的第四层,定义传输数据的协议端口号,以及流控和差错校验。

主要任务是:向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输。传输层的作用是向高层屏蔽下层数据通信的细节,即向用户透明地传送报文。

协议:TCP,UDP

5.网络层(Network Layer)
网络层(Network Layer)是OSI模型的第三层,进行逻辑地址寻址,实现不同网络之间的路径选择。

其主要任务是:通过路由选择算法,为报文或分组通过通信子网选择最适当的路径。该层控制数据链路层与传输层之间的信息转发,建立、维持和终止网络的连接。具体地说,数据链路层的数据在这一层被转换为数据包,然后通过路径选择、分段组合、顺序、进/出路由等控制,将信息从一个网络设备传送到另一个网络设备。

协议:IP,ICMP,ARP,RARP,AKP,UUCP

6.数据链路层(Data Link Layer)
数据链路层(Data Link Layer)是OSI模型的第二层,建立逻辑连接、进行硬件地址寻址、差错校验等功能。(由底层网络定义协议)

主要功能:通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。在计算机网络中由于各种干扰的存在,物理链路是不可靠的。因此,这一层的主要功能是在物理层提供的比特流的基础上,通过差错控制、流量控制方法,使有差错的物理线路变为无差错的数据链路,即提供可靠的通过物理介质传输数据的方法。

协议:FDDI,Ethernet,Arpanet,PDN,SLIP,PPP

7.物理层(Physical Layer)
物理层(Physical Layer)是OSI模型的最底层,也是第一层。建立、维护、断开物理连接。

主要功能:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。
物理层的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。使其上面的数据链路层不必考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的。

应用数据(应用层,表示层,会话层)-报文

传输层-段-端口号-服务进程到服务进程

网络层-包-IP地址-端到端

数据链路层-帧-MAC地址-跳到跳

物理层-比特

传输层中,最常用的两个协议是TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)

TCP与UDP基本区别
1.tcp基于连接的传输层协议与udp无连接
2.TCP要求系统资源较多,UDP较少;
3.UDP程序结构较简单
4.tcp流模式:数据分解为多个小的数据报文进行发送,udp数据报模式,整个报文发送出去;
5.TCP有三次握手,保证数据正确性,UDP可能丢包
6.TCP保证数据顺序,UDP不保证

7.tcp只支持点对点通讯,udp支持一对一、一对多、多对多通讯

8.tcp有拥塞机制,udp无

9.tcp要求实时性低,准确度高,udp反之

http协议与tcp协议区别
1、性质不同:
http是一个简单的请求-响应协议。TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。

2、连接不同:
TCP连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。http通常运行在TCP之上。指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。

3、功能不同:
当应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,TCP则把数据流分割成适当长度的报文段,最大传输段大小(MSS)通常受该计算机连接的网络的数据链路层的最大传送单元(MTU)限制。HTTP协议是基于请求/响应范式的。

4、HTTP:
超文本传输协议,是应用层的协议,以TCP为基础
TCP:传输控制协议,是传输层的协议,以IP协议为基础

5、从本质上说:
Http协议是建立在TCP协议基础之上的。当浏览器需要从服务器 获取网页数据的时候,会发出一次http请求。Http通过TCP建立起一个到服务器的通道。
当一个网页完成之后,客户端和服务器端之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个页面时,会继续使用这一条已经建立的连接Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件中设定这个时间,

6、连接状态
Http是无转态的连接,TCP是有状态的长连接

HTTPS和HTTP的主要区别

100 Continue
客户端应当继续发送请求。
101 Switching Protocols
切换协议
102 Processing
WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行

200 OK请求成功

201 Created请求成功,已创建新资源

202 Accepted已接受请求,但尚未处理完成

301 永久重定向

302 临时重定向

400 Bad Request 客户端请求的语法错误,服务器无法理解

401Unauthorized 未授权,请求要求用户的身份认证,没注册的用户登录失败

402 Payment Required 为了将来可能的需求而预留的

403 Forbidden 请求没权限,服务器拒绝执行,已登录的用户,无法执行管理员的功能

404 Not Found 服务器无法根据客户端的请求找到资源 (网页)

405 Method Not Allowed 请求方式错误

406 Not Acceptable 请求的内容特性无法满足请求头中的条件,不被接受

407 Proxy Authentication Required 代理授权请求

408 Request Timeout 请求超时

409 Conflict 请求资源的当前状态之间存在冲突

410 Gone 请求资源不可用

411 Length Required 请求没有内容长度

412 Precondition Failed 请求头字段先决条件不满足

413 Request Entity Too Large请求实体太大

414 Request-URI Too Long 请求url太长

415 Unsupported Media Type请求实体格式不支持

451 Unavailable For Legal Reasons该请求因法律原因不可用

500 Internal Server Error 服务器内部错误,无法完成请求

501 Not Implemented 服务器不支持请求的功能,无法完成请求

502 Bad Gateway 作为网关或者代理工作的服务器尝试执行请求时从远程服务器接收到了一个无效的响应
503 Service Unavailable 由于超载或系统维护,服务器暂时的无法处理客户端的请求。
504 Gateway Time-out 充当网关或代理的服务器,未及时从远端服务器获取请求

1、证书:https协议需要到CA申请证书,一般免费证书较少,因而需要一定费用。

2、安全性:http是超文本传输协议,信息是明文传输,https则是HTTP协议+SSL协议构建加密传输协议。

3、端口:http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

Jmeter JDBC参数化

Database Driver class Database URL
MySQL com.mysql.jdbc.Driver jdbc:mysql://host:port/{dbname}
PostgreSQL org.postgresql.Driver jdbc:postgresql:{dbname}
Oracle oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:user/pass@//host:port/service
Ingres (2006) ingres.jdbc.IngresDriver jdbc:ingres://host:port/db[;attr=value]
MSSQL com.microsoft.sqlserver.jdbc.SQLServerDriver或者net.sourceforge.jtds.jdbc.Driver jdbc:sqlserver://IP:1433;databaseName=DBname或者jdbc:jtds:sqlserver://localhost:1433/“+”library”

Variables names 参数使用方法
jmeter官网给的解释是:如果给这个参数设置了值,它会保存sql语句返回的数据和返回数据的总行数。假如,sql语句返回2行,3列,且variables names设置为A,,C,那么如下变量会被设置为:

A_#=2 (总行数)
A_1=第1列, 第1行
A_2=第1列, 第2行
C_#=2 (总行数)
C_1=第3列, 第1行
C_2=第3列, 第2行

如果返回结果为0,那么A_#和C_#会被设置为0,其它变量不会设置值。
如果第一次返回6行数据,第二次只返回3行数据,那么第一次那多的3行数据变量会被清除。
可以使用${A_# }、${A_1}获取相应的值

Jmeter正则表达式提取器

Apply to:应用范围,选默认的main sample only就行了
要检查的响应字段:要提取的字段范围
主体:响应体,不包含响应头;最常用
body(unescaped):响应体,替换了所有HTML转义符;不建议使用
body as a Document:从不同类型的文件中提取文本;影响性能
信息头:响应头
Requeste Headers:请求头
URL:URL
响应代码:响应码(Response code)
响应信息:响应信息(Response message)
引用名称:接收提取值的变量名,*必传
正则表达式:正则表达式
模板:从找到的匹配项中创建字符串的模板
如果一条正则表达式有多个提取结果,则提取结果是数组形式
模板1、2…表示把解析到的第几个值赋值给变量,从1开始匹配
0表示整个表达式匹配的内容
若只有一个结果,只能是1
匹配数字(0代表随机):取第几个值(0:随机,默认;-1所有;1第一个值),非必传
缺省值:缺省值,匹配不到值的时候取该值,非必传
Use empty default value:勾选后,提取不到值时,则返回空字符串

  • - 变量=截取的全部字段,彼此字段间以空格相隔
    - 变量_g:应代表截取的变量个数?
    - 变量_g0: 根据正则表达式匹配到的(截取前的)完整字段。
    - 变量_g1:截取到的第一个字段,使用时${变量名_g1}。
    - 变量_g2:截取到的第二个字段,使用时${变量名_g2},如下图所示
    

$0$指全文匹配,$1$ $2$指同时获取第一个和第二个提取点。

Match No.(第几个匹配成功的)
Default Value(当未匹配到时,使用此值返回)

mumu模拟器:旧端口7555,新端口号16384

clumsy模拟弱网工具

设置参数

1.延迟(Lag),把数据包缓存一段时间后再发出,这样能够模拟网络延迟的状况。

2.掉包(Drop),随机丢弃一些数据。

3.节流(Throttle),把一小段时间内的数据拦截下来后再在之后的同一时间一同发出去。

4.重发(Duplicate),随机复制一些数据并与其本身一同发送。

5.乱序(Outof order),打乱数据包发送的顺序。

6.篡改(Tamper),随机修改小部分的包裹内容

ConfigParser模块

ini配置文件格式

# 这是注释
; 这也是注释
[section1]
name = wang
age = 18
heigth = 180
[section2]
name = python
age = 19

初始化对象并读取文件
import configparser
import os

创建对象

config = configparser.ConfigParser()
dirPath = os.path.dirname(os.path.realpath(file))
inipath = os.path.join(dirPath,’test.ini’)

读取配置文件,如果配置文件不存在则创建

config.read(inipath,encoding=’utf-8’)
获取指定节点的所有key
option = config.options(‘section1’)
print(option)

获取指定节点的键值对
item_list = config.items(‘section2’)
print(item_list)

获取指定节点的指定key的value
val = config.get(‘section1’,’age’)
print(‘section1的age值为:’,val)

将获取到值转换为int\bool\浮点型

Attributes = config.getint(‘section2’,’age’)
print(type(config.get(‘section2’,’age’)))
print(type(Attributes))

检查section或option是否存在,返回bool值
has_sec = config.has_section(‘section1’)
print(has_sec)

has_opt = config.has_option(‘section1’,’name’)
print(has_opt)

添加一个section和option
if not config.has_section(‘node1’):
config.add_section(‘node1’)

不需判断key存不存在,如果key不存在则新增,若已存在,则修改value

config.set(‘section1’,’weight’,’100’)

将添加的节点node1写入配置文件

config.write(open(inipath,’w’))
print(config.sections())
print(config.options(‘section1’))

删除section和option

删除option

print(‘删除前的option:’,config.items(‘node1’))
config.remove_option(‘node1’,’dd’)

将删除节点node1后的内容写回配置文件

config.write(open(inipath,’w’))
print(‘删除后的option:’,config.items(‘node1’))

删除section

print(‘删除前的section: ‘,config.sections())
config.remove_section(‘node1’)
config.write(open(inipath,’w’))
print(‘删除后的section: ‘,config.sections())

写入方式
1、write写入有两种方式,一种是删除源文件内容,重新写入:w

config.write(open(inipath,’w’))

另一种是在原文基础上继续写入内容,追加模式写入:a

config.write(open(inipath,’a’))

需要注意的是,config.read(inipath,encoding=’utf-8’)只是将文件内容读取到内存中,即使经过一系列的增删改操作,只有执行了以上的写入代码后,操作过的内容才会被写回文件,才能生效。

接口测试

1.接口?
单元测试之后,接口,功能之前,功能自动化

2.目前web系统大部分都是用前后端分离的开发模式开发,导致后端的接口都对所有人暴露的。安全性,和完整性要进行校验。
3.流程:
前期:
1.分析接口说明书

http协议包含四个部分:

请求:

    请求行、请求头、请求空行、请求体
响应:
    响应行、响应头、响应空行、响应体

http 状态码:
1xx: 请求正在处理中
2xx: 成功
3xx: 重定向,会访问多个请求
302 304
4xx: 浏览器问题
404 405
5xx: 服务器–>
日志分析:查看日志信息 –> tail -f 监控日志

    python :open a.log
    500    505    503

2.按照接口说明书编写用例

1.企业

    1.开发那边有接口说明书,直接对着接口说明书开发用例即可

    2.没有,自己去抓包分析: fiddler,charles

2.fiddler:(抓包,断点,弱网)
    断点: rules -->automatic breakpoint(before regeust ,afterresponse)
    弱网

customes rules
            if (m SimulateModem) {

// Delay sends by 300ms per KB uploaded.

oSession["request-trickle-delay"] =9000";

// Delay receives by 150ms per KB downloaded

oSession["response-trickle-delayn] = 5000";

}

preformance    --> 第一项生效

丢包操作:
  • fiddler 模拟app,web弱网访问的环境
    clumsy

    3.接口用例设计方法
    1.业务逻辑角度(等价类,边界值,场景法,因果图)
    场景法:正确用户名,正确密码看返回数据是否是成功报文 :code:100

    正确用户名,错误密码看返回数据是否是正常处理的报文: code:200

    边界值:用户名至少3位

    可以设计2、3、4位的用户名进行登陆,看接口返回结果是否是code:100或者200
    2.参数异常 (多参,少参,空参,空值,参数值类型):用户名数据:li si

    空格数据传参: 传入一堆空格
    3.安全性校验(sql注入,越权访问):
    1‘ or ‘1’ = ’1传入sq1片段脚本,或者while True等病毒性脚本来校验

3、开发脚本

准备接口测试场景:

登陆、预备接口名称、url地址、请求方式、请求头、入参、出参

jmeter配置: 线程组、http请求、响应断言

csv data set config 引入外部文件进行参数化

先造数据:将用例的数据 –> 存储在txt中
使用csv data set config 引入外部文件进行参数化

Filename

编码集:utf-8

变量名称:

切割规则:

线程组
http请求
响应 断言

查看结果树

jmeter的高级配置:

关联:接口测试中,如果一个接口的请求需要用到上一步的数据才能进行下一步操作,可以使用正则表达式提取器来提取重要数据

jessionsid = (.+?)
.:任意字符
+:一个或者多个
?:匹配最后一个字符结束
():提取的数据当成一组

然后在下一步使用${sid},引入刚才提取的jsessionid数据即可

中期:

造数据

执行测试    

后期:

分析接口的bug

jmeter生成测试报告

汇总报告与聚合报告类似,但是相比聚合报告,汇总报告使用更少的内存

一、怎么生成jtl文件

创建存储jtl类型文件的文件夹和存储html测试报告的文件夹

在jtl文件夹中创建空的result.jtl文件

方法一:创建result.jtl文件的方式:新建txt空白文件–>点击文件,另存为–> 输入文件名为result.jtl –> 文件类型选为 所有文件–>编码选为utf-8–>点击保存

二、使用jmeter中的GUI生成测试报告

在jmeter脚本的查看结果树中,在所有数据写入一个文件,点击浏览,获取result.jtl文件的地址

获取文件地址之后会报错,是因为log文件为空,没有关系,点击ok即可;

然后启动脚本;

启动jmeter脚本后,会有如下提示,在jtl中已经存在result.jtl文件,因为现在为空文件,选择附加到现在文件,选择overwrite existing file 也可;若不是空文件,想增加log日志,则选择附加到现有文件;只显示本次脚本运行的日志,则选择overwriter existing file

之后result.jtl文件会存储测试数据

Jmeter脚本执行完成后,点击工具,点击Generate HTML report

result file :选择刚刚生成的result.jtl文件的路径

user.properties file : 选择 jmeter安装目录下bin文件内 jmeter.properties

output directory : 选择报告输出的路径

点击Generate report

如果报告输出的文件夹不是空的,则会出现如下提示,需要将报告输出的文件夹清空,再次点击Generate report,即成功生成报告

三、jmeter CLI模式

CLI = Command Line,命令行模式

CLI 模式可选参数

-n 指定 JMeter 将在 cli 模式下运行

-t 包含测试计划的 jmx 文件名称

-l 记录测试结果的 jtl 文件名称

-j 记录 Jmeter 运行日志的文件名称

-g 输出报告文件( .csv 文件)

-e 生成 html 格式的测试报表

-o 生成测试报表的文件夹/文件夹不存在或为空

服务器相关参数

-r 指定所有远程服务器中运行测试

-R 在指定的远程服务器中运行测试

-X 服务器运行完脚本后自动停止 jmeter-server(用的少)

1.使用命令行生成测试报告

进入D:\apache-jmeter-5.5\bin,点击地址,输入cmd,点击回车,进入命令控制台

jmeter -n -t D:\ JmeterTest\test.jmx -l result.jtl -e -o D:\jmeter_report\report

命令执行之后,在报告文件文件夹中生成测试报告,在jmeter安装文件夹的bin文件夹中自动生成result.jtl文件。

2.使用Windows批处理文件自动生成测试报告

因每次使用命令行生成测试报告之前,都要将存储报告的文件夹中的内容以及命令行执行后自动生成的result.jtl文件清空,故可以使用Windows批处理文件自动生成测试报告。操作步骤如下:

  1. 新建空白文件,文件类型为.bat。在文件中输入以下命令:

del /s /Q D:\apache-jmeter-5.5\bin\result.jtl

rd /s /Q D:\jmeter_report\report

md D:\jmeter_report\report

jmeter -n -t D:\jmeter_demo\yozo_file_upload.jmx -l result.jtl -e -o D:\jmeter_report\report

  1. 然后将编译好的bat文件,放入jmeter安装文件夹中的bin文件夹中
  2. 点击bin文件夹中的bat文件,即可自动生成测试报告

命令含义:

删除文件

Del表示删除文件

/s 删除该文件

/q 删除前不确认

删除文件夹

Rd 表示文件夹

/s 删除该目录及其下的所有内容

/q 删除前不确认

创建文件夹

Md (mkdir)表示创建文件夹

echo > 文件名 表示创建文件

echo 内容 >> 文件名 表示追加文件

dir /S 搜索的路径\文件名

搜索文件中包含要搜内容的行并显示行号:find /I /N “要搜的内容” 文件名

打开文件:start 文件名.后缀名
打开文件夹:start 文件夹名

查看指定文件中的内容:type 文件名.后缀名

Charles

在请求的主机中添加代理,才可正常访问

http://localhost.charlesproxy.com:90

悲观锁,乐观锁定义

悲观锁:悲观锁认为被它保护的数据是极其不安全的,每时每刻都有可能变动,一个事务拿到悲观锁后(可以理解为一个用户),其他任何事务都不能对该数据进行修改,只能等待锁被释放才可以执行。

乐观锁:乐观锁的“乐观情绪”体现在,它认为数据的变动不会太频繁。因此,它允许多个事务同时对数据进行变动,通过在表中增加一个版本(version)或时间戳(timestamp)来实现

xshell

rz: 从主机上传到linux

sz :从linux下载文件到主机

1个汉字 = 2个字符= 4个字节 = 32bit(ACSII码下)

Jmeter跨线程组传递参数(token)

在登录接口下,添加json提取器采用$.token提取token,beanshell后置处理器 使用函数助手中${__setProperty(key,value,true)},将提取出来的token设置为全局变量,再使用${__P(key)}在其他线程组使用

冒泡排序

def bubble_sort_optimized(arr):
    n = len(arr)
    for i in range(n):
        swapped = False
        for j in range(n-i-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
                swapped = True
        if not swapped:
            break
    return arr
def bubble_sort_recursive(arr, n=None):
    if n is None:
        n = len(arr)
    if n == 1:
        return arr
    for i in range(n-1):
        if arr[i] > arr[i+1]:
            arr[i], arr[i+1] = arr[i+1], arr[i]
    bubble_sort_recursive(arr, n-1)
    return arr

时间复杂度仍然为 O(n^2)

聚簇索引和非聚簇索引区别

数量:聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个

聚簇索引:索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块

mysql慢查询如何优化?

1.用索引

2.用最优索引

3.去多余的字段

4.分库分表

5.数据库的服务器性能

测试生命周期

1.产品经理进行市场调研,整理产品需求

2.需求分析,开需求评审会,由产品经理、开发人员、测试人员共同参加

3.开发编写开发计划,测试人员编写测试计划

4.开发人员与测试人员根据产品需求书分别开始开发产品与编写测试用例,期间开展用例评审会

5.开发人员完成代码编写,运维人员完成测试环境部署,交由测试人员测试

6.若测试人员发现代码漏洞,则交由开发人员修改,开发人员修改完毕后,重复上述步骤,直至测试通过,测试人员提交测试报告

7.产品交于产品经理验收,验收完毕后交付用户。

给你一个杯子,你怎么测试

1.功能测试:主要关注水杯基本功能

2.界面测试:主要关注水杯外观、颜色、设计等方面

3.易用性测试:主要关注水杯使用是否方便

4.性能测试:最大使用次数

5.兼容性测试:主要关注水杯是否可以装其他液体,如果汁、汽油、酒精等

6.可移植性测试:主要关注水杯放置环境等

7.安全性测试:主要关注水杯外观和各种异常条件下是否释放有毒物质等

软件生命周期:

从软件最初构思到最终消亡(退役)的过程。

  1. 软件生命周期

立项 —需求分析 —设计、编码、测试 —发布 —运行维护 —淘汰

软件立项===》可行性研究 ===》需求分析 ===》概要设计 ===》详细设计 ===》编码实现 ===》单元测试 ===》集成测试 ===》系统测试 ===》验收测试 ==》运行维护

常见的请求头以及它们的作用是什么?

Accept: (客户端可以接收的数据格式)

X-Requested-With:(ajax请求,异步请求) User-Agent: (客户端的用户)

Content-Type: application/x-www-form-urlencoded; charset=UTF-8(内容的格式)

Cookie: csrf_token=2c76c391ab3922fe; (cookie信息)

工作中常用的jmeter自带函数有哪些

1) random():随机数函数

2) randomString():随机字符串函数3) time():获取当前时间戳函数

4) md5():加密函数

5) setpropty():跨线程组设置属性值函数

自动化常见的异常

NoSuchElementException: 没有如此元素异常NoSuchAttributeException : 没有如此属性异常NoSuchFrameException : 没有如此frame异常ElementNotSelectableException :元素不能选择异常ElementNotVisibleException :元素不可见异常Element not visible at this point :在当前点元素不可见TimeoutException : 超时异常

有哪些方法可以减少资源的大小

gzip压缩
js混淆
css压缩
图片压缩

外联CSS或JavaScript的优点

如果JavaScript和CSS被多个页面调用时,这样修改更方便,只要修改一个文件就可以。
分离HTML、CSS和Javascript可以更容易操纵它们,方便协同工作。
外置Javascript文件可以被浏览器缓存

减少HTTP请求通常有以下方法:

内联图片
CSS Sprites
合并脚本与样式
图上映射

JavaScript建议放在底部将JavaScripte放在底部的目的是防止JavaScript禁止浏览器并行下载的功能。

chrome设置并发下载的方法:

URL地址中输入chrome://flags/进行设置参数界面

Parallel downloading选项用于设置是否开始并行下载

测试策略

内容一般包含测试范围、测试角色、测试方法、测试工具、测试层级、测试类型、验证环境、风险和处理方案、测试指标和测试可交付成果等内容。如何来理解这些内容呢?我们可以将其简化为四个问题:测什么?由谁测?什么时候测?怎么测?

Android ANR日志路径在哪?

文件路径:/data/anr/traces.txt

adb shell monkey -p 包名 -s seed值(回归测试)-v(vv) 次数

monkey跑10万次需要多久

参考答案:一般先计算跑一万次花费的时间,然后在x10根据以往经验,忽略超时的情况下,一般在10小时左右

那如果monkey测试过程中,出现crash你怎么定位

参考答案:crash一般是空指针导致的,在logcat日志中输入“nullpoint”搜索到相关的日志,然后把日志给开发定位

用MONKEY做APP测,怎么做的/如果有问题的话怎么定位

(1)我们是使用monkey来做稳定性测试,测试前先用adb logcat -c清空服务器上原有的日志,再用adb logcat -v time命令,将logcat日志导出到本地电脑上保存。(2)再使用monkey命令adb shell monkey -p 包名 -v 次数,然后跑10万次;跑完后就看monkey日志,如果说它跑的次数跟我设的次数不一样.就说明monkey中途跑失败了。

那我就要去看看logcat日志有没有null point或anr in的关键字。如果有null point,就表示app在测试过程中crash了;然后把null point前后的日志截取下来,发给开发定位;如果有anr in,表示app在测试过程中出现了ANR(程序无响应)

我们要把/data/anr/traces.txt文件取下下来,再把ANR进程号对应的日志发给开发定位问题

APP测试常见的严重问题有(例Crash)?分别引起的原因有哪些?

1)、Wifi和移动数据之间切换,没有提示;2)、长时间使用,内存不足,可能是内存泄露;3)、前后台切换,app 崩溃;4)、敏感数据没有加密,如:用户名和密码

你对软件测试的理解

软件测试是指通过对软件进行各种测试手段的验证与评估,以发现软件中存在的问题和缺陷,并尽可能地提高软件质量和可靠性的过程。它包括功能测试、性能测试、安全测试、兼容性测试、易用性测试等多个方面,旨在确保软件的正确性、完整性、可靠性、安全性、性能等方面的要求。

设计微信视频聊天的用例

用例1:启动视频聊天
参与者:用户A,用户B
前置条件:用户A和用户B已添加为微信好友
后置条件:进入视频聊天界面
操作步骤:

  1. 用户A在微信聊天列表中找到用户B,点击进入聊天界面。
  2. 用户A点击聊天界面下方的“+”按钮,选择“视频聊天”。
  3. 用户B收到视频聊天邀请,点击接受。
  4. 双方进入视频聊天界面。

用例2:关闭视频聊天
参与者:用户A,用户B
前置条件:用户A和用户B正在进行视频聊天
后置条件:退出视频聊天界面
操作步骤:

  1. 用户A在视频聊天界面点击右上角的“结束”按钮。
  2. 用户B收到视频聊天结束通知。
  3. 双方退出视频聊天界面。

用例3:切换前后摄像头
参与者:用户A,用户B
前置条件:用户A和用户B正在进行视频聊天
后置条件:摄像头切换成功
操作步骤:

  1. 用户A在视频聊天界面点击下方的摄像头图标。
  2. 系统自动切换到前置摄像头。
  3. 用户A再次点击摄像头图标,切换到后置摄像头。
  4. 用户B看到用户A的摄像头已经切换。

用例4:发送表情包
参与者:用户A,用户B
前置条件:用户A和用户B正在进行视频聊天
后置条件:表情包发送成功
操作步骤:

  1. 用户A在视频聊天界面点击下方的表情包图标。
  2. 系统显示表情包列表,用户A选择一个表情包。
  3. 用户A点击选中的表情包,发送给用户B。
  4. 用户B收到表情包,显示在聊天界面中。

使用过哪些测试工具

作为一个认知智能模型,我本身并不使用测试工具。但是,我可以为您提供一些建议和推荐一些常用的测试工具,这些工具可以帮助您完成各种类型的软件测试。

  1. Jira:这是一个广泛使用的项目管理和问题跟踪工具,可以用于测试计划、缺陷跟踪和测试用例管理。

  2. TestRail:这是一个灵活的测试管理工具,可以帮助您创建、组织和管理测试用例、测试计划和测试运行。

  3. Selenium:这是一个自动化测试工具,可以用于Web应用程序的自动化测试。它可以模拟用户操作浏览器的行为,如点击按钮、输入文本等。

  4. Appium:这是一个用于移动应用程序自动化测试的工具,支持Android和iOS平台。它可以模拟用户操作手机或平板的行为,如点击按钮、滑动屏幕等。

  5. Postman:这是一个用于API测试的工具,可以用于发送HTTP请求并检查响应。它支持多种格式的请求和响应,如JSON、XML等。

  6. LoadRunner:这是一个性能测试工具,可以模拟大量用户并发访问Web应用程序,以评估系统的性能和稳定性。

  7. SoapUI:这是一个用于Web服务测试的工具,可以用于验证SOAP和REST Web服务的功能性和非功能性需求。

  8. Jenkins:这是一个持续集成和持续交付工具,可以自动化构建、测试和部署软件。它可以与各种测试工具集成,以实现自动化测试流程。

  9. Git:这是一个版本控制系统,可以用于代码管理和团队协作。它可以帮助开发人员跟踪代码更改,以便在需要时进行回滚和合并。

软件发版前发现一例bug,怎么处理?

采取以下步骤来处理:

  1. 确认bug:包括复现bug、查看相关日志和代码,以及与开发团队讨论。

  2. 评估影响:评估bug对软件功能和用户体验的影响。严重的后果(例如数据丢失或系统崩溃)立即采取行动。

  3. 优先级排序:根据bug的严重程度和影响范围

  4. 通知相关团队

  5. 修复bug

  6. 重新测试

  7. 发布更新

  8. 跟踪和反馈

bug记录应该包含哪些内容

  • Bug编号:唯一标识符,方便跟踪和管理;

    • Bug描述:对Bug的详细描述,包括出现的环境、触发条件、现象表现等;
    • Bug级别:根据Bug的影响程度和严重程度进行分类,如致命、严重、一般、轻微等;
    • Bug状态:包括已发现、已确认、已修复、已验证等状态,方便跟踪和管理Bug的处理过程;
    • Bug截图:提供Bug出现的截图或录屏,方便开发人员和测试人员理解Bug的情况;
    • Bug重现步骤:提供重现Bug的详细步骤,方便开发人员复现Bug并进行修复;
    • Bug处理说明:包括Bug的修复过程、测试过程、验证过程等,方便管理和跟踪Bug的处理流程。
  • 预期结果,实际结果

    这些内容可以帮助开发人员和测试人员更好地理解和处理Bug,同时也方便管理和跟踪Bug的处理过程。

熟悉的linux和adb命令

查看硬盘大小:df -h

内存:free -h

操作系统的信息:Uname -a

linux发行版本 cat /proc/version

cpu概要信息:cat /proc/cpuinfo

系统的整体性能运行情况:top

iOS 证书有哪些?

  1. iOS开发证书:这种类型的证书主要用于在开发过程中将应用程序安装到苹果手机真机上,以便测试应用程序的运行情况。
  2. iOS发布证书:当应用程序经过开发测试并准备上线时,就需要使用发布证书。只有用发布证书打包的ipa文件才能上传到App Store进行审核和发布。
  3. iOS推送证书:主要用于配置和启用苹果设备的推送通知服务

灰度测试,以选定的特定人群为对象,在他们中使用即将正式发布的产品或应用,然后逐步扩大试用者数量。这一过程主要是为了及时发现和纠正产品中存在的问题。

集成测试,也叫组装测试或联合测试,是软件测试的一种类型。该测试是在单元测试的基础上进行,将所有模块按照设计要求(如根据结构图)组装成为子系统或系统,然后对其进行检查。集成测试的目的是检查软件模块之间的数据通信和功能,适用于不同的场景和需求。

软件测试主要分为功能测试、性能测试、安全测试和特性测试四大类。其中,功能测试(逻辑功能测试、界面测试、易用性测试、安装测试和兼容性测试等)。性能测试(负载测试、压力测试、容量测试等)。安全测试(非法入侵XSS和数据泄露SQL注入)。特性测试则是对软件的特殊功能或特性进行专门的测试。

软件测试还包括单元测试、集成测试、系统测试、健全性测试、冒烟测试、接口测试和回归测试等。同样,从测试阶段来看,有Alpha测试和Beta/验收测试。这些不同类型的测试方法旨在全面检验软件的质量,确保其满足用户的需求和期望。

团队协作:include控制器+测试片段(一个线程组中一ge测试片段)

http请求默认值:常见必须的请求头:Accept,XMLhttprequest,Content-Type

用户定义变量:自定义变量全局提取

http cookie管理器:管理cookie

重定向和跳转区别:

  1. 定义:请求转发,也被称为跳转,客户端发送一次请求后,服务器端接收此请求并将其转交给另一个资源处理,然后将该资源的内容返回给客户端。而重定向则是服务端向客户端发送一个指示,要求客户端重新发起一个新的请求,以获取其所需的资源或信息。

  2. 请求方不同:在转发中,原始请求者和目标资源享有同一会话;而在重定向中,由于客户端重新发起请求,会话可能会发生变化。

  3. 数据共享:转发允许原始请求的参数、数据等被一同传递到目标资源,这意味着目标资源可以访问和处理这些数据;而重定向则不会,因为数据是在新的请求中发送的

  4. URL地址:转发操作后,显示的URL与实际访问的资源URL相同;相反,重定向操作会导致浏览器地址栏中的URL发生改变,显示的是重定向后的URL。

  5. 实现方式:在Servlet/JSP中,可以使用request.getRequestDispatcher()方法实现请求转发。而重定向可以通过多种方式实现,例如使用response.sendRedirect()方法。

预估tps:

找运维拿过去的数据,若没有,就参考同类产品的数据,

比如:按去年的经营数据,2022年最高的一天有10万笔交易。预测2023年TPS需要多少合格?

总事务数=10万,时间=246060=86400秒

理论上TPS =100000/86400=1.2
(1)没有更详细的数据: 根据二八定律(80%的事务在20%的时间完成)计算:

TPS =100000X0.8/86400X0.2=80000/17280=4.6

(2)如果有更详细的数据: 5万笔交易是晚上的8-9点完成的
TPS=50000/3600=13.9

业务的增长: 30%
TPS=50000+50000*0.3/3600=18

tps,rps,qps,hps区别

衡量服务器端性能:tps(每秒事务数),rps(每秒请求数),qps(每秒查询数,一般是数据库)

客户端的性能:hps(每秒点击数)

当一个事务中只有一个接口,tps=rps

当一个事务中只有一个接口,且是查询的接口,tps=rps=qps

吞吐量:每秒里两种不同介质之间传输的数量,byte/s

当一个事务中只有一个接口,tps=吞吐量

urlencode: %3D->=

%3A->:

%2F->/

性能指标

TPS 是由 RPS 、网络延迟 、服务端本身的处理速度 这3个因素决定的

EPS (error per second) 是 服务端 每秒处理出错的数量,也包含在TPS中

TOPS (timeout per second) 是 服务端 每秒处理超时的数量

超时时间具体是多少,应该由产品需求定义

总RPS = 客户端1 RPS * 客户端1数量 + 客户端2 RPS * 客户端2数量 + …

并发连接数 是 服务端 和客户端 建立的 TCP连接的数量

并发用户数 是 服务端 同时服务的 用户的数量

用户的一个操作可能引发多个并发连接

Linux下 可以通过 如下命令 查看并发连接的数量

netstat -an | grep ESTABLISHED | grep -w 80 | wc -l

处理cookie的几种方式

1.直接在请求中传递cookies参数
import requests

host = ‘http://119.91.144.93:82'
api = r’/ecshop/user.php’
url = host + api

data = {‘username’:’wangke’,’password’:’123456’,’act’:’act_login’,’back_act’:’./index.php’,’submit’:None}
res = requests.request(‘POST’,url=url,data=data) #登录
cookies = res.cookies #获取登录cookies
data1 = {‘msg_type’:0,’msg_title’:’aaaaaaa’,’msg_content’:’1111111111’,’act’:’act_add_message’}
r = requests.request(‘POST’,url=url,data=data1,cookies=cookies) #发表留言,直接将获取的登录cookies添加到请求中
结果:发表留言成功

2.将获取的登录cookie添加到headers中
import requests

host = ‘http://119.91.144.93:82'
api = r’/ecshop/user.php’
url = host + api

data = {‘username’:’wangke’,’password’:’123456’,’act’:’act_login’,’back_act’:’./index.php’,’submit’:None}
res = requests.request(‘POST’,url=url,data=data) #登录
cookies = res.cookies #获取登录cookies

cookies_str = ‘’ #将获取的登录cookies拼接为字符串
for k,v in cookies.items():
cookies_str += f’{k}={v};’ #key=value;的方式拼接
headers = {‘cookie’:cookies_str} #组装headers

data1 = {‘msg_type’:0,’msg_title’:’bbbbb’,’msg_content’:’22222’,’act’:’act_add_message’}
r = requests.request(‘POST’,url=url,data=data1,headers=headers) #发送留言请求
结果:发表留言成功

3.通过RequestsCookieJar构造cookies
import requests

host = ‘http://119.91.144.93:82'
api = r’/ecshop/user.php’
url = host + api

data = {‘username’:’wangke’,’password’:’123456’,’act’:’act_login’,’back_act’:’./index.php’,’submit’:None}
res = requests.request(‘POST’,url=url,data=data) #登录
cookies = res.cookies #获取登录cookies

jar = requests.cookies.RequestsCookieJar() #创建RequestsCookieJar对象
for k,v in cookies.items():
jar.set(k,v) #通过RequestsCookieJar对象构造cookies

data1 = {‘msg_type’:0,’msg_title’:’cccccc’,’msg_content’:’33333’,’act’:’act_add_message’}
r = requests.request(‘POST’,url=url,data=data1,cookies=jar) #发送留言请求
结果:发表留言成功

4.通过session会话处理
import requests

host = ‘http://119.91.144.93:82'
api = r’/ecshop/user.php’
url = host + api

s = requests.session() #创建会话s
data = {‘username’:’wangke’,’password’:’123456’,’act’:’act_login’,’back_act’:’./index.php’,’submit’:None}
res = s.request(‘POST’,url=url,data=data) #通过会话发送登录请求

data1 = {‘msg_type’:0,’msg_title’:’dddddd’,’msg_content’:’44444’,’act’:’act_add_message’}
r = s.request(‘POST’,url=url,data=data1) #通过会话发送留言请求,不需要处理cookie,自动关联
结果:发表留言成功

http协议

HTTP 有好几个版本,包括: 0.91.01.123 ,当前最广泛使用的是 HTTP/1.1 版本。

HTTP 协议最大的特点是 通讯双方 分为 客户端服务端

HTTP3 以前版本 (除了HTTP3) , 都是 基于 TCP 协议的, 所以要进行通讯,客户端 必须先 和服务端 创建 TCP 连接。


文章作者: 读序
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 读序 !
  目录