蓝桥杯软件测试-十五届模拟赛2期题目解析

十五届蓝桥杯《软件测试》模拟赛2期题目解析

PS 需要第十五界蓝桥杯模拟赛2期功能测试模板、单元测试被测代码、自动化测试被测代码请加🐧:1940787338 备注:15界蓝桥杯省赛软件测试模拟赛2期

题目1:功能测试题目 1(测试用例)(12分)

【题目描述】

​ 请使用 正交实验法 对【系统管理】–>【岗位管理】页面中 搜索组合条件 进行测试用例的设计(参照功能截图),请选用合适的正交表使组合条件达到全面覆盖。

​ 并把用例填写在【模拟赛2期测试用例.xlsx】用例文件中的【题目1-正交法测试用例】中。如下图所示:

在这里插入图片描述

【功能模块】

  • 一级功能:岗位管理
  • 二级功能:搜索

【功能截图】

在这里插入图片描述

题目1:解题思路

​ 首先,根据正交表规则,我们先确定,水平因素,

​ 在本道题中, 因素就是:岗位编码岗位名称岗位状态 也就是被考查的东西,叫因素

​ 水平就有:(1) 不填 (2) 这两个是 岗位编码和岗位名称的 水平 所有(1) 正常(2) 停用(3) 这是 岗位状态的水平 被考查的值 叫水平

在这里插入图片描述

​ 其中 L 代表正交表 L 下角的数字“n”表示有 n 横行,简称行,即正交设计的数量 S 水平数 c 因素数 选择正交表时如果没有合适的 要往大的取,删除多的列即可。

​ 在本道题中 Ln = 3^3 = 9

​ 然后咱们找到最合适的正交表,有多的列,删去即可

在这里插入图片描述

第 1 步:请填写所选用的正交表:
1234
11111
21222
31333
42123
52231
62312
73132
83213
93321
第 2 步:请把【因素】和【水平】映射到正交表中。(请自行在表格中添加所需的行)
因素 / 用例岗位编码岗位名称岗位状态
1所有
2不填正常
3不填停用
4不填正常
5不填不填停用
6不填不填所有
7不填停用
8不填不填所有
9正常

题目2:功能测试题目 2(测试用例)(18 分):

【题目描述】

请根据需求描述,综合使用测试用例的设计方法对【系统管理】–>【岗位管理】–>【添加岗位】页面中的功能进行测试用例的设计。请设计足够的测试用例达到该方法的有效覆盖。

【功能模块】

  • 一级功能:岗位管理
  • 二级功能:添加岗位

【功能截图】

【添加岗位 需求描述】

功能点需求描述
岗位名称 输入框必填,1~6 位,中文\数字\它们的组合,不允许重复
岗位编码 输入框必填,1~6 位,英文\数字\它们的组合,不允许重复
显示顺序 输入框必填,输入整数,岗位列表按显示顺序进行排列
岗位状态 输入框正常、停用。选择停用,在添加用户时则不可选该岗位
备注 输入框0~200 字。

题目2:解题思路

​ 根据等价类/边界值原则设置用例即可,设计20条就够了,不用超过20条

