基础(测试用例设计方法:流程图法,等价类划分法,边界值分析法,判定表法,正交分析法,错误推测法,其他方法,案例)
目录
流程图法(场景法)
业务流程
流程图
流程图法设计测试用例
案例-退款泳道图
案例-刷视频流程
等价类划分法
等价类
等价类设计测试用例
案例1-验证电话号码
案例2-验证邮箱格式
边界值分析法
测试数据的选取
边界值法设计测试用例
案例-验证标题的合法性
判定表法
判定表
判定表设计测试用例
案例1-文件修改规则
案例2-维修处理规则
正交分析法
正交表
正交表设计测试用例
正交工具的使用(allpairs)
正交工具的安装和使用(正交设计助手)
正交设计助手-安装
正交设计助手-使用
错误推测法
其他方法(如:因果图法)
用例测试方法总结
案例1-保险保费
案例2-购物车页面
案例3-登录页面
流程图法(场景法)
流程图法:通过流程图可以用来表示一个具体的业务流程场景,可以通过覆盖流程图的路径来设计测试用例。
流程图法的适用场景:在业务场景中涉及多功能的组合逻辑。
业务流程
业务流程:客户使用软件的过程中,为了达成自身的所想要的目的,按照指定的顺序去操作软件的功能,这样的操作过程叫业务流程。
业务流程的来源:一般产品经理提供的需求文档中会有说明和绘制。在特殊情况下,测试人员也可以自己分析软件的业务流程和绘制流程图。
业务流程的测试方法:通过借助流程图来进行业务流程分析和测试。
注意:注册/登录这种会作为单模块,而不是业务流程。
流程图
流程图:可用来表示一个具体的业务流程场景,通过覆盖流程图的路径来设计测试用例。
流程图中的重要符号说明:
符号 | 名称 | 解释 |
开始/结束 | 表示整个流程的开始/结束 | |
路径 | 表示流程进行的方向 | |
执行/处理节点 | 表示执行或处理某工作 | |
判定节点 | 表示对某个条件做判断 |
流程图示例:
流程图法设计测试用例
用流程图法设计测试用例-步骤:
- 根据流程图找出所有路径(从开始到结束为一条路径,路径数=判定节点数+1)
注意:还要看看有没有回溯的路径,如果有1条回溯,路径数=判定节点数+1+1
- 根据路径编写测试用例(有多少条路径就有多少条测试用例)
注意:什么是回溯路径?如下图,红框圈起来的就是回溯路径
注意:使用流程图法测试业务场景的过程中,不需要深入功能内部详细测试,关注点在于所有的流程环节是否能够验证通过。
示例:
业务场景:餐饮行业的结账业务流程。
流程图中的路径数:4=1+3,一共对应4条测试用例
编写测试用例:
用例编号 | 用例标题 | 模块 | 优先级 | 前置条件 | 测试步骤 | 测试数据 | 预期结果 |
结账系统-SA-001 | 结账-支付成功 | 结账 | P0 | 选择桌台成功 |
|
| 支付成功,打印支付小票 |
结账系统-SA-002 | 结账-登录失败 | 结账 | P1 | 进入登录页面 | 输入登录信息 | 登录信息:xxxxxx | 登录失败 |
结账系统-SA-003 | 结账-选择桌台失败 | 结账 | P1 | 登录成功 | 输入桌台编号或扫码 | 输入桌台编号:xx | 选择桌台失败,提示:请选择坐台 |
结账系统-SA-004 | 结账-支付失败 | 结账 | P1 | 选择桌台成功 |
|
输入支付金额:xxxx | 支付失败,提示:支付失败,请重试 |
案例-退款泳道图
根据下面的退款泳道图,编写测试用例
流程图中所有路径:4+1=5,一共5条路径
5条路径对应5条测试用例,如下:
用例编号 | 用例标题 | 模块 | 优先级 | 前置条件 | 测试步骤 | 测试数据 | 预期结果 |
refund_001 | 全额退款成功-商家退款 | 退款 | P0 | 用户登录平台 |
| 用户名:xxxxx 登录密码:xxxxxx | 用户账户到账全款 |
refund_002 | 退款失败-用户确认售后 | 退款 | P1 | 用户登录平台 |
| 用户名:xxxxx 登录密码:xxxxxx | 售后完成 |
refund_003 | 退款成功-平台全额退款 | 退款 | P0 | 用户登录平台 |
| 用户名:xxxxx 登录密码:xxxxxx | 用户账户到账全款 |
refund_004 | 退款成功-平台部分退款 | 退款 | P0 | 用户登录平台 |
| 用户名:xxxxx 登录密码:xxxxxx | 用户账户到账部分退款 |
refund_005 | 退款失败-平台拒绝退款 | 退款 | P1 | 用户登录平台 |
| 用户名:xxxxx 登录密码:xxxxxx | 退款失败 |
案例-刷视频流程
一共有4个判定节点,路径数=4+1=5
思维导图分析测试点
5条路径对应5条测试用例,测试用例如下:
用例编号 | 用例标题 | 模块 | 优先级 | 前置条件 | 测试步骤 | 测试数据 | 预期结果 |
video_001 | 用户对视频不敢兴趣 | 刷视频 | P1 | 用户登录平台 |
| 播放下一条视频 | |
video_002 | 用户对视频不进行转发 | 刷视频 | P1 | 用户登录平台 |
| 该视频循环播放 | |
video_003 | 用户对视频进行转发 | 刷视频 | P0 | 用户登录平台 |
| 提示:分享成功; 好友聊天记录可以看见分享视频 | |
video_004 | 用户对视频进行评论 | 刷视频 | P0 | 用户登录平台 |
| 评论区出现用户评论的信息; 评论数+1 | |
video_005 | 用户对视频进行点赞 | 刷视频 | P0 | 用户登录平台 |
| 视频右边,大拇指变红; 点赞数+1 |
等价类划分法
等价类划分法:对测试数据进行合理划分,从而选择有代表性的数据进行测试。
等价类划分法的应用场景:用来解决测试数据集合过大的问题,我们无法将测试数据进行穷举的情况,这时候,我们就可以对测试数据进行合理分类。如:输入框,下拉列表,单选复选框。
等价类
等价类:在所有测试数据中,具有某种共同特征的数据集合。
等价类分类:
- 有效等价类:满足需求的数据集合。
- 无效等价类:不满足需求的数据集合。
等价类的特点:
- 划分出来的有效和无效等价类是没有交集
- 所有的有效和无效等价类完整的构成了测试数据集合
等价类划分案例:
需求:在手机验证码输入框中,可输入长度为4位的数字
有效等价类:4位数字
无效等价类:4位非数字、大于4位数字、小于4位数字
等价类设计测试用例
使用等价类完成测试用例的设计步骤:
- 分析需求,找出所有的输入条件
- 根据输入条件划分等价类,绘制等价类表
- 设计测试用例:根据等价类表转换测试用例;设计一个新的测试用例,要尽可能多的覆盖尚未被覆盖的有效等价类;针对每一个无效等价类都要设计一条测试用例进行覆盖。
等价类表:
输入条件 | 有效等价类 | 测试数据 | 编号 | 无效等价类 | 测试数据 | 编号 |
等价类的划分-可以根据3个维度划分:
- 长度(空)
- 类型
- 规则
注意:针对空这种情况要单独划分一个等价类
案例:
需求:验证qq账号的合法性(账号要求:6~10位自然数)
1.输入条件:qq账号
2.等价类表
输入条件 | 有效等价类 | 测试数据 | 编号 | 无效等价类 | 测试数据 | 编号 |
qq账号 | 6~10位自然数 | 12345678 | 1 | 大于10位自然数 | 01234567890 | 2 |
小于6位自然数 | 12 | 3 | ||||
空 | 空 | 4 | ||||
6~10位非自然数 | abdk%(* | 5 |
3.转换为测试用例
用例编号 | 用例标题 | 模块 | 优先级 | 前置条件 | 测试步骤 | 测试数据 | 预期结果 |
qq_001 | 验证qq账号合法-6~10位自然数 | qq账号 | P2 | 进入qq账号验证页 | 输入qq账号 | 123456 | 验证通过 |
qq_002 | 验证qq账号非法-大于10位自然数 | qq账号 | P3 | 进入qq账号验证页 | 输入qq账号 | 01234567890 | 验证失败,提示qq账号不合法 |
qq_003 | 验证qq账号非法-小于6位自然数 | qq账号 | P3 | 进入qq账号验证页 | 输入qq账号 | 01234 | 验证失败,提示qq账号不合法 |
qq_004 | 验证qq账号非法-为空 | qq账号 | P3 | 进入qq账号验证页 | 不输入qq账号 | 空 | 验证失败,提示qq账号不合法 |
qq_005 | 验证qq账号非法-6~10非自然数 | qq账号 | P3 | 进入qq账号验证页 | 输入qq账号 | abdk%(* | 验证失败,提示qq账号不合法 |
案例1-验证电话号码
需求:
验证某城市电话号码的正确性
区号:空或者三位数字
电话:七位数字
输入条件:
- 区号
- 电话
等价类表
输入条件 | 有效等价类 | 测试数据 | 编号 | 无效等价类 | 测试数据 | 编号 |
区号 | 三位数字 | 010 | 1 | 大于3位数字 | 01234 | 3 |
小于3位数字 | 01 | 4 | ||||
空 | 空 | 2 | 3位非数字 | L%$ | 5 | |
电话 | 7位数字 | 1234567 | 6 | 大于7位数字 | 12345678 | 7 |
小于7位数字 | 12345 | 8 | ||||
空 | 空 | 9 | ||||
7位非数字 | ¥ghnow^ | 10 |
转换为测试用例
用例编号 | 用例标题 | 模块 | 优先级 | 前置条件 | 测试步骤 | 测试数据 | 预期结果 |
tel_001 | 验证电话号码合法-区号3位数字+电话7位数字 | 电话号码 | P2 | 进入电话号码验证页 |
| 区号:010 电话:1234567 | 电话号码验证通过 |
tel_002 | 验证电话号码合法-区号为空+电话7位数字 | 电话号码 | P2 | 进入电话号码验证页 |
| 区号:空 电话:1234567 | 电话号码验证通过 |
tel_003 | 验证电话号码非法-区号大于3位+电话7位数字 | 电话号码 | P3 | 进入电话号码验证页 |
| 区号:01234 电话:1234567 | 电话号码验证失败,提示:号码非法 |
tel_004 | 验证电话号码非法-区号小于3位+电话7位数字 | 电话号码 | P3 | 进入电话号码验证页 |
| 区号:01 电话:1234567 | 电话号码验证失败,提示:号码非法 |
tel_005 | 验证电话号码非法-区号为3位非数字+电话7位数字 | 电话号码 | P3 | 进入电话号码验证页 |
| 区号:&*J 电话:1234567 | 电话号码验证失败,提示:号码非法 |
tel_006 | 验证电话号码非法-区号为3位+电话大于7位数字 | 电话号码 | P3 | 进入电话号码验证页 |
| 区号:010 电话:12345678 | 电话号码验证失败,提示:号码非法 |
tel_007 | 验证电话号码非法-区号为空+电话小于7位数字 | 电话号码 | P3 | 进入电话号码验证页 |
| 区号:010 电话:123456 | 电话号码验证失败,提示:号码非法 |
tel_008 | 验证电话号码非法-区号为空+电话为空 | 电话号码 | P3 | 进入电话号码验证页 |
| 区号:010 电话:空 | 电话号码验证失败,提示:号码非法 |
tel_009 | 验证电话号码非法-区号为空+电话7位非数字 | 电话号码 | P3 | 进入电话号码验证页 |
| 区号:010 电话:Jhuidh* | 电话号码验证失败,提示:号码非法 |
注意:tel_001测试用例覆盖了编号为1和6的等价类
案例2-验证邮箱格式
需求:邮箱的验证
- 6~18位字符
- 包含数字,字母和下划线
- 必须以字母开头
注意:下面使用了等价类划分法,未使用边界值分析法
输入条件:邮箱
等价类表
输入条件 | 有效等价类 | 测试数据 | 编号 | 无效等价类 | 测试数据 | 编号 |
邮箱 | 6~18位字符,包含数字,字母,下划线,必须以字母开头 | 7位合法数据:hyh_1226 | 1 | 长度大于18位 | 19位: hyh_012345678901234 | 2 |
长度小于6位 | 5位:hyh_01 | 3 | ||||
空 | 空 | 4 | ||||
包含非数字,字母,下划线 | %** | 5 | ||||
以数字开头 | 1226_hyh | 6 | ||||
以下划线 | _hyh1226 | 7 |
转换为测试用例
用例编号 | 用例标题 | 模块 | 优先级 | 前置条件 | 测试步骤 | 测试数据 | 预期结果 |
mail_001 | 验证邮箱合法-6~18位字符,包含数字,字母,下划线,必须以字母开头 | 邮箱 | P2 | 进入邮箱验证页 |
| 7位合法数据:hyh_1226 | 邮箱验证通过 |
mail_002 | 验证邮箱非法-长度大于18位 | 邮箱 | P3 | 进入邮箱验证页 |
| 19位: hyh_012345678901234 | 邮箱验证不通过,提示:邮箱非法 |
mail_003 | 验证邮箱非法-长度小于6位 | 邮箱 | P3 | 进入邮箱验证页 |
| 5位:hyh_01 | 邮箱验证不通过,提示:邮箱非法 |
mail_004 | 验证邮箱非法-空 | 邮箱 | P3 | 进入邮箱验证页 |
| 空 | 邮箱验证不通过,提示:邮箱非法 |
mail_005 | 验证邮箱非法-包含非数字,字母,下划线 | 邮箱 | P3 | 进入邮箱验证页 |
| %** | 邮箱验证不通过,提示:邮箱非法 |
mail_006 | 验证邮箱非法-以数字开头 | 邮箱 | P3 | 进入邮箱验证页 |
| 1226_hyh | 邮箱验证不通过,提示:邮箱非法 |
mail_007 | 验证邮箱非法-以下划线开头 | 邮箱 | P3 | 进入邮箱验证页 |
| _hyh1226 | 邮箱验证不通过,提示:邮箱非法 |
边界值分析法
边界值分析法是对等价类划分的一种补充。
边界值分析法:就是对输入或输出的边界值进行测试,边界值分析法可以优化测试数据的选择。
边界值分析法的使用场景:
- 是在等价类的基础上针对有边界范围的测试数据输入的地方(重点关注边界)的上应用的方法,用于测试数据的选取
- 常见的词汇:大小,尺寸,重量,最小,最小,至多,至少等修饰词
- 典型代表:有边界值范围的输入框类测试
测试数据的选取
测试数据的选取(一共5个点):
- 上点:边界上的点(正好等于边界)-2个点
- 离点:距离上点最近的点(刚好大于边界,刚好小于边界)-2个点
注意:遵循开内闭外原则(开区间选择内部离点,闭区间选择外部离点)
- 内点:范围内的点(区间范围内的数据)-1个点
注意:紫色为上点,绿色为离点,黄色为内点
边界值法设计测试用例
边界值法设计测试用例步骤:
- 明确需求,找出所有的输入条件
- 依据输入条件,确定有效和无效等价类,绘制等价类表
- 确定边界值范围,选取测试数据
- 根据等价类表转换测试用例;设计一个新的测试用例,要尽可能多的覆盖尚未被覆盖的有效等价类;针对每一个无效等价类都要设计一条测试用例进行覆盖。
案例:
需求:验证qq账号的合法性(账号要求:6~10位自然数)
输入条件:qq账号
等价类表
输入条件 | 有效等价类 | 测试数据 | 编号 | 无效等价类 | 测试数据 | 编号 |
qq账号 | 6~10位自然数 | 6位自然数(上点) 10位自然数(上点)8位自然数(内点) | 1 | 大于10位自然数 | 11位自然数(离点) | 2 |
小于6位自然数 | 5位自然数(离点) | 3 | ||||
空 | 空 | 4 | ||||
6~10位非自然数 | abdk%&** | 5 |
转换为测试用例
用例编号 | 用例标题 | 模块 | 优先级 | 前置条件 | 测试步骤 | 测试数据 | 预期结果 |
qq_001 | 验证qq账号合法-6~10位自然数 | qq账号 | P2 | 进入qq账号验证页 | 输入qq账号 | 123456 1234567890 12345678 | 验证通过 |
qq_002 | 验证qq账号非法-大于10位自然数 | qq账号 | P3 | 进入qq账号验证页 | 输入qq账号 | 12345678900 | 验证失败,提示qq账号不合法 |
qq_003 | 验证qq账号非法-小于6位自然数 | qq账号 | P3 | 进入qq账号验证页 | 输入qq账号 | 12345 | 验证失败,提示qq账号不合法 |
qq_004 | 验证qq账号非法-为空 | qq账号 | P3 | 进入qq账号验证页 | 不输入qq账号 | 空 | 验证失败,提示qq账号不合法 |
qq_005 | 验证qq账号非法-6~10非自然数 | qq账号 | P3 | 进入qq账号验证页 | 输入qq账号 | abdk%&** | 验证失败,提示qq账号不合法 |
案例-验证标题的合法性
需求:验证标题的合法性
标题长度大于3,小于等于10个字符
输入条件:标题
输入条件 | 有效等价类 | 测试数据 | 编号 | 无效等价类 | 测试数据 | 编号 |
标题 | (3,10]个字符 | 10个字符(上点) 4个字符(离点) 7个字符(内点) | 1 | 大于10个字符 | 11个字符(离点) | 2 |
小于等于3个字符 | 3个字符(上点) | 3 | ||||
空 | 空 | 4 |
转换为测试用例
用例编号 | 用例标题 | 模块 | 优先级 | 前置条件 | 测试步骤 | 测试数据 | 预期结果 |
title_001 | 验证标题合法-(3,10]个字符 | 标题 | P2 | 进入标题验证页面 |
| 1234567890 1234 1234567 | 验证通过 |
title_002 | 验证标题非法-大于10个字符 | 标题 | P3 | 进入标题验证页面 |
| 12345678900 | 验证不通过,提示标题非法 |
title_003 | 验证标题非法-小于等于3个字符 | 标题 | P3 | 进入标题验证页面 |
| 123 | 验证不通过,提示标题非法 |
title_004 | 验证标题非法-为空 | 标题 | P3 | 进入标题验证页面 |
| 空 | 验证不通过,提示标题非法 |
判定表法
等价类法和边界值分析法的局限性:只关注于单个输入条件的测试,未考虑输入条件之间的组合关系。
判定表法:是一种以表格形式表达多条件逻辑判定的方法。
判定表的应用场景:有多个输入条件,多个输出结果,输入条件之间有组合关系,输入条件和输出结果之间有依赖(制约)关系。
判定表
判定表的作用:可以通过判定表将条件的所有组合对应的结果都分析到,以防止遗漏的情况。
判定表的适用情况:适用于条件组合数量比较少的情况(如:4个条件以下,条件太多,会造成判定表非常庞大,会有一定出现错误的几率)
判定表的组成:
- 条件桩:列出问题中的所有条件,列出条件的次序无关紧要
- 动作桩:列出问题中可能采取的操作,操作的排列顺序没有约束
- 条件项:列出条件对应的取值,所有可能情况下的真假值
- 动作项:列出条件项的、各种取值情况下应该采取的动作结果
注意:
- 判定表中贯穿条件项和动作项的一列就是一个组合,一个组合对应条测试用例
- 假设有n个条件,每个条件的取值有两个(即:真和假),那么全组合有2n种组合
判定表设计测试用例
判定表法设计测试用例步骤:
- 明确需求,找出条件和动作
- 绘制判定表
- 列出条件桩和动作桩
- 填写条件项,对条件进行全组合
- 根据条件项的组合确定动作项
- 简化判定表:动作一样的情况下,合并相似的组合
- 编写测试用例(每个组合就是一条测试用例)
示例:
需求:订购单检查
1)如果金额大于500元,又未过期,则发出批准单和提货单;
2)如果金额大于500元,但过期了,则不发批准单与提货单;
3)如果金额小于等于500元,则不论是否过期都发出批准单和提货单;
4)在过期的情况下不论金额大小还需要发出通知单
条件2个:金额是否大于500,订单是否过期
动作3个:发出批准单,发出提货单,发出通知单
判定表(一共有2个条件,条件的取值有2个(Y/N),组合数:22=4)
条件桩 | 金额是否大于500 | Y | Y | N | N |
订单是否过期 | Y | N | Y | N | |
动作桩 | 批准单 | P | P | P | |
提货单 | P | P | P | ||
通知单 | P | P |
优化判定表(动作一样的情况下,合并相似的组合),简化后,一共有3种组合
条件桩 | 金额是否大于500 | Y | Y/N | N |
订单是否过期 | Y | N | Y | |
动作桩 | 批准单 | P | P | |
提货单 | P | P | ||
通知单 | P | P |
一共有3种组合,对应3条测试用例
用例编号 | 用例标题 | 模块 | 优先级 | 前置条件 | 测试步骤 | 测试数据 | 预期结果 |
order_001 | 发出通知单-金额大于500且订单过期 | 订购单 | P2 | 打开订购单检查页 |
| 金额:501 状态:过期 | 发出通知单 |
order_002 | 发出批准单和提货单-订单未过期 | 订购单 | P2 | 打开订购单检查页 |
| 状态:未过期 | 发出批准单和提货单 |
order_003 | 发出批准单和提货单,通知单-金额小于等于500且订单过期 | 订购单 | P2 | 打开订购单检查页 |
| 金额:500 状态:过期 | 发出批准单和提货单,通知单 |
案例1-文件修改规则
文件修改规则:
- 输入的第一列字符必须是A或B,第二列字符必须是一个数字
- 如果第一列字符不正确,则给出信息L
- 如果第二列字符不正确,则给出信息M
- 如果两列字符输入正确,则修改文件成功
条件2个:第一列的字符是否是A或B,第二列的字符是否是一个数字
动作3个:给出信息L,给出信息M,修改文件成功
判定表(一共有2个条件,条件的取值有2个(Y/N),组合数:22=4)
条件桩 | 第一列的字符是否是A或B | Y | Y | N | N |
第二列的字符是否是一个数字 | Y | N | Y | N | |
动作桩 | 给出信息L | P | P | ||
给出信息M | P | P | |||
修改文件成功 | P |
该判定表已经是最简了(因为动作组合都不同,无法合并)
一共有4种组合,对应4条测试用例
用例编号 | 用例标题 | 模块 | 优先级 | 前置条件 | 测试步骤 | 测试数据 | 预期结果 |
file_001 | 修改文件成功-第一列字符为A或B且第二列字符为数字 | 文件修改 | P2 | 打开文件修改程序 |
| 第一列:A第二列:2 | 文件修改成功 |
file_001 | 修改文件失败-第一列字符为A或B且第二列字符为非数字 | 文件修改 | P3 | 打开文件修改程序 |
| 第一列:A第二列:* | 文件修改失败,提示信息M |
file_001 | 修改文件失败-第一列字符不是A或B且第二列字符为数字 | 文件修改 | P3 | 打开文件修改程序 |
| 第一列:C第二列:2 | 文件修改失败,提示信息L |
file_001 | 修改文件失败-第一列字符不是A或B且第二列字符为非数字 | 文件修改 | P3 | 打开文件修改程序 |
| 第一列:C第二列:& | 文件修改失败,提示信息M和信息L |
案例2-维修处理规则
维修处理规则:
- 已运行10年以上应给予优先的维修处理
- 维修记录不全并且功率大于50马力优先处理。
- 不满足上述两条描述的给予常规维修处理
条件3个:是否运行10年以上,维修记录是否不全,是否功率大于50马力
动作2个:优先维修处理,常规维修处理
判定表(一共3个条件,条件有2种取值(Y/N),组合数=23=8)
条件桩 | 是否运行10年以上 | Y | Y | Y | Y | N | N | N | N |
维修记录是否不全 | Y | Y | N | N | Y | Y | N | N | |
功率是否大于50马力 | Y | N | Y | N | Y | N | Y | N | |
动作桩 | 优先维修处理 | P | P | P | P | P | |||
常规维修处理 | P | P | P |
合并相似组合
条件桩 | 是否运行10年以上 | Y | N | N | N |
维修记录是否不全 | Y/N | Y | Y | N | |
功率是否大于50马力 | Y/N | Y | N | Y/N | |
动作桩 | 优先维修处理 | P | P | ||
常规维修处理 | P | P |
测试用例省略...
正交分析法
正交分析法:通过正交表选择部分有代表性的组合进行测试,从而降低测试成本。
正交分析法应用场景:输入条件比较多,对应的组合情况比较庞大。
正交表
因素:输入条件(类似于条件桩)
因素数:输入条件的个数
水平:输入条件的取值(比如:真/假,1或2等)
水平数:条件取值的个数
正交表的表示:
注意:
- N(正交表的行数):指的是正交表有多少行,每一行就对应一种组合情况,有几行就对应几个测试用例。
- S(正交表的列数):指的是正交表有多少列,即指的是输入条件的个数,每一列就对应一个条件。
- q(条件的取值个数)
如下面表示的正交表:
是一个3因素2水平的正交表(3个条件,条件的取值是2个),一共有4种组合情况。
正交表绘制如下:
正交表设计测试用例
正交表设计测试用例的步骤:
- 分析需求,确定因素(条件)和水平(条件取值)
- 选择合适的正交表进行问题的映射
常用的正交表:support.sas.com/techsup/technote/ts723_Designs.txt或常用正交表(可直接复制)以及混合正交表的使用-CSDN博客
- 根据正交表设计测试用例,正交表的一行对应一条测试用例
- 根据需求补充测试用例,看看有没有遗漏常用的组合情况
示例如下:
需求:车票查询
因素(条件)3个:出发地,目的地,出发日期
水平(条件取值)2个:填写和不填写
选择如下正交表进行问题的映射
正交表的列名用因素替换(出发地,目的地,出发日期)
正交表的每一列的取值用水平取值替换(填写和不填写)
替换后,如下:
实验号 | 列 | ||
出发地 | 目的地 | 出发日期 | |
1 | 填写 | 填写 | 填写 |
2 | 填写 | 不填写 | 不填写 |
3 | 不填写 | 填写 | 不填写 |
4 | 不填写 | 不填写 | 填写 |
转换测试用例省略(正交表的一行对应一条测试用例)
正交工具的使用(allpairs)
allpairs工具可以帮助我们更快速的生成正交表的结果。
allpairs工具的使用:
- 在excel表格中录入因素和水平
- 新建txt文件,将表格中的内容复制到xxx.txt文件
- 将txt文件放到allpairs文件夹下
- 打开dos命令窗口,切换到allpairs文件夹,输入:allpairs.exe xxx.txt>case.txt
使用allpairs完成如下案例正交表的设计:
需求:车票查询
在excel表格中录入因素和水平
在allpairs文件夹下,新建txt文件:test.txt,然后将表格中的内容复制到该文件中
打开dos命令窗口,切换到allpairs文件夹,输入:allpairs.exe test.txt>case.txt
生成的case.txt文件中,即是生成正交表
正交工具的安装和使用(正交设计助手)
正交设计助手-安装
双击exe文件
点击下一步
点击【浏览】,更改软件安装路径
点击下一步
点击下一步
点击完成
正交设计助手-使用
使用正交设计助手完成如下案例正交表的设计:
需求:车票查询
打开正交设计助手
点击【文件】>【新建工程】
点击【未命名工程】>右键>【修改工程】>修改工程名为Test>点击OK
选中Test>点击【实验】>【新建实验】
【实验说明】
【实验名称】填写:
设计正交表>车票查询-搜索条件
【简要描述】填写:
搜索条件:出发地,目的地,出发日期
出发地(填写,不填写)
目的地(填写,不填写)
出发日期(填写,不填写)
点击【选择正交表】
选择3因素2水平的正交表
点击【因素与水平】
填写表格如下:
点击确定
发现正交表已经设计完成,如下:
3因素2水平的正交表,一共有4种组合形式,对应4条测试用例
注意:如果要保存结果,记住要保存项目(正交设计助手不会提醒你保存)
错误推测法
错误推测法:根据测试工程师的经验推测系统可能出现的问题,是作为测试用例的一种补充手段。
错误推测法的应用场景:
- 时间紧任务量大时,根据之前项目类似经验找出易出错的模块重点测试
- 时间宽裕通过该方法,列出之前出现问题较多的模块再次测试
错误推测法的使用:根据经验列举出可能出现问题的清单,根据清单分析问题可能原因, 推测发现缺陷。
其他方法(如:因果图法)
因果图法
参考:
因果图法-CSDN博客
完美诠释因果图与判定表法 - 知乎 (zhihu.com)
因果图法:因果图是用图解的方法表示输入的各种组合关系,依据因果图写出判定表,从而设计相应的测试用例。
因果图法应用场景:有多个输入条件,多个输出结果,输入条件之间有组合关系,输入条件和输出结果之间有依赖(制约)关系。(是判定表法的前置处理方法,适用场景和判定表的场景一致)
用例测试方法总结
用例设计方法总结:
- 流程图法:业务场景测试
- 等价类:针对穷举测试
- 边界值:针对边界测试
- 因果图:针对条件约束,多条件组合测试(是判定表法的前置处理方法)
- 判定表:针对条件约束,多条件组合测试
- 正交法:针对多条件组合测试
- 错误推测法:根据经验对可能错误测试
案例1-保险保费
某保险公司的人寿保险保费计算方式为:投保额*保险费
保险费率依点数不同而有别,10点及10点以上保险费率为0.6%,10点以下保险费率为0.1%;点数是由投保人的年龄、性别、婚姻状况和抚养人数来决定(点数相加),具体规则如下:
待解决...
案例2-购物车页面
画出思维导图,对测试点进行梳理
案例3-登录页面
画出思维导图,梳理测试点
测试用例如下:
相关文章:
基础(测试用例设计方法:流程图法,等价类划分法,边界值分析法,判定表法,正交分析法,错误推测法,其他方法,案例)
目录 流程图法(场景法) 业务流程 流程图 流程图法设计测试用例 案例-退款泳道图 案例-刷视频流程 等价类划分法 等价类 等价类设计测试用例 案例1-验证电话号码 案例2-验证邮箱格式 边界值分析法 测试数据的选取 边界值法设计测试用例 案例…...
QT —— 信号和槽(槽函数)
QT —— 信号和槽 信号和槽信号(Signal)槽(Slot)声明方式工作原理连接方式1. 传统连接方式(Qt4风格)2. 新式连接方式(Qt5风格) 区分槽函数和信号通过QtCreator生成信号槽代码自动生成槽函数显式连接的优势命名约定自动连接的局限性最佳实践建议结论 我们之前对QT,有…...
ROS2模块库概览
一、核心通信与基础库(最常用) 客户端库 rclcpp (ROS Client Library for C) 核心API:create_node(), create_publisher(), create_subscription()高级特性: 生命周期节点:通过rclcpp_lifecycle实现configure/activate…...
HADOOP——序列化
1.创建一个data目录在主目录下,并且在data目录下新建log.txt文件 2.新建flow软件包,在example软件包下 FlowBean package com.example.flow;import org.apache.hadoop.io.Writable;import java.io.DataInput; import java.io.DataOutput; import java.i…...
第五章 5.2ESP32物联网应用:HTTP与Web服务器详细教学
本文将详细讲解如何在ESP32上搭建Web服务器,通过HTTP协议实现远程控制LED灯。每行代码均有详细注释,适合零基础学习。 一、HTTP协议基础 HTTP是客户端(浏览器)和服务器之间的通信协议,常用请求方法: GET&a…...
c++11 绑定器bind
文章目录 std::bind 使用总结(C11)1. 绑定普通函数2. 使用占位符 _1, _2,调用时传参数3. 绑定类的成员函数(类外)4. 绑定类的成员函数(类内)5. 占位符结合成员函数小结 std::bind 使用总结&…...
实现时间最优轨迹生成/轨迹规划方法(TOTG),不使用moveit,可用于ROS驱动机械臂FollowJointTrajectoryGoal()
前言 在我的这篇文章:https://blog.csdn.net/weixin_45702459/article/details/139293391?spm1011.2415.3001.5331中,写了不使用moveit来ros驱动机械臂的方法,也就是用FollowJointTrajectoryGoal()来进行一系列点的关节运动,其实…...
2025年推荐使用的开源大语言模型top20:核心特性、选择指标和开源优势
李升伟 编译 随着人工智能技术的持续发展,开源大型语言模型(LLMs)正变得愈发强大,使最先进的AI能力得以普及。到2025年,开源生态系统中涌现出多个关键模型,它们在各类应用场景中展现出独特优势。 大型语言…...
高并发多级缓存架构实现思路
目录 1.整体架构 3.安装环境 1.1 使用docket安装redis 1.2 配置redis缓存链接: 1.3 使用redisTemplate实现 1.4 缓存注解优化 1.4.1 常用缓存注解简绍 1.4.2 EnableCaching注解的使用 1.4.3使用Cacheable 1.4.4CachePut注解的使用 1.4.5 优化 2.安装Ngin…...
Qt 的 事件队列
Qt 的 事件队列 是其核心事件处理机制之一,用于管理和分发系统与用户生成的事件(如鼠标点击、键盘输入、定时器、信号槽中的队列连接等)。理解 Qt 的事件队列对多线程、界面响应以及异步处理尤为关键。 一、Qt 的事件处理模型概览 Qt 是基于…...
html-css样式
1. 所有类型为文本的 元素的样式 指定所有类型为文本的 元素的样式 /* 文本框的样式 */ input[type"text"] { font-size: 25px;width: 80px; /* 文本框的宽度 */ padding: 25px; } font-size:字体大小 width:文本框宽度 padding&#…...
Qemu-STM32(十五):STM32F103加入Flash控制器
概述 本文主要描述了在Qemu平台中,如何添加STM32F103的Flash控制器模拟代码。 参考资料 STM32F1XX TRM手册,手册编号:RM0008 添加步骤 1、在hw/arm/Kconfig文件中添加STM32F1XX_FLASH,如下所示: 号部分为新增加内容 diff -…...
设计模式(责任链模式)
责任链模式 模板模式、策略模式和责任链模式,这三种模式具有相同的作用:复用和扩展,在实际的项目开发中比较常用,特别是框架开发中,我们可以利用它们来提供框架的扩展点,能够让框架的使用者在不修改框架源…...
【Mac-ML-DL】深度学习使用MPS出现内存泄露(leaked semaphore)以及张量转换错误
MPS加速修改总结 先说设备:MacBook Pro M4 24GB 事情的起因是我在进行深度学习的时候想尝试用苹果自带的MPS进行训练加速,修改设备后准备开始训练,但是出现如下报错: UserWarning: resource_tracker: There appear to be 1 leak…...
Hadoop集群部署教程-P5
Hadoop集群部署教程-P5 Hadoop集群部署教程(续) 第十七章:安全增强配置 17.1 认证与授权 Kerberos认证集成: # 生成keytab文件 kadmin -q "addprinc -randkey hdfs/masterEXAMPLE.COM" kadmin -q "xst -k hdfs.…...
Github 2FA(Two-Factor Authentication/两因素认证)
Github 2FA认证 多因素用户认证(Multi-Factor Authentication),基本上各个大互联网平台,尤其是云平台厂商(如:阿里云的MFA、华为云、腾讯云/QQ安全中心等)都有启用了,Github算是搞得比较晚些了。 双因素身…...
Spark大数据分析与实战笔记(第四章 Spark SQL结构化数据文件处理-05)
文章目录 每日一句正能量第4章 Spark SQL结构化数据文件处理章节概要4.5 Spark SQL操作数据源4.5.1 Spark SQL操作MySQL4.5.2 操作Hive数据集 每日一句正能量 努力学习,勤奋工作,让青春更加光彩。 第4章 Spark SQL结构化数据文件处理 章节概要 在很多情…...
使用 Azure AKS 保护 Kubernetes 部署的综合指南
企业不断寻求增强其软件开发和部署流程的方法。DevOps 一直是这一转型的基石,弥合了开发与运营之间的差距。然而,随着安全威胁日益复杂,将安全性集成到 DevOps 流水线(通常称为 DevSecOps)已变得势在必行。本指南深入探…...
遵守 Vue3 的单向数据流原则:父组件传递对象 + 子组件修改对象属性,安全地实现父子组件之间复杂对象的双向绑定示例代码及讲解
以下是针对 父组件传递对象 子组件修改对象属性 的完整示例代码,同时遵守 Vue3 的单向数据流原则: 1. 父组件代码 (ParentComponent.vue) vue <template><!-- 通过 v-model 传递整个对象 --><ChildComponent v-model"formData&qu…...
Unchained 内容全面上链,携手 Walrus 迈入去中心化媒体新时代
加密新闻媒体 Unchained — — 业内最受信赖的声音之一 — — 现已选择 Walrus 作为其去中心化存储解决方案,正式将其所有媒体内容(文章、播客和视频)上链存储。Walrus 将替代 Unchained 现有的中心化存储架构,接管其全部历史内容…...
20.3 使用技巧2
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的 20.3.3 修改表头单元格 设置列表头单元格的内容: 一是可以通过 DataGridView.Columns[列号].HeaderCell来获得对应列的单…...
【Axure绘制原型】小图标使用技巧
获取小图标的网站:https://www.iconfont.cn/ 搜索相关图标 点击下载-复制SVG代码 回到Axure软件中粘贴,此时会显示出图片 在Axure软件中右键-变换图片-转换为形状 即可...
音视频之H.265/HEVC预测编码
H.265/HEVC系列文章: 1、音视频之H.265/HEVC编码框架及编码视频格式 2、音视频之H.265码流分析及解析 3、音视频之H.265/HEVC预测编码 预测编码是视频编码中的核心技术之一。对于视频信号来说,一幅图像内邻近像素之间有着较强的空间相关性,相邻图像之…...
无人机遥感与传统卫星遥感:谁更适合你的需求?
在对地观测领域,无人机遥感和卫星遥感是两种重要的技术手段,各自具有独特的技术原理、性能特点和应用优势。本文将从技术原理、性能特点和应用场景三个方面,对无人机遥感和卫星遥感进行系统对比,帮助读者全面了解两种技术的差异与…...
学习笔记—C++—模板初阶
目录 模板初阶 泛型编程 函数模板 模版概念 函数模版格式 模版的原理 函数模板的实例化 模版参数的匹配规则 类模板 模板初阶 泛型编程 使用函数重载虽然可以实现,但是有一下几个不好的地方: 1. 重载的函数仅仅是类型不同,代码复…...
【Python进阶】字典:高效键值存储的十大核心应用
目录 前言:技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块技术选型对比 二、实战演示环境配置要求核心代码实现(10个案例)案例1:基础操作案例2:字典推导式…...
充电宝项目中集成地图地址解析功能梳理
文章目录 MongoDB数据库引入pom依赖配置yaml配置文件参考POJOXLocationRepositoryservice服务方法 腾讯地图接口申请api key配置api key启动类配置RestTemplate控制层服务层 MongoDB数据库 MongoDB对应经纬度的查询具体很好的支持. 引入pom依赖 <dependency><group…...
算法基础(以acwing讲述顺序为主,结合自己理解,持续更新中...)
文章目录 算法的定义一、基础算法排序二分高精度前缀和与差分双指针算法位运算离散化区间合并 算法的定义 这是我从百度上面搜的定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系…...
栈实现队列
栈实现队列 用栈实现队列:C 语言代码解析栈的基本实现栈的初始化栈的销毁入栈操作检查栈是否为空出栈操作获取栈顶元素获取栈中元素个数 用栈实现队列队列的创建入队操作出队操作获取队首元素检查队列是否为空队列的销毁 总结 用栈实现队列:C 语言代码解…...
Redis原理与Windows环境部署实战指南:助力测试工程师优化Celery调试
引言 在分布式系统测试中,Celery作为异步任务队列常被用于模拟高并发场景。而Redis作为其核心消息代理,其性能和稳定性直接影响测试结果。本文将深入解析Redis的核心原理,主要讲解Windows环境部署redis,为测试工程师提供一套完整…...
HWDeviceDRM的三个子类,HWPeripheralDRM HWTVDRM HWVirtualDRM
在很多采用 DRM 架构的 Android 平台(尤其是 QTI 平台,比如 sdm / display-hal 模块中),HWDeviceDRM 是一个基类,抽象了所有类型的 Display 输出设备的共通 DRM 行为,而它有三个常见的子类,对应…...
金融 IC 卡 CCRC 认证:从合规到业务安全的升级路径
在金融科技飞速发展的当下,金融 IC 卡作为现代金融交易的重要载体,广泛应用于各类支付场景,从日常的购物消费到线上金融理财,其安全性直接关系到用户的资金安全和金融机构的稳定运营。CCRC(中国网络安全审查技术与认证…...
微硕WSP6949 MOS管在强排热水器中的应用与市场分析
微硕WSP6949 MOS管在强排热水器中的应用与市场分析 一、引言 强排热水器作为一种常见的家用电器,其核心部件之一是驱动电路,而MOS管作为驱动电路中的关键元件,其性能直接影响到热水器的运行效率和稳定性。微硕半导体推出的WSP6949 MOS管&am…...
文件操作(二进制文件)
C中对文件操作需要包含头文件 #include<fstream> 文件类型分为两类: 1. 文本文件:文件以文本对应的 ASCII 码形式存储在计算机中 2. 二进制文件:文件以文本的二进制形式存储在计算机中,用户一 般不能直接读懂 文件…...
ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(输入类外设之按键Button)
ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(输入类外设之按键Button) 版本信息: ESP-ADF v2.7-65-gcf908721 简介 本文档详细分析ESP-ADF中的输入类外设实现机制,包括按键(button)、触摸(touch)和ADC按键(a…...
HOW - 企业团队自建 npm 仓库
文章目录 一、明确需求二、选型:常用方案三、Verdaccio 搭建步骤1. 安装 Node.js 环境2. 全局安装 verdaccio3. 启动服务4. 配置(可选)5. 用户登录与发布四、团队使用方式1. 使用 `.npmrc` 文件统一配置2. 发布范围包(Scoped packages)五、权限控制六、进阶集成七、测试和…...
键值对和Map的区别
数组里存储键值对和使用Map(在不同语言里也被叫做字典、哈希表等)存在多方面的区别,下面从多个维度进行分析,同时给出C#和C的代码示例。 区别分析 1. 查找效率 数组存储键值对:查找特定键的值时,通常需要…...
CS61A:STRING REPRESENTATION
Python 规定所有对象都应该产生两种不同的字符串表示形式:一种是人类可解释的文本,另一种是 Python 可解释的表达式。字符串的构造函数 str 返回一个人类可读的字符串。在可能的情况下,repr 函数会返回一个计算结果相等的 Python 表达式。rep…...
AI编程新纪元:GitHub Copilot、CodeGeeX与VS2022的联合开发实践
引言:AI编程时代的到来 在软件开发领域,我们正站在一个历史性的转折点上。GitHub Copilot、CodeGeeX等AI编程助手的出现,结合Visual Studio 2022的强大功能,正在重塑代码编写的本质。这不仅是工具层面的革新,更是开发范式的根本转变。能够有效利用这些AI工具的开发者将跨…...
iOS崩溃堆栈分析
文章目录 一、背景二、获取崩溃日志三、使用 dSYM 文件符号化堆栈信息1. 准备 dSYM 文件2. 符号化方法使用 Xcode使用 atos 命令 一、背景 在 iOS 开发中,分析崩溃日志和堆栈信息是调试的重要环节。上线APP往往只能获取到堆栈信息无法获取到具体的崩溃日志…...
kafka服务端和springboot中使用
kafka服务端和springboot中使用 一、kafka-sever安装使用 下载kafka-server https://kafka.apache.org/downloads.html 启动zookeeper zookeeper-server-start.bat config\zookeeper.properties 启动kafka-server kafka-server-start.bat config\server.properties创建主…...
05-DevOps-Jenkins自动拉取构建代码
新建Gitlab仓库 先在Gitab上创建一个代码仓库,选择创建空白项目 安装说明进行填写,然后点击创建项目 创建好的仓库是空的,什么都没有 新建一个springboot项目,用于代码上传使用。 只是为了测试代码上传功能,所以代码…...
win7/win10/macos如何切换DNS,提升网络稳定性
本篇教程教您如何在Windows10、Windows8.1、Windows7、MacOS操作系统切换DNS,以提升系统的稳定性,获得更好的操作体验。 Windows10及Windows8.1 1、右键单击“此计算机”,然后选择“属性”。进入Windows系统界面后,选择左侧的“…...
【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——A35M33异核通信测试
1)实验平台:正点原子ATK-DLMP257B开发板 2)浏览产品:https://www.alientek.com/Product_Details/135.html 3)全套实验源码手册视频下载:正点原子资料下载中心 第四章 ATK-DLMP257B功能测试——A35&M33…...
maven如何解决jar包依赖冲突
maven如何解决jar包依赖冲突 1.背景2.报错信息3.解决思路3.1.查找jsqlparser冲突3.2.发现冲突3.2.解决冲突 4.Dromara Warm-Flow 1.背景 在ruoyi-vue项目集成Warm-Flow过程中,需要把mybatis升级为mybatis-plus,按照Warm-Flow常见问题中升级过程…...
过往记录系列 篇六:国家队护盘历史规律梳理
文章目录 系列文章护盘触发条件与时间规律护盘信号识别特征市场反应规律退出策略历史演变系列文章 过往记录系列 篇一:牛市板块轮动顺序梳理 过往记录系列 篇二:新年1月份(至春节前)行情历史梳理 过往记录系列 篇三:春节行情历史梳理 过往记录系列 篇四:年报月行情历史梳…...
string的模拟实现 (6)
目录 1.string.h 2.string.cpp 3.test.cpp 4.一些注意点 本篇博客就学习下如何模拟实现简易版的string类,学好string类后面学习其他容器也会更轻松些。 代码实现如下: 1.string.h #define _CRT_SECURE_NO_WARNINGS 1 #pragma once #include <…...
多模态思维链AI医疗编程:从计算可持续性到开放域推理的系统性解决方案
多模态思维链AI医疗编程:从计算可持续性到开放域推理的系统性解决方案 医疗AI领域的多模态思维链技术正在重塑临床决策支持、医学影像分析和医疗流程优化的范式。本指南从计算可持续性、错误传播控制、伦理安全防护和通用性扩展四大维度,系统解析医疗大模型落地落地的关键要…...
BTS7960 直流电机控制程序
/*************正转逻辑*****************/ LEN1 REN1 while() { LPWN0 DELAY LPWM1 DELAY } /************反转逻辑******************/ LEN1 REN1 while() { RPWN0 DELAY RPWM1 DELAY } /******************************/ /***2025 测试直流电机正反转past…...
vue3 uniapp vite 配置之定义指令
动态引入指令 // src/directives/index.js import trim from ./trim;const directives {trim, };export default {install(app) {console.log([✔] 自定义指令插件 install 触发了!);Object.entries(directives).forEach(([key, directive]) > {app.directive(…...