PS 需要第十五界蓝桥杯被测系统或者功能测试模板、单元测试被测代码、自动化测试被测代码请加🐧:1940787338 备注:15界蓝桥杯省赛软件测试
题目1:功能测试
题目描述
某物流公司的货运收费标准根据重量、距离和节假日三个因素来确定。如果运输地点在本省,那么收费标准如下:(1)
如果重量在
- 0到50公斤之间(含50公斤),每公斤运费为8元;
- 如果重量在51到100公斤之间(含100公斤),每公斤运费为12元;
- 如果重量超过100公斤,每公斤运费为16元;
此外,如果运输发生在节假日,每公斤运费会额外增加2元。
如果运输地点在外省,那么收费标准如下:
- 如果重量在0到50公斤之间(含50公斤),每公斤运费为15元;
- 如果重量在51到100公斤之间(含100公斤),每公斤运费为20元;
- 如果重量超过 100公斤,每公斤运费为25元;
- 此外,如果运输发生在节假日,每公斤的运费会额外增加5元。
解题步骤
首先,我们分析题目,列出一下条件桩,可知条件有 C1 重量 C2 运输地点 C3 是不是发生在节假日
1、列出条件桩和条件项
根据排列组合公式 我们可以得出有12条测试用例
2、列出动作桩和动作项
动作桩 | 动作项 |
---|---|
A1:每公斤运费8 | T/F |
A2:每公斤运费12 | T/F |
A3:每公斤运费16 | T/F |
A4:每公斤额外增加2元 | T/F |
A5:每公斤运费15元 | T/F |
A6:每公斤运费20元 | T/F |
A7:每公斤运费25元 | T/F |
A8:每公斤运费额外增加5元 | T/F |
3、写出判定表
4、根据判定表写出测试用例
编号 | 重量(公斤) | 省份 | 节假日 | 预期结果 |
---|---|---|---|---|
case1 | 1 | 本省 | 是 | 10元 |
case2 | 1 | 本省 | 否 | 8元 |
case3 | 1 | 外省 | 是 | 20元 |
case4 | 1 | 外省 | 否 | 15元 |
case5 | 51 | 本省 | 是 | 918元 |
case6 | 51 | 本省 | 否 | 612元 |
case7 | 51 | 外省 | 是 | 1275元 |
case8 | 51 | 外省 | 否 | 1020元 |
case9 | 101 | 本省 | 是 | 1818元 |
case10 | 101 | 本省 | 否 | 1616元 |
case11 | 101 | 外省 | 是 | 2020元 |
case12 | 101 | 外省 | 否 | 2525元 |
综合测试用例
【功能模块】
模块名称:运费模板
功能名称:【搜索】功能(红框标记出来的部分)
【功能截图】
判分规则
本题满分16分(主要考察测试用例的综合设计思路,会从用例覆度和编写规范两个方面进行判分。
- 用例覆盖度:每覆盖1条用例得1分,最高得11分。
- 编写规范:按照模板的说明进行规范填写,规范最高得5分。
- 提交的用例数目不要超过11条,否则只对前11条用例进行判分。
【答案提交】
答案完成后,选手需把【省赛测试用例.xlsx】文件保存到【答案提交】文件夹中,等待和其他答案一起提交。
用例答案
用例编号 | 一级功能 | 二级功能 | 前置条件 | 用例标题 | 操作步骤 | 测试数据 | 预期结果 | 用例优先级 |
---|---|---|---|---|---|---|---|---|
YFMB-SS-001 | 运费模板 | 搜索 | 1. 已成功登录系统 2. 打开【运费模板】页面 | 不输入【模块名称】(为空),进行搜索操作 | 1. 输入正确的【模块名称】(为空); 2. 点击【搜索】; | 模块名称:(为空) | 查询全部数据 | 中 |
YFMB-SS-002 | 运费模板 | 搜索 | 1. 已成功登录系统 2. 打开【运费模板】页面 3. 页面中有【模块名称】数据 | 输入精确的【模块名称】(已存在),进行搜索 | 1. 输入正确的【模块名称】; 2. 点击【搜索】; | 模块名称:包邮 | 正确显示查找的数据 | 高 |
YFMB-SS-003 | 运费模板 | 搜索 | 1. 已成功登录系统 2. 打开【运费模板】页面 3. 页面中有【模块名称】数据 | 输入模糊的【模块名称】(一个或多个),进行搜索 | 1. 输入正确的【模块名称】; 2. 点击【搜索】; | 模块名称:广州单 | 正确显示查找的数据 | 高 |
YFMB-SS-004 | 运费模板 | 搜索 | 1. 已成功登录系统 2. 打开【运费模板】页面 3. 页面中有【模块名称】数据 | 输入含有特殊字符的【模块名称】(一个或多个),进行搜索 | 1. 输入正确的【模块名称】; 2. 点击【搜索】; | 模块名称:#¥%……& | 正确显示查找的数据 | 高 |
YFMB-SS-005 | 运费模板 | 搜索 | 1. 已成功登录系统 2. 打开【运费模板】页面 | 输入不存在【模块名称】,进行搜索 | 1. 输入正确的【模块名称】; 2. 点击【搜索】; | 模块名称:北京 | 页面正确显示“暂无数据” | 中 |
YFMB-SS-006 | 运费模板 | 搜索 | 1. 已成功登录系统 2. 打开【运费模板】页面 | 输入【模板名称】,进行清空 | 1. 输入正确的【模块名称】; 2. 点击【清空】; | 模块名称:北京 | 【模块名称】输入框内容被清空 | 中 |
YFMB-SS-007 | 运费模板 | 搜索 | 1. 已成功登录系统 2. 打开【运费模板】页面 | 输入【模板名称】,输入框的×清空 | 1. 输入正确的【模块名称】; 2. 点击输入框内的【×】; | 模块名称:北京 | 【模块名称】输入框内容被清空 | 中 |
YFMB-SS-008 | 运费模板 | 搜索 | 1. 已成功登录系统 2. 打开【运费模板】页面 3. 页面中有【模块名称】数据 | 输入【模板名称】,进行回车搜索 | 1. 输入正确的【模块名称】; 2. 点击键盘【回车】; | 模块名称:包邮 | 正确显示查找的数据 | 高 |
YFMB-SS-009 | 运费模板 | 搜索 | 1. 已成功登录系统 2. 打开【运费模板】页面 | 输入【模板名称】(十万个字),进行回车搜索 | 1. 输入正确的【模块名称】(十万个字); 2. 点击键盘【回车】; | 模块名称:一二三四五…等十万个字 | 提示:字符数超出限制 | 中 |
YFMB-SS-010 | 运费模板 | 搜索 | 1. 已成功登录系统 2. 打开【运费模板】页面 3. 页面中有【模块名称】数据 | 输入【模板名称】(含有空格),进行搜索 | 1. 输入正确的【模块名称】(含有空格); 2. 点击键盘【回车】; | 模块名称:包 邮 | 去除空格,然后进行搜索 | 中 |
题目2:缺陷报告
题目描述
功能测试题目3(编写缺陷报告)(满分 40分)
利用所学知识,请对被测系统中的如下2个页面进行测试,寻找其中预埋的缺陷,包括但不限于功能缺陷和易用性界面缺陷。并把发现的缺陷填写在指定的【省赛缺陷报告.xisx】文件中。
下面是16个Bug
缺陷编号 | 功能名称 | 缺陷描述 | 操作步骤 | 预期结果 | 实际结果 | 缺陷级别 |
---|---|---|---|---|---|---|
YFMB-BUG-001 | 运费模板 | 运费模板页面,点击【清空】按钮没有反应 | 1. 登录系统->进入运费模板页面 2. 输入【模板名称】 3. 点击【清空】 | 清空【模板名称】输入框的内容 | 【清空】按钮没有反应 | 1 |
YFMB-BUG-002 | 运费模板 | 运费模板页面,点击【全选】复选框,偶数行不选中 | 1. 登录系统->进入运费模板页面 2. 点击【全选】复选框 | 所有数据被选中 | 只选中了奇数行数据 | 1 |
YFMB-BUG-003 | 运费模板 | 运费模板页面,【批量删除】按钮无法删除所有选中数据 | 1. 登录系统->进入运费模板页面 2. 点击【全选】复选框 3. 点击【批量删除】 | 所有被选中的数据都删除成功 | 只删除了第一条数据 | 1 |
YFMB-BUG-004 | 运费模板 | 运费模板页面,【修改】、【删除】按钮的图标显示不正确 | 1. 登录系统->进入运费模板页面 2. 查看【修改】、【删除】按钮 | 【删除】按钮显示垃圾桶图标 【修改】按钮显示笔图标 | 【删除】、【修改】按钮图标反过来了 | 2 |
YFMB-BUG-005 | 运费模板 | 运费模板页面,【搜索】、【清空】按钮没有对齐,不美观 | 1. 登录系统->进入运费模板页面 2. 查看【搜索】、【清空】按钮 | 【搜索】、【清空】按钮对齐,且间距相同 | 【搜索】、【清空】按钮没有对齐,间距不相同 | 2 |
YFMB-BUG-006 | 运费模板 | 运费模板页面,【模板名称】不支持模糊匹配 | 1. 登录系统->进入运费模板页面 2. 【运费模板】输入:包 3. 点击【搜索】或按【回车】 | 输入框支持模糊匹配,且正确查询数据 | 不支持模糊匹配 | 1 |
YFMB-BUG-007 | 运费模板 | 运费模板页面,【刷新】按钮没有反应 | 1. 登录系统->进入运费模板页面 2. 点击页面上【刷新】按钮图标 | 页面数据进行刷新 | 【刷新】按钮图标没有反应 | 1 |
YFMB-BUG-008 | 运费模板 | 运费管理页面,【模板名称】输入过多的字符提示不正确 | 1. 登录系统->进入运费模板页面 2. 【模板名称】输入5000字以上字符 | 提示:字符长度超出限制 | 提示:服务器出了点小差,请稍后再试 | 2 |
YFMB-BUG-009 | 运费模板 | 运费管理页面,不可以选择偶数行的数据 | 1. 登录系统->进入运费模板页面 2. 点击偶数行的【复选框】 | 当前【复选框】行被选中 | 无法选中当前【复选框】行 | 1 |
YFMB-BUG-010 | 运费模板 | 运费管理页面,【批量删除】按钮,没有图标,不美观 | 1. 登录系统->进入运费模板页面 2. 查看【批量删除】按钮 | 建议【批量删除】按钮里添加【垃圾桶】图标,更美观 | 【批量删除】按钮,里面没有图标,不够美观 | 2 |
YFMB-BUG-011 | 运费模板 | 运费管理页面,在新增完成 运费模板时,最新的数据不是最上面 | 1. 登录系统->进入运费模板页面 2. 正确添加一条运费模板 3. 查看位置 | 最新的数据将被添加在最前面 | 最新的数据不是放置在最前面 | 1 |
XJYFMB-BUG-001 | 新增运费模板 | 新增运费模板页面,添加可以添加重复的数据 | 1. 登录系统>进入运费模板页面>点击【新增】 2. 输入页面中已有的【模板名称】 3. 点击【确定】 | 提示:模板名称已存在,请重新输入 | 添加成功 | 1 |
XJYFMB-BUG-002 | 新增运费模板 | 新增运费模板页面,【首件(个)】,可以输入负数 | 1. 登录系统>进入运费模板页面>点击【新增】 2. 输入【首件(个)】(负数) 3. 其他项输入正确 4. 点击【确定】 | 提示:请输入正确的首件(个) | 没有提示,且可以成功保存 | 1 |
XJYFMB-BUG-003 | 新增运费模板 | 新增运费模板页面,【续件(个)】,可以输入小数 | 1. 登录系统>进入运费模板页面>点击【新增】 2. 输入【续(个)】(小数) 3. 其他项输入正确 4. 点击【确定】 | 提示:请输入正确的续件(个) | 没有提示,且可以成功保存 | 1 |
XJYFMB-BUG-004 | 新增运费模板 | 新增运费模板页面,点击【按体积】单选框时,无法选择 | 1. 登录系统>进入运费模板页面>点击【新增】 2.【收费方式】点击【按体积】单选框 | 成功进入到相应页面 | 系统无反应 | 1 |
XJYFMB-BUG-005 | 新增运费模板 | 新增运费模板页面,在指定条件包裹时,输入框没有做检验,可以输入任何值 | 1. 登录系统>进入运费模板页面>点击【新增】 2. 勾选【指定条件包裹】复选框 3. 勾选【满件/重量/体积且满金额包邮】 4. 输入框输入(英文特殊字符及数字和空格组合) | 输入框进行输入数值的校验 | 输入框没有做任何校验 | 1 |
题目3:单元测试
题目描述
请使用“基本路径法”为被测源代码 GroupPurchase 类中的submitOrder()方法设计单元测试用例,并在GroupPurchaseTest类中完成单元测试代码。
【源代码功能】
某团购网站开展团购活动,用户参团下单时,如果满足成团规则即可按折扣单价成交。成团规则如下:
- 参团时间在该团购的活动时间段内:14:00:00~14:30:00;若不满足该条件,系统提示“当前时问没有正在进行中的活动”;
- 当前参团用户为“已登录”状态。若不满足该条件,系统提示“请登录”
- 该团购当前的参团用户不少于3个且团购总量不少于100。若不满足该条件,系统提示“参团用户少于3家或团购数量不足100,暂未成团”
若以上三个成团规则全部符合,则该团购的所有参团用户可按相应的折扣单价成交,具体折扣标准如下:
-
团购总量小于等于200时,成交单价打九五折;
-
团购总量大于200日小于等于500时,成交单价打九折。
-
团购总量大于500 时,成交单价打八折。
工具操作
第1步:请继续在 eclipse 中编写 Java 单元测试代码。
注意:如果您单元测试使用的是Python代码,请查看Python的单元测试题目,并在 eclipse 工具中也切换到 Python 工程中编写代码,并注意提交正确的答案。
第2步:打开题目压缩包中的【学生源码包】→【unit】文件夹,查看如下2个文件:
-
被测源代码文件 GroupPurchase.java
-
测试代码文件 GroupPurchaseTest.java
第3步:请把上述2文件复制到Eclipse 工具中对应的位置,然后开始填写单元测试代码。文件位置如下图所示:
单元测试答案代码
package cn.lanqiao.unit;import static org.junit.Assert.assertEquals;import org.junit.Before;
import org.junit.Test;import cn.lanqiao.GroupPurchse;public class GroupPurchseTest {static GroupPurchse pruchase;@Beforepublic void initGroupPurchseTest() {pruchase = new GroupPurchse();}@Testpublic void test01() {//TODOassertEquals("当前时间没有正在进行中的活动", pruchase.submitOrder("13:30:00", true, 3, 100, 300));}@Testpublic void test02() {//TODOassertEquals("当前时间没有正在进行中的活动", pruchase.submitOrder("15:30:00", true, 3, 100, 300));}@Testpublic void test03() {//TODOassertEquals("请登录", pruchase.submitOrder("14:15:00", false, 3, 100, 300));}@Testpublic void test04() {//TODOassertEquals("参团用户少于3家或团购数量不足100,暂未成团", pruchase.submitOrder("14:10:00", true, 2, 0, 50));}@Testpublic void test05() {//TODOassertEquals("参团用户少于3家或团购数量不足100,暂未成团", pruchase.submitOrder("14:15:00", true, 4, 80, 300));}@Testpublic void test06() {//TODOassertEquals("成交单价打九五折", pruchase.submitOrder("14:15:00", true, 4, 120, 120));}@Testpublic void test07() {//TODOassertEquals("成交单价打九折。", pruchase.submitOrder("14:15:00", true, 4, 300, 500));}@Testpublic void test08() {//TODOassertEquals("成交单价打八折。", pruchase.submitOrder("14:15:00", true, 4, 600, 300));}}
题目4:自动化测试 python
这里是使用python做的,题目描述的虽然是java,但大差不差
题目描述
请使用 Java 编程语言,结合 PO 模式(Page Object Model,页面对象模型)思想,使用 Selenium 自动化测试工具补全如下4个类文件中 TODO 处缺失的代码:
- Pagel:LognPage.java,“登录”页面
- Page2:FreightPage.java,“运费模板”页面
- Page3:AddFreightPage.java,“新增运费模板”页面
WebCaseTest.java:测试用例代码文件请按照用例步骤,在测试用例 WebCaseTest.java文件中通过调用3个Page 类中的方法完成自动化测试代码。
具体的操作步骤如下:
评分标准
-
3个page 类中方法的实现,每个占1.5分,共计27分。
-
WebCaseTest类文件中分别从规范、测试用例覆盖度、断言结果3个方面进行判分,共 23 分。
- 规范(共4分):未合理使用等待方法,扣4分。
- 测试用例步骤(共16分):每个步骤1分,共16分。
- 测试用例断言(共3分):每个断言1分,共3处断言,断言不正确或者不通过,则按照已通过的断言个数给分。
-
如整个项目代码编译失败,则扣除Page页中方法分和测试用例分数,但不影响规范得分。
代码实现
login_page.py
from selenium.webdriver.common.by import By
"""* Page1-【登录】页面* * * 1. 输入【用户名】* 2. 输入【密码】* 3. 点击【登录】按钮
"""class LoginPage:def __init__(self, driver):self.driver = driverdef input_login_name(self, loginName):# TODO 实现 【登录名称】输入的方法self.driver.find_element(By.XPATH, '/html/body/div[1]/div/div[2]/form/div[1]/div/div[1]/input').send_keys(loginName)def input_login_password(self, password):# TODO 实现【密码】输入的 方法self.driver.find_element(By.XPATH, '/html/body/div[1]/div/div[2]/form/div[2]/div/div/input').send_keys(password)def click_login_button(self):# TODO 实现 【登录】按钮的点击方法self.driver.find_element(By.XPATH, '/html/body/div[1]/div/div[2]/form/div[3]/div/div/input').click()
fright_page.py
from selenium.webdriver.common.by import By
"""* * * * 1. 获取登录成功后用户名文本方法2. 点击【门店管理】菜单的方法3. 点击【运费模板】菜单的方法4. 点击【+新增】按钮的方法5. 搜索项输入模板名称方法6. 点击【搜索】按钮的方法7. 点击列表【删除】按钮的方法8. 点击弹框【确定】按钮的方法9. 获取分页文本方法"""class FrightPage:def __init__(self, driver):self.driver = driverdef get_username_text(self):# TODO 实现 获取登录成功后用户名文本方法return self.driver.find_element(By.XPATH, '/html/body/div[1]/nav/div[2]/ul[2]/li/div/span').textdef click_store_meun(self):# TODO 实现 点击【门店管理】菜单的方法self.driver.find_element(By.XPATH, '/html/body/div[1]/aside/div/ul/li[3]/div').click()def click_model_meun(self):# TODO 实现 点击【运费模板】菜单的方法self.driver.find_element(By.XPATH, '/html/body/div[1]/aside/div/ul/li[3]/ul/li[4]').click()def click_add_button(self):# TODO 实现 点击【+新增】按钮的方法self.driver.find_element(By.XPATH, '/html/body/div[1]/div/main/div/div[2]/div[2]/div/div/div/div/div[2]/div/div[1]/div[1]/button[1]').click()def input_freight_name(self, name):# TODO 实现 搜索项输入模板名称方法self.driver.find_element(By.XPATH, '/html/body/div[1]/div/main/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/form/div/div/div/div/div[2]/div/div/div[1]/div/div/div/div/input').send_keys(name)def click_search_button(self):# TODO 点击【搜索】按钮的方法self.driver.find_element(By.XPATH, '/html/body/div[1]/div/main/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/form/div/div/div/div/div[2]/div/div/div[2]/div/div/button').click()def click_delete_button(self):# TODO 点击列表【删除】按钮的方法self.driver.find_element(By.XPATH, '/html/body/div[1]/div/main/div/div[2]/div[2]/div/div/div/div/div[2]/div/form/div/div[5]/div[2]/table/tbody/tr/td/div/button[2]').click()def get_page_number_text(self):# TODO 获取分页文本方法return self.driver.find_element(By.XPATH, '/html/body/div[1]/div/main/div/div[2]/div[2]/div/div/div/div/div[2]/div/div[2]/div/span[1]').textdef click_confirm_button(self):# TODO 点击弹框【确定】按钮的方法self.driver.find_element(By.XPATH, '/html/body/div[3]/div/div[3]/button[2]').click()
add_fright_page.py
from selenium.webdriver.common.by import By
"""* * * * 1. 输入模板名称【运费模板】2. 输入首件(个)【1】方法3. 输入运费(元)【2】方法4. 输入续件(个)【3】方法5. 输入续费(元)【4】方法6. 点击【确定】按钮方法"""class AddFrightPage:def __init__(self, driver):self.driver = driverdef input_freight_name(self, name):# TODO 实现 输入模板名称【运费模板】的方法self.driver.find_element(By.XPATH, '/html/body/div[1]/div/main/div/div[2]/div[2]/div/div/div/div[2]/div/div[2]/form/div[1]/div/div/input').send_keys(name)def input_firstArticle(self, num):# TODO 实现 输入输入首件(个)【1】的方法self.driver.find_element(By.XPATH, '/html/body/div[1]/div/main/div/div[2]/div[2]/div/div/div/div[2]/div/div[2]/form/div[4]/div[3]/table/tbody/tr/td[2]/div/div/div/div/input').send_keys(num ) def input_freight(self, money):# TODO 实现 输入运费(元)【2】的方法self.driver.find_element(By.XPATH, '/html/body/div[1]/div/main/div/div[2]/div[2]/div/div/div/div[2]/div/div[2]/form/div[4]/div[3]/table/tbody/tr/td[3]/div/div/div/div/input').send_keys(money)def input_contiunation(self, individual):# TODO 实现 输入续件(个)【3】的方法self.driver.find_element(By.XPATH, '/html/body/div[1]/div/main/div/div[2]/div[2]/div/div/div/div[2]/div/div[2]/form/div[4]/div[3]/table/tbody/tr/td[4]/div/div/div/div/input').send_keys(individual)def input_renew(self, money):# TODO 实现 输入续费(元)【4】的方法self.driver.find_element(By.XPATH, '/html/body/div[1]/div/main/div/div[2]/div[2]/div/div/div/div[2]/div/div[2]/form/div[4]/div[3]/table/tbody/tr/td[5]/div/div/div/div/input').send_keys(money)def click_ok_button(self):# TODO 实现 点击【确定】按钮方法self.driver.find_element(By.XPATH, '/html/body/div[1]/div/main/div/div[2]/div[2]/div/div/div/div[2]/div/div[3]/span/button[2]').click()
web_case_test.py
import unittest
from selenium import webdriver
from selenium.webdriver.firefox.service import Service
from cn.lanqiao.web.login_page import LoginPage
from cn.lanqiao.web.freight_page import FrightPage
from cn.lanqiao.web.add_freight_page import AddFrightPage
from time import sleepclass TestWebCase(unittest.TestCase):# 浏览器初始化def setUp(self):# 不要改动此处 driver 位置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)self.driver.implicitly_wait(10)self.driver.maximize_window()# TODO 打开被测系统的网址self.driver.get("http://localhost:8090/#/login")# 请在此方法中续写测试用例def test_browser(self):# 创建 login_page 对象login_page = LoginPage(self.driver)# 创建 freight_page 对象freight_page = FrightPage(self.driver)# 创建 add_freight_page 对象add_freight_page = AddFrightPage(self.driver)# TODO 请调用以上3个实例化对象中的方法完成测试用例代码(具体请参照题目中的用例步骤描述和截图)login_page.input_login_name('admin')login_page.input_login_password('LQSTesting@2004')login_page.click_login_button()sleep(1)username = freight_page.get_username_text()self.assertEqual('admin', username)freight_page.click_store_meun()freight_page.click_model_meun()freight_page.click_add_button()sleep(1)add_freight_page.input_freight_name('运费模板')add_freight_page.input_firstArticle('1')add_freight_page.input_freight('2')add_freight_page.input_contiunation('3')add_freight_page.input_renew('4')add_freight_page.click_ok_button()sleep(5)page_num = freight_page.get_page_number_text()self.assertEqual('共 4 条', page_num)freight_page.input_freight_name('运费模板')freight_page.click_search_button()freight_page.click_delete_button()freight_page.click_confirm_button()sleep(5)page_num_2 = freight_page.get_page_number_text() self.assertEqual('共 3 条', page_num_2) def tearDown(self):sleep(3)self.driver.quit()