用例编号一级功能二级功能前置条件用例标题操作步骤测试数据预期结果用例优先级
GWGL-TJGW-001岗位管理添加岗位1. 成功登录系统 2. 打开系统管理-岗位管理 3. 点击【新增】正常添加岗位信息(所有项输入正确)1. 输入正确的【岗位名称】; 2. 输入正确的【岗位编码】; 3. 输入正确的【显示顺序】; 4. 选择正确的【岗位状态】; 5. 输入正确的【备注】; 6. 点击【确定】;岗位名称:名称1 岗位编码:code1 显示顺序:1 岗位状态:正常 备注:备注1添加成功 提示:操作成功
GWGL-TJGW-002岗位管理添加岗位1. 成功登录系统 2. 打开系统管理-岗位管理 3. 点击【新增】不输入【岗位名称】(为空),进行添加岗位1. 输入为空的【岗位名称】(为空); 2. 输入正确的【岗位编码】; 3. 输入正确的【显示顺序】; 4. 选择正确的【岗位状态】; 5. 输入正确的【备注】; 6. 点击【确定】;岗位名称: 岗位编码:code2 显示顺序:2 岗位状态:正常 备注:备注2添加失败 提示:岗位名称必填
GWGL-TJGW-003岗位管理添加岗位1. 成功登录系统 2. 打开系统管理-岗位管理 3. 点击【新增】输入大于6位的【岗位名称】,进行添加岗位1. 输入错误的【岗位名称】(7位字符); 2. 输入正确的【岗位编码】; 3. 输入正确的【显示顺序】; 4. 选择正确的【岗位状态】; 5. 输入正确的【备注】; 6. 点击【确定】;岗位名称:一二三四五六七 岗位编码:code3 显示顺序:3 岗位状态:正常 备注:备注3添加失败 提示:岗位名称1~6 位,中文\数字\它们的组合
GWGL-TJGW-004岗位管理添加岗位1. 成功登录系统 2. 打开系统管理-岗位管理 3. 点击【新增】输入1位的【岗位名称】,进行添加岗位1. 输入错误的【岗位名称】(1位字符); 2. 输入正确的【岗位编码】; 3. 输入正确的【显示顺序】; 4. 选择正确的【岗位状态】; 5. 输入正确的【备注】; 6. 点击【确定】;岗位名称:一 岗位编码:code3 显示顺序:3 岗位状态:正常 备注:备注3添加成功 提示:操作成功
GWGL-TJGW-005岗位管理添加岗位1. 成功登录系统 2. 打开系统管理-岗位管理 3. 点击【新增】输入含有特殊字符的【岗位名称】,进行添加岗位1. 输入错误的【岗位名称】(含有特殊字符); 2. 输入正确的【岗位编码】; 3. 输入正确的【显示顺序】; 4. 选择正确的【岗位状态】; 5. 输入正确的【备注】; 6. 点击【确定】;岗位名称:一二三$% 岗位编码:code4 显示顺序:4 岗位状态:正常 备注:备注4添加失败 提示:岗位名称1~6 位,中文\数字\它们的组合
GWGL-TJGW-006岗位管理添加岗位1. 成功登录系统 2. 打开系统管理-岗位管理 3. 点击【新增】输入中文和数字组合的【岗位名称】,进行添加岗位1. 输入错误的【岗位名称】(中文和数字组合); 2. 输入正确的【岗位编码】; 3. 输入正确的【显示顺序】; 4. 选择正确的【岗位状态】; 5. 输入正确的【备注】; 6. 点击【确定】;岗位名称:1二3四5六 岗位编码:code5 显示顺序:5 岗位状态:正常 备注:备注5添加成功 提示:操作成功
GWGL-TJGW-007岗位管理添加岗位1. 成功登录系统 2. 打开系统管理-岗位管理 3. 点击【新增】输入重复(已存在)的【岗位名称】,进行添加岗位1. 输入错误的【岗位名称】(已存在的); 2. 输入正确的【岗位编码】; 3. 输入正确的【显示顺序】; 4. 选择正确的【岗位状态】; 5. 输入正确的【备注】; 6. 点击【确定】;岗位名称:1二3四5六 岗位编码:code6 显示顺序:7 岗位状态:正常 备注:备注6添加失败 提示:【岗位名称】已存在
GWGL-TJGW-008岗位管理添加岗位1. 成功登录系统 2. 打开系统管理-岗位管理 3. 点击【新增】不输入【岗位编码】(为空),进行添加岗位1. 输入正确的【岗位名称】; 2. 输入错误的【岗位编码】(为空); 3. 输入正确的【显示顺序】; 4. 选择正确的【岗位状态】; 5. 输入正确的【备注】; 6. 点击【确定】;岗位名称:名称8 岗位编码: 显示顺序:8 岗位状态:正常 备注:备注7添加失败 提示:岗位编码必填
GWGL-TJGW-009岗位管理添加岗位1. 成功登录系统 2. 打开系统管理-岗位管理 3. 点击【新增】输入大于6位的【岗位编码】,进行添加岗位1. 输入正确的【岗位名称】; 2. 输入错误的【岗位编码】(7位字符); 3. 输入正确的【显示顺序】; 4. 选择正确的【岗位状态】; 5. 输入正确的【备注】; 6. 点击【确定】;岗位名称:名称9 岗位编码:1234567 显示顺序:7 岗位状态:正常 备注:备注8添加失败 提示:岗位编码1~6 位,英文\数字\它们的组合
GWGL-TJGW-010岗位管理添加岗位1. 成功登录系统 2. 打开系统管理-岗位管理 3. 点击【新增】输入含有特殊字符的【岗位编码】,进行添加岗位1. 输入正确的【岗位名称】; 2. 输入错误的【岗位编码】(含有特殊字符); 3. 输入正确的【显示顺序】; 4. 选择正确的【岗位状态】; 5. 输入正确的【备注】; 6. 点击【确定】;岗位名称:1二3四5六 岗位编码:ab$5% 显示顺序:7 岗位状态:正常 备注:备注9添加失败 提示:岗位编码1~6 位,英文\数字\它们的组合
GWGL-TJGW-011岗位管理添加岗位1. 成功登录系统 2. 打开系统管理-岗位管理 3. 点击【新增】输入英文和数字组合的【岗位编码】,进行添加岗位1. 输入错误的【岗位名称】; 2. 输入错误的【岗位编码】(英文和数字组合); 3. 输入正确的【显示顺序】; 4. 选择正确的【岗位状态】; 5. 输入正确的【备注】; 6. 点击【确定】;岗位名称:名称10 岗位编码:ab123 显示顺序:7 岗位状态:正常 备注:备注10添加成功 提示:操作成功
GWGL-TJGW-012岗位管理添加岗位1. 成功登录系统 2. 打开系统管理-岗位管理 3. 点击【新增】输入1位【岗位编码】,进行添加岗位1. 输入正确的【岗位名称】; 2. 输入错误的【岗位编码】(1位字符); 3. 输入正确的【显示顺序】; 4. 选择正确的【岗位状态】; 5. 输入正确的【备注】; 6. 点击【确定】;岗位名称:名称188 岗位编码:a 显示顺序:7 岗位状态:正常 备注:备注10添加成功 提示:操作成功
GWGL-TJGW-013岗位管理添加岗位1. 成功登录系统 2. 打开系统管理-岗位管理 3. 点击【新增】输入重复(已存在)的【岗位编码】,进行添加岗位1.输入正确的【岗位名称】; 2. 输入错误的【岗位编码】(已存在的); 3. 输入正确的【显示顺序】; 4. 选择正确的【岗位状态】; 5. 输入正确的【备注】; 6. 点击【确定】;岗位名称:名称11 岗位编码:ab123 显示顺序:7 岗位状态:正常 备注:备注11添加失败 提示:【岗位编码】已存在
GWGL-TJGW-014岗位管理添加岗位1. 成功登录系统 2. 打开系统管理-岗位管理 3. 点击【新增】不输入【显示顺序】(为空),进行添加岗位1. 输入错误的【岗位名称】; 2. 输入正确的【岗位编码】; 3. 输入错误的【显示顺序】(为空); 4. 选择正确的【岗位状态】; 5. 输入正确的【备注】; 6. 点击【确定】;岗位名称:名称12 岗位编码:ab124 显示顺序: 岗位状态:正常 备注:备注12添加失败 提示:显示顺序必填
GWGL-TJGW-015岗位管理添加岗位1. 成功登录系统 2. 打开系统管理-岗位管理 3. 点击【新增】输入小数【显示顺序】,进行添加岗位1. 输入正确的【岗位名称】; 2. 输入正确的【岗位编码】; 3. 输入错误的【显示顺序】(小数); 4. 选择正确的【岗位状态】; 5. 输入正确的【备注】; 6. 点击【确定】;岗位名称:名称13 岗位编码:ab128 显示顺序:1.6 岗位状态:正常 备注:备注12添加失败 提示:显示顺序需是整数
GWGL-TJGW-016岗位管理添加岗位1. 成功登录系统 2. 打开系统管理-岗位管理 3. 点击【新增】输入中文和英文【显示顺序】,进行添加岗位1.输入正确的【岗位名称】; 2. 输入正确的【岗位编码】; 3. 输入错误的【显示顺序】(中文和英文字符); 4. 选择正确的【岗位状态】; 5. 输入正确的【备注】; 6. 点击【确定】;岗位名称:名称14 岗位编码:ab14 显示顺序:a哈 岗位状态:正常 备注:备注12添加失败 提示:显示顺序需是整数
GWGL-TJGW-017岗位管理添加岗位1. 成功登录系统 2. 打开系统管理-岗位管理 3. 点击【新增】输入正确的(检查显示顺序正确性)【显示顺序】,进行添加岗位1. 输入错误的【岗位名称】; 2. 输入正确的【岗位编码】; 3. 输入错误的【显示顺序】(整数); 4. 选择正确的【岗位状态】; 5. 输入正确的【备注】; 6. 点击【确定】;岗位名称:名称15 岗位编码:ab15 显示顺序:16 岗位状态:正常 备注:备注13添加成功 提示:操作成功 岗位列表按显示顺序排序
GWGL-TJGW-018岗位管理添加岗位1. 成功登录系统 2. 打开系统管理-岗位管理 3. 点击【新增】输入超长的整数【显示顺序】,进行添加岗位1. 输入正确的【岗位名称】; 2. 输入正确的【岗位编码】; 3. 输入错误的【显示顺序】(超长的整数); 4. 选择正确的【岗位状态】; 5. 输入正确的【备注】; 6. 点击【确定】;岗位名称:名称15 岗位编码:ab15 显示顺序:166666…等10万个数字 岗位状态:正常 备注:备注13添加失败 提示:添加失败,请核实添加数据
GWGL-TJGW-019岗位管理添加岗位1. 成功登录系统 2. 打开系统管理-岗位管理 3. 点击【新增】选择正常【岗位状态】,进行添加岗位1. 输入正确的【岗位名称】; 2. 输入正确的【岗位编码】; 3. 输入正确的【显示顺序】; 4. 选择错误的【岗位状态】(正常); 5. 输入正确的【备注】; 6. 点击【确定】;岗位名称:名称17 岗位编码:ab7 显示顺序:17 岗位状态:正常 备注:备注17添加成功 提示:操作成功
GWGL-TJGW-020岗位管理添加岗位1. 成功登录系统 2. 打开系统管理-岗位管理 3. 点击【新增】选择停用【岗位状态】,进行添加岗位1. 输入正确的【岗位名称】; 2. 输入正确的【岗位编码】; 3. 输入正确的【显示顺序】; 4. 选择错误的【岗位状态】(停用); 5. 输入正确的【备注】; 6. 点击【确定】;岗位名称:名称18 岗位编码:ab8 显示顺序:18 岗位状态:停用 备注:备注18添加成功 提示:操作成功
GWGL-TJGW-021岗位管理添加岗位1. 成功登录系统 2. 打开系统管理-岗位管理 3. 点击【新增】输入201位字符【备注】,进行添加岗位1. 输入正确的【岗位名称】; 2. 输入正确的【岗位编码】; 3. 输入正确的【显示顺序】; 4. 选择正确的【岗位状态】; 5. 输入错误的【备注】(201位字符); 6. 点击【确定】;岗位名称:名称19 岗位编码:ab9 显示顺序:19 岗位状态:正常 备注:备注19458…等201位字符添加失败 提示:备注在0-200字之间
GWGL-TJGW-022岗位管理添加岗位1. 成功登录系统 2. 打开系统管理-岗位管理 3. 点击【新增】输入200位字符【备注】,进行添加岗位1. 输入正确的【岗位名称】; 2. 输入正确的【岗位编码】; 3. 输入正确的【显示顺序】; 4. 选择正确的【岗位状态】; 5. 输入错误的【备注】(200位字符); 6. 点击【确定】;岗位名称:名称20 岗位编码:ab20 显示顺序:20 岗位状态:正常 备注:备注19458…等200位字符添加成功 提示:操作成功

题目3:功能测试题目 3(缺陷报告) (40分)

​ 利用所学知识,请对蓝桥后台管理中的如下 3 个页面进行测试,寻找其中预埋的 14 个缺陷,包括但不限于功能缺陷和易用性界面缺陷。

​ 并把发现的缺陷填写在指定的**【模拟赛2期缺陷报告.xlsx】**缺陷报告模板中。

【功能1:个人中心】

在这里插入图片描述

【功能2:岗位管理】

在这里插入图片描述

【功能3:添加岗位】

在这里插入图片描述

题目3:解题思路

​ 在寻找bug 时,我们可以从以下点进行出发

  • 输入框不对齐 — 美观性
  • 按钮换行 — 美观性
  • 建议搜索框支持模糊查询 – 建议
  • 插入的数据不显示在最后 – 建议
  • 按钮的图标注意检查 — 美观性
  • 类似个数的输入框输入负数、小数 — 功能性
  • 输入框会去除空格 — 建议
  • 插入10条数据后的分页条显示 ----- 功能性
  • 注意检查弹框的标题和文字 ----- 2级

参考答案

缺陷编号功能名称缺陷描述操作步骤预期结果实际结果缺陷级别
GRZX-BUG-001个人中心个人中心页面,在修改基本资料时,提示信息在左下角,不显眼1. 登录系统->点击【头像】进入个人中心; 2. 修改【用户名称】; 3. 其他项输入正确; 4. 点击【保存】;修改成功 在页面中上提示:信息更新成功修改成功 在页面左下角提示:信息更新成功2
GRZX-BUG-002个人中心个人中心页面,在修改基本资料时,性别修改不成功1. 登录系统->点击【头像】进入个人中心; 2. 修改【性别】为女; 3. 其他项输入正确; 4. 点击【保存】;修改成功 提示:信息更新成功性别没有被更改 提示:信息更新成功1
GWGL-BUG-001岗位管理岗位管理页面,选择【岗位状态】搜索时,不能筛选搜索1. 登录系统->系统管理-岗位管理; 2. 【岗位状态】选择正常/停用; 3. 点击【搜索】;查询出来的结果只有【岗位状态】是正常/停用的数据查询的都是全部数据1
GWGL-BUG-002岗位管理岗位管理页面,使用多个条件查询时查询失效1. 登录系统->系统管理-岗位管理; 2. 输入页面中存在的【岗位编码】和【岗位名称】; 3. 点击【搜索】;支持多个条件查询,且正确查询到数据查询不到有数据1
GWGL-BUG-003岗位管理岗位管理页面,搜索框不支持模糊查询1. 登录系统->系统管理-岗位管理; 2. 输入页面中存在的【岗位编码】和【岗位名称】; 3. 点击【搜索】;搜索框支持模糊查询,且能查询到相关数据搜索框不支持模糊查询2
GWGL-BUG-004岗位管理岗位管理页面,重置按钮没有反应1. 登录系统->系统管理-岗位管理; 2. 搜索框输入数据; 3. 点击【重置】;搜索框中的内容被清空搜索框中的内容没有被清空1
GWGL-BUG-005岗位管理岗位管理页面,岗位列表没有按照【显示顺序】进行排序1. 登录系统->系统管理-岗位管理; 2. 查看列表数据;岗位列表默认按照【显示顺序】进行升序排序岗位列表默认按照【创建时间】进行升序排序1
GWGL-BUG-006岗位管理岗位管理页面,在导出后的表格里,【显示顺序】列名称不正确1. 登录系统->系统管理-岗位管理; 2. 点击【导出】; 3. 查看导出的数据;正常显示所有列表数据正常显示所有列表数据,但【显示顺序】列名称不对2
GWGL-BUG-007岗位管理岗位管理页面,【修改】和【编辑】按钮功能相同,建议删去一个1. 登录系统->系统管理-岗位管理; 2. 查看【修改】、【编辑】按钮;两个按钮功能相同,只保留一个即可相同功能的按钮同时存在2
TJGW-BUG-001添加岗位添加岗位页面,【岗位名称】超过6位字符,也能添加成功1. 登录系统->系统管理-岗位管理; 2. 点击【新增】; 3. 输入超过6位字符的【岗位名称】; 4. 其他项输入正确; 5. 点击【确定】;添加失败 提示:【岗位名称】在1~6位添加成功 提示:操作成功1
TJGW-BUG-002添加岗位添加岗位页面,【岗位编码】输入中文/特殊字符也能添加成功1. 登录系统->系统管理-岗位管理; 2. 点击【新增】; 3. 输入含有中文和特殊字符的【岗位编码】; 4. 其他项输入正确; 5. 点击【确定】;添加失败 提示:【岗位编码】必须是英文/数组/组合添加成功 提示:操作成功1
TJGW-BUG-003添加岗位添加岗位页面,【岗位编码】输入中文时,不允许重复失效了1. 登录系统->系统管理-岗位管理; 2. 点击【新增】; 3. 输入中文(已存在)的【岗位编码】; 4. 其他项输入正确; 5. 点击【确定】;添加失败 提示:【岗位编码】已存在添加成功 提示:操作成功1
TJGW-BUG-004添加岗位添加岗位页面,【岗位状态】选择【停用】,添加用户时,也可以选择该岗位1. 登录系统->系统管理-岗位管理; 2. 点击【新增】; 3. 【岗位状态】选择停用; 4. 其他项输入正确; 5. 点击【确定】; 6. 去添加用户页面,查看【岗位】下拉菜单;【岗位】下拉菜单不可选择停用的岗位【岗位】下拉菜单可以选择停用的岗位1
TJGW-BUG-005添加岗位添加岗位页面,【备注】超过200个字符时,也可以添加1. 登录系统->系统管理-岗位管理; 2. 点击【新增】; 3. 【备注】输入超过200个字符; 4. 其他项输入正确; 5. 点击【确定】;添加失败 提示:备注在0~200个字添加成功 提示:操作成功1

题目4:单元测试(Java)语言

【题目描述】

​ 请使用 基本路径法 为被测源代码 SendVerificationCode 类中的 isValid() 方法设计单元测试用例,并在 SendVerificationCodeTest 类中完成单元测试代码。

【源代码功能】

​ 源代码实现的功能是:判断手机号码的合法性。

代码的 SendVerificationCode 类中包含一个方法:isValid()。

isValid() 方法用来判断 phoneNumber 是否为合法的手机号,逻辑如下:

  • 校验 phoneNumber 的长度是否合法;
  • 使用正则表达式校验 phoneNumber 是否符合手机号码的通用规则;
  • 如果 phoneNumber 的长度合法且符合手机号码通用规则返回 true ,否则返回 false 。

被测源代码:

package cn.lanqiao;

/**
 * 判断手机号码的合法性。规则如下: 
 *  1. 校验 phoneNumber 的长度是否合法; 
 *  2. 使用正则表达式校验 phoneNumber 是否符合通用手机号码的规则; 
 *  3. 如果 phoneNumber 的长度合法且符合通用手机号码规则返回 true ,否则返回 false。
 */

public class SendVerificationCode {	
	
	public boolean isValid(String phoneNumber) {
		String pattern = "^1[3-9]\\d{9}$";
		if (phoneNumber == null || phoneNumber.length() == 0 || phoneNumber.length() != 11) {
			return false;
		} else if (!phoneNumber.matches(pattern)) {
			return false;![image-20240527221214409](C:\Users\1\AppData\Roaming\Typora\typora-user-images\image-20240527221214409.png)
		} else {
			return true;
		}
	}
}

题目4:解题思路

步骤1:首先,我们画出流程图

在这里插入图片描述

步骤2:根据流程图画出控制流图。

​ 并且计算圈复杂度,我们可以得到,有5个测试用例即可完成基本路径覆盖

在这里插入图片描述

然后我们确定路径:

- 路径1:1 - 2 - 3
- 路径2:1 - 2 - 4 - 3
- 路径3:1 - 2 - 4 - 5 - 3
- 路径4:1 - 2 - 4 - 5 - 6 - 3
- 路径5:1 - 2 - 4 - 5 - 6 - 8

然后我们根据路径写出相应的测试用例:

在这里插入图片描述

然后根据我们的测试用例来编写测试代码

package cn.lanqiao.unit;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import org.junit.Before;
import org.junit.Test;
import cn.lanqiao.SendVerificationCode;

/**
 * 单元测试
 * 1. 请使用 基本路径法 对被测源码 SendVerificationCode 类中的 isValid 方法设计单元测试用例。
 * 2. 请在下方 SendVerificationCodeTest 类中填写单元测试代码。
 * 3. 基本路径法:又称独立路径测试,是在程序控制流图的基础上,通过分析控制结构的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法。
 */
public class SendVerificationCodeTest {
	static SendVerificationCode sendCode;

	@Before
	public void initSendVerificationCodeTest() {
		sendCode = new SendVerificationCode();
	}

	@Test
	public void testIsValid01() {
		assertFalse(sendCode.isValid(null));
	}
	
	@Test
	public void testIsValid02() {
		assertFalse(sendCode.isValid(""));
	}
	
	@Test
	public void testIsValid03() {
		assertFalse(sendCode.isValid("180"));
	}
	
	@Test
	public void testIsValid04() {
		assertFalse(sendCode.isValid("01234567891"));
	}
	
	@Test
	public void testIsValid05() {
		assertTrue(sendCode.isValid("13074961087"));
	}
}

​ 运行测试代码,可以看到,题目中给到的都被我们覆盖上了

在这里插入图片描述

题目5:自动化测试题目(Python 语言)

【题目描述】

请使用 Python 编程语言,结合 PO 模式(Page Object Model 的简写 页面对象模型 )思想 ,使用 Selenium 自动化测试工具补全如下多个 Python 类文件中 //TODO 处缺失的代码:

  • Page1:login_page.py ,“登录”页面(已经写好,无需填写)
  • Page2:post_management_page.py,“岗位管理” 页面
  • Page3:add_post_page.py,“添加岗位” 页面
  • web_case_test.py:测试用例代码文件

请按照用例步骤,在测试用例 web_case_test.py 文件中需通过调用 3 个 Page 类中的方法完成自动化测试代码。

参考代码

login_page.py
from selenium.webdriver.common.by import By
from time import sleep

"""
 * Page1-【登录】页面,登录页中的4个方法已经写好,无需改动。
 * 
 * 1. 输入【用户名】
 * 2. 输入【密码】
 * 3. 输入固定的【验证码】
 * 4. 点击【登录】按钮
 * 
"""
class LoginPage:
    
    def __init__(self, driver):
        self.driver = driver

    # 输入【用户名称】的操作代码
    def input_login_name(self, login_name):
        # 清空用户名输入框内容,防止脏数据
        login_name_input = self.driver.find_element(By.XPATH, '//*[@id="signupForm"]/input[1]')
        login_name_input.clear()
        # 输入传入的 login_name 参数
        login_name_input.send_keys(login_name)

    # 输入【密码】的操作代码
    def input_login_password(self, password):
        # 清空密码输入框内容,防止脏数据
        password_input = self.driver.find_element(By.XPATH, '//*[@id="signupForm"]/input[2]')
        password_input.clear()
        # 输入传入的 password 参数
        password_input.send_keys(password)

    # 输入【验证码】的操作代码
    def input_code(self, code):
        # 清空验证码输入框内容,防止脏数据
        code_input = self.driver.find_element(By.XPATH, '//*[@id="signupForm"]/div[1]/div[1]/input')
        code_input.clear()
        # 输入固定的 666 验证码
        code_input.send_keys(code)

    # 点击【登录】按钮的操作代码
    def click_login_button(self):
        # 点击登录按钮
        login_button = self.driver.find_element(By.XPATH, '//*[@id="btnSubmit"]')
        login_button.click()
        sleep(2)
post_management_page.py
from selenium.webdriver.common.by import By

"""

 * Page2-【岗位管理页面】
  * 需实现该页面中如下 7 个方法的操作代码(以下元素位置可参照题目附图)
  *  
 * 1.获取登录后的【蓝桥超管】文本值
 * 2.点击【系统管理】 > 点击【岗位管理】 的菜单路径
 * 3.定位搜索项中的【岗位编码】输入框 ,并输入参数post_code
 * 4.点击【搜索】按钮方法
 * 5.获取搜索结果的【分页显示信息文本值】
 * 6.点击搜索列表【删除】按钮
 * 7.点击【确认】删除的按钮
 
 *  注意1:不要在  Page 页的方法中填写  iframe 的切换代码。
 *  注意2:注意不要改动已经写好的方法名。
 
"""
from time import sleep
class PostManagementPage:
    
    def __init__(self, driver):
        self.driver = driver

    def get_username_text(self):
        # TODO 请实现 获取【蓝桥超管】文本值,注意在此方法中添加返回值
        return self.driver.find_element(By.XPATH, '/html/body/div/div/div[1]/nav/ul/li[3]/a/span').text

    
    def click_post_manage_path(self):
        # TODO 请依次实现点击【系统管理】 > 点击【岗位管理】 的路径方法
        self.driver.find_element(By.XPATH, '/html/body/div/nav/div[2]/div[1]/ul/li[3]').click()
        sleep(1)
        self.driver.find_element(By.XPATH, '/html/body/div/nav/div[2]/div[1]/ul/li[3]/ul/li[5]').click()

    
    def input_post_code_search(self, post_code):
        # TODO 请实现搜索条件【岗位编码】输入框的方法,post_code 为输入参数
        self.driver.find_element(By.NAME, 'postCode').send_keys(post_code)
        
    
    def click_search_button(self):
        # TODO 请实现点击【搜索】按钮的方法
        self.driver.find_element(By.XPATH, '/html/body/div/div/div[1]/form/div/ul/li[4]/a[1]').click()
        
    def get_page_numberText(self):
        # TODO 请实现 获取【分页显示信息文本值】的操作方法,注意在此方法中添加返回值
        return self.driver.find_element(By.CLASS_NAME, 'pagination-info').text
        

    def click_delete_button(self):
        # TODO 请实现点击【删除】按钮的方法
        self.driver.find_element(By.XPATH, '/html/body/div/div/div[2]/div[1]/div[2]/div[2]/table/tbody/tr/td[8]/a[2]').click()
        
        
        
    def click_ok_button(self):
        # TODO 请实现点击【确认】删除的按钮的方法    
        self.driver.find_element(By.XPATH, '/html/body/div[3]/div[3]/a[1]').click()
        
        
        
add_post_page.py
from selenium.webdriver.common.by import By

"""

 * Page3-【管理页面】
  * 需实现该页面中如下 5 个方法的操作代码
  *  
 * 1.点击【+新增】元素操作方法
 * 2.表单框输入【岗位名称】的方法
 * 3.表单框输入【岗位编码】的方法
 * 4.表单框输入【显示顺序】的方法
 * 5.点击【确定】按钮的方法
 *
 * 注意1:不要在  Page 页的方法中填写 iframe 的切换代码。
 * 注意2:注意不要改动已经写好的方法名。
 * 
 *
 
"""
class AddPostPage:
    
    def __init__(self, driver):
        self.driver = driver

    
    def click_add_button(self):
        # TODO 请实现点击【+新增】元素操作方法
        self.driver.find_element(By.XPATH, '/html/body/div/div/div[2]/div[1]/div[1]/div[1]/div/a[1]').click()
        
       

    def input_post_name(self, post_name):
        # TODO 请实现表单框输入【岗位名称】的方法
        self.driver.find_element(By.ID, 'postName').send_keys(post_name)
        
    
    def input_post_code(self, post_code):
        # TODO 请实现表单框输入【岗位编码】的方法
        self.driver.find_element(By.ID, 'postCode').send_keys(post_code)

    
    def input_post_sort(self, post_sort):
        # TODO 请实现表单框输入【显示顺序】的方法
        self.driver.find_element(By.ID, 'postSort').send_keys(post_sort)

    
    def click_ok_button(self):
        #TODO 请实现点击【确定】按钮的方法
        self.driver.find_element(By.XPATH, '/html/body/div[4]/div[3]/a[1]').click()
        
test_web_case.py
import unittest
from selenium import webdriver
from selenium.webdriver.firefox.service import Service
from time import sleep

from cn.lanqiao.web.login_page import LoginPage
from cn.lanqiao.web.post_management_page import PostManagementPage
from cn.lanqiao.web.add_post_page import AddPostPage

"""
 * 请按照操作步骤编写测试用例
 *
 * 用例要求:
 * 1.合理使用元素等待时间。
 * 2.请调用 Page 类中的方法实现操作步骤。
 * 3.合理使用 iframe 切换,iframe 切换的代码填写在此文件中。
 * 4.不要改动已经写好的方法名。
 *

"""

class WebCaseTest(unittest.TestCase):
    
    # 浏览器初始化
    def setUp(self):
        # 设置火狐驱动的路径,该路径不要随意改动
        gecko_path = "C:\\LanQiaoTest\\project\\PythonLanqiaoTest\\driver\\geckodriver.exe"
     
        # 允许跨域访问
        options = webdriver.FirefoxOptions()
        options.set_preference('security.fileuri.strict_origin_policy', False)
        options.set_preference('security.fileuri.origin_policy', '*')
        self.driver = webdriver.Firefox(service=Service(gecko_path), options=options)
        
        # 设置隐式等待 5 秒
        self.driver.implicitly_wait(5)
        
        # 浏览器窗口最大化
        self.driver.maximize_window()
        
        # 填写被测站点地址
        self.driver.get("https://66552b93debba6d0473e9b5a.hz-iframe-svc.simplelab.cn/login")
        

    # 请再此方法中续写测试用例代码
    def test_browser(self):
        # 创建LoginPage对象,供调用该类中的方法实现【登录】的操作代码
        login_page = LoginPage(self.driver)

        # 点击登录账号输入框并输入账户-admin
        login_page.input_login_name("admin")

        # 点击登录密码输入框并输入密码-LQ15Mock2@2004
        login_page.input_login_password("admin123")

        # 点击验证码输入框并输入-666
        login_page.input_code("666")

        # 点击登录按钮
        login_page.click_login_button()
        sleep(2)
        
        #  创建PostManagementPage对象
        post_management_page = PostManagementPage(self.driver)
        
        # 创建PostManagementPage对象
        add_post_page = AddPostPage(self.driver)
        
        # TODO 请参照题目中【用例步骤】补全以下代码,调用 3 个Page类中的方法实现。
        usernameText = post_management_page.get_username_text()
        self.assertEqual('蓝桥超管', usernameText, '用户名不一致%s' % usernameText)
        post_management_page.click_post_manage_path()
        
        # 切换frame
        self.driver.switch_to.frame('iframe6')
        post_management_page.input_post_code_search('ceo')
        post_management_page.click_search_button()
        sleep(1)
        pageNumText = post_management_page.get_page_numberText()
        self.assertEqual('显示第 1 到第 1 条记录,总共 1 条记录', pageNumText, '分页数据不匹配%s' % pageNumText)
        post_management_page.click_delete_button()
        
        # 切换frame
        self.driver.switch_to.default_content()
        post_management_page.click_ok_button()
        
        # 切换frame
        self.driver.switch_to.frame('iframe6')
        add_post_page.click_add_button()

        # 切换frame
        self.driver.switch_to.default_content()
        sleep(2)
        self.driver.switch_to.frame(2)
        sleep(1)
        
        add_post_page.input_post_name('董事长')
        add_post_page.input_post_code('ceo')
        add_post_page.input_post_sort(1)
        
        # 切换
        self.driver.switch_to.default_content()
        add_post_page.click_ok_button()
        
    # 浏览器退出
    def tearDown(self):
        if self.driver:
            self.driver.quit()

if __name__ == "__main__":
    unittest.main()  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/672391.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

60 关于 SegmentFault 的一些场景 (1)

前言 呵呵 此问题主要是来自于 帖子 月经结贴 -- 《Segmentation Fault in Linux》 这里主要也是 结合了作者的相关 case, 来做的一些 调试分享 当然 很多的情况还是 蛮有意思 本文主要问题如下 1. 访问可执行文件中的 只读数据 2. 访问不存在的虚拟地址 3. 访问内核地址…

【机器学习】基于OpenCV和TensorFlow的MobileNetV2模型的物种识别与个体相似度分析

在计算机视觉领域,物种识别和图像相似度比较是两个重要的研究方向。本文通过结合深度学习和图像处理技术,基于OpenCV和TensorFlow的MobileNetV2的预训练模型模,实现物种识别和个体相似度分析。本文详细介绍该实验过程并提供相关代码。 一、名…

Python代码:二十六、反转列表

1、题目 描述 小明有一个列表记录了各个朋友的喜欢的数字,num [3, 5, 9, 0, 1, 9, 0, 3],请你帮他创建列表,然后使用reverse函数将列表反转输出。 输入描述: 无 输出描述: 第一行输出创建好的原始的列表&#x…

typescript --object对象类型

ts中的object const obj new Object()Object 这里的Object是Object类型,而不是JavaScript内置的Object构造函数。 这里的Object是一种类型,而Object()构造函数表示一个值。 Object()构造函数的ts代码 interface ObjectConstructor{readonly prototyp…

【JavaEE】JVM中垃圾回收机制详解

一.垃圾回收的基本概念 1.什么是垃圾回收机制. JVM(Java虚拟机)垃圾回收机制是Java内存管理的重要组成部分,它负责自动回收程序中不再使用的对象所占用的内存空间。这样可以有效地防止内存泄漏和内存溢出问题,提高程序的稳定性和…

电脑死机问题排查

情况描述:2024年6月2日下午16:04分电脑突然花屏死机,此情况之前遇到过三次,认为是腾讯会议录屏和系统自带录屏软件冲突导致。 报错信息:应用程序-特定 权限设置并未向在应用程序容器 不可用 SID (不可用)中运行的地址…

GPT-4o有点坑

GPT-4o有点坑 0. 前言1. GPT-4o简介2. GPT-4o带来的好处2.1 可以上传图片和文件2.2 更丰富的功能以及插件 3. "坑"的地方3.1 使用时间短3.2 GPT-4o变懒了 4. 总结 0. 前言 原本不想对GPT-4o的内容来进行评论的,但是看了相关的评论一直在说:技…

全国水系数据(更新到2024年5月)

上海市水系数据地图可视化 水系数据线图层(小河/溪流、江/河、运河、下水道/排水管) 水系数据面数据(水域、水库、河岸、湿地) 水系数据字段说明 可视化预览 北京市水系可视化 上海市水系可视化 广州市水系可视化 深圳市水系可视化…

Gin的快速入门和搭建

文章目录 Go的工程工程架构技术选型 Gin入门 Go的工程 基于Go生态,构建一个支持内容管理,内容加工、内容分发的内容库系统。 内容管理:增删改查内容加工:例如内容审核、推荐等内容分发:将内容可以推到不同的业务线 …

用例篇03

正交表 因素:存在的条件 水平:因素的取值 最简单的正交表:L4(2) 应用 allpairs 来实现正交表。 步骤: 1.根据需求找出因素和水平 2.将因素和水平写入到excel表格中(表格不需要保存)(推荐用…

集成学习算法笔记

一、引言 在机器学习和数据分析领域,集成学习算法因其能够显著提高模型预测性能而备受关注。然而,任何算法在应用过程中都不可避免地会遇到一些挑战和问题,集成学习算法也不例外。其中,最为常见且关键的两大问题便是欠拟合&#…

软考高级系统规划与管理师适合什么人考?有什么优势?

系统规划与管理师适合什么人考? 适合以下几类人群: 1. 信息技术服务规划人员:从事信息技术服务规划工作,负责制定和优化IT服务规划的人 2. 信息系统运行维护管理人员:负责信息系统日常运行维护、确保系统稳定性和可…

【Pr剪辑】01新建项目起步

【Pr学习】01新建项目起步 1、新建项目2.序列设置2.1新建序列2.2序列参数讲解2.3自定义设置 3.PR窗口认识3.1 项目窗口3.2 源窗口2.4 保存面板 4.剪辑导入4.1 素材导入4.2 视图切换4.3 时间轴4.4轨道工具4.5 节目窗口素材导入 5.基础操作5.1 取消视频音频链接5.2 单独渲染&…

网络监听技术

网络监听技术 网络监听概述网络监听环境 流量劫持网络环境共享式网络监听原理交换式网络监听交换机的工作方式交换网络监听:交换机集线器交换网络监听:端口镜像交换网络监听:MAC洪泛交换网络监听:MAC洪泛交换网络监听:…

OpenMV学习笔记3——画图函数汇总

画图,即在摄像头对应位置画出图形,对于需要反馈信息的程序来说很直观。就如上一篇文章颜色识别当中的例子一样,我们在识别出的色块上画出矩形方框,并在中间标出十字,可以直观的看到OpenMV现在识别出的色块。 目录 一…

《论文阅读》通过顺序不敏感的表示正则化实现稳健的个性化对话生成 ACL 2023

《论文阅读》通过顺序不敏感的表示正则化实现稳健的个性化对话生成 ACL 2023 前言 相关个性化生成论文推荐简介问题定义方法损失函数实验结果 前言 亲身阅读感受分享,细节画图解释,再也不用担心看不懂论文啦~ 无抄袭,无复制,纯手…

Least-Squares Rigid Motion Using SVD——文献精读(使用 SVD 方法求解 ICP 问题)

一、文章信息与摘要 文章标题:Least-Squares Rigid Motion Using SVD(使用奇异值分解的最小二乘刚性运动) 说明本文的核心目标:计算对齐两组对应点的最佳拟合刚性变换的步骤 二、问题描述 假设P{p1,p2,...,pn}和Q{q1,q2,...,qn…

以sqlilabs靶场为例,讲解SQL注入攻击原理【25-31关】

【Less-25】 首先分析源码 发现把 SQL语句中的 or、and 替换成了空格,这就导致无法使用之前的sql注入方式。 解决方案:用 && 代替 and , 用 || 代替 or , 而且&在url中有特殊含义,如果直接使用会有问题&a…

电磁兼容(EMC):BUCK变换器基本原理及传导辐射分析设计

目录 1. BUCK电路拓扑及原理 2. Buck拓扑电路电磁场分析 3.总结 开关电源替代线性电源,解决了效率和体积问题,但也带来了新的EMI问题。开关电源也是产品内部的强辐射源之一,基于透过现象看本质,将复杂问题简单化,本…

2024年06月在线IDE流行度最新排名

点击查看最新在线IDE流行度最新排名(每月更新) 2024年06月在线IDE流行度最新排名 TOP 在线IDE排名是通过分析在线ide名称在谷歌上被搜索的频率而创建的 在线IDE被搜索的次数越多,人们就会认为它越受欢迎。原始数据来自谷歌Trends 如果您相…