admin管理员组文章数量:1547485
《软件测试项目实践任务书》
章节一至四(单元测试):软件测试和质量管理——课设1-CSDN博客
章节五(功能测试):软件测试和质量管理——课设2-CSDN博客
章节六(性能测试):软件测试和质量管理——课设3-CSDN博客
章节七(安全测试)至八:https://blog.csdn/qq_53229521/article/details/137379060?spm=1001.2014.3001.5502
【目的】
通过本课程的学习,要求学生掌握软件测试的基本概念、基本理论,能够根据测试任务,制定测试计划,设计测试用例集,搭建测试环境,完成单元测试、功能测试、性能测试、安全测试,获取测试结果并总结,撰写缺陷报告和综合测试报告,达到本课程的课程目标。
课程目标1:了解软件测试应用领域的相关科技文化、科技发展动态,增强“科技强国”的担当意识;认识信息化、智能化、自动化在软件测试技术发展中应用和体现,感知科学技术是第一生产力在软件测试技术中的体现;在锻炼实践动手能力的过程中培养创新意识。
课程目标2:学习软件测试的基本概念与基本原理,熟悉软件质量管理的基本概念和实施过程,理解软件测试在工程应用中的实践意义。运用测试基础知识和理论,分析测试需求、制定测试方案和测试计划、设计测试用例、搭建测试环境,构建出切实有效的实验方案。了解软件测试前沿技术,增强“科技强国”的担当意识。
课程目标3:针对用户特定的测试要求,分析测试环境,构建测试条件、组织和实施测试活动,能综合运用软件测试的理论、方法分析和解决工程测试问题。各种自动化的测试工具使用,认识信息化、智能化、自动化在软件测试技术发展中应用和体现,感知科学技术是第一生产力在软件测试技术中的体现。
课程目标4:能够独立完成本课程的设计内容,分析和总结实验过程,撰写缺陷报告并反馈到复杂工程的设计实践中,提高自身独立分析和解决实际问题的能力,在锻炼实践动手能力的过程中具备刻苦钻研的工匠精神。
【要求】
本次课程设计各自独立完成jeeSite项目指定类的单元测试、指定模块的功能测试、性能测试和安全测试,整个过程按照需求分析—>测试计划—>用例设计—>测试执行—>测试报告的流程进行,具体内容和要求参考指导书。测试的web站点为登录 - Software,登录账户为学号,密码默认为123456,可自行修改。课程考核总成绩按平时成绩*10%+阶段成果*50%+总结报告*20%+答辩测试*20%来评分,务必按照进度及时提交所需材料。
【参考资料】
1、《软件测试实验教程》,朱少明等,清华大学出版社,2019.6
2、JeeSite 快速开发平台,https://jeesite/docs/install-deploy/
3、软件测试项目实战,软件测试项目实战【不爱听书】测试全套教程以及源码_软件测试项目实战教程-CSDN博客
软件测试项目实践报告
五、功能测试
5.1 用例设计
5.1.1 登录界面
级别 | 用例 编号 | 用例名称 | 预置条件 | 执行步骤 | 预期 结果 |
Lv1 | 1.【登录界面】 | ||||
Lv1 | J_1.1 | 正确的账号及正确的密码 | 正常进入到【登录界面】,且界面显示正确,“用户名”输入文本框和“密码”输入文本框均能正常显示相关信息,“立即登陆”功能键正常响应 | ①输入正确账号和密码 ②点击“立即登录”按钮 | 登录成功,进入登陆后界面 |
J_1.2 | 正确的账号及错误的密码 | ①输入正确账号和错误密码 ②点击“立即登录”按钮 | 登录失败,提示“账号或密码错误,请重试” | ||
J_1.3 | 正确的账号及不输入密码 | ①输入正确账号,不输入密码 ②点击“立即登录”按钮 | 登录失败,提示“请填写登陆密码” | ||
J_1.4 | 错误的账号 | ①输入错误账号和任意密码 ②点击“立即登录”按钮 | 登录失败,提示“账号或密码错误,请重试” |
5.1.2 内容管理—内容发布
级别 | 用例 编号 | 用例 名称 | 预置条件 | 执行步骤 | 预期结果 | |
Lv1 | 2.【内容管理】(选择主管身份) | |||||
Lv2 | 2.1 【内容发布】 | |||||
J_2.1.0 | 进入【内容发布】 | 成功登录,进入主界面,用户为主管身份 | ①点击左侧栏【内容管理】 ②选择【内容发布】 | 正常进入,且右侧界面显示已有的站点列表和该站点内文章列表 | ||
Lv3 | 2.1.1 【站点切换】 | |||||
J_2.1.1 | 选择不同站点 | 进入【内容发布】界面 | ①点击右侧界面站点列表中当前列表名旁的下拉箭头 ②选择要切换的站点 | 正常进入到要切换到的站点,且右侧界面显示该站点内文章列表 | ||
Lv3 | 2.1.2 【查询文章】 (输入文本框:栏目编码、内容标题、关键字、状态) | |||||
J_2.1.2.0 | 输入文本框不输入任何信息 | 进入【内容发布】界面,点击右上角【查询】功能键正常响应,4个【输入文本框】均能正常显示相关信息,下方【查询】按钮正常响应 | ①点击右上角“查询”按钮 ②点击下方“查询”按钮 | 查询成功,展示所有文章列表 | ||
J_2.1.2.1 | 选1个文本框输入对应信息 | ①点击右上角“查询”按钮 ②选择4个输入栏中任意1栏输入相应信息 ③点击下方“查询”按钮 | 查询成功,展示符合要求的对应文章列表 | |||
J_2.1.2.2 | 选2个文本框输入对应信息 | ①点击右上角“查询”按钮 ②选择4个输入栏中任意2栏输入相应信息 ③点击下方“查询”按钮 | 查询成功,展示符合要求的对应文章列表 | |||
J_2.1.2.3 | 选3个文本框输入对应信息 | ①点击右上角“查询”按钮 ②选择4个输入栏中任意3栏输入相应信息 ③点击下方“查询”按钮 | 查询成功,展示符合要求的对应文章列表 | |||
J_2.1.2.4 | 4个文本框均输入对应信息 | ①点击右上角“查询”按钮 ②4个输入栏输入信息 ③点击下方“查询”按钮 | 查询成功,展示符合要求的对应文章列表 | |||
J_2.1.2.5 | 重置 | ①点击右上角“查询”按钮 ②点击下方“重置”按钮 | 重置成功,4个输入栏的内容清空,展示当前站内所有文章列表 | |||
Lv3 | 2.1.3 【新增文章】 (必填信息栏:所属栏目、来源、内容标题、正文;选填信息栏:外部链接、权重、权重过期日期、摘要、内容图片、关键字、自定义内容视图、视图参数配置、备注信息、拓展字段) | |||||
J_2.1.3.0 | 不输入任何信息 | 进入【内容发布】界面,点击右上角【新增】功能键正常响应,进入【新增文章】界面。 【新增文章】界面内的所有输入文本框均能正常显示相关信息,“保存”按钮正常响应 | ①点击下方“保存”按钮 | 新增失败,提示“您填写的信息有误,请根据提示修正”,4个必填信息栏目处均提示“必填信息” | ||
J_2.1.3.1 | 部分必填信息栏输入信息 | ①部分必填信息栏输入信息 ②点击下方“保存”按钮 | 新增失败,提示“您填写的信息有误,请根据提示修正”,未输入的必填信息栏目处提示“必填信息” | |||
J_2.1.3.2 | 所有必填信息栏均输入信息 | ①所有必填信息栏输入信息 ②点击下方“保存”按钮 | 新增成功,提示“保存文章表成功!”,界面返回到【内容发布】界面,新增文章出现在列表中 | |||
J_2.1.3.3 | 所有必填信息栏和1或多个选填信息栏输入信息 | ①所有必填信息栏输入信息 ②选择1或多个选填信息栏输入信息 ③点击下方“保存”按钮 | 新增成功,提示“保存文章表成功!”,界面返回到【内容发布】界面,新增文章出现在列表中 | |||
Lv3 | 2.1.4 【删除文章】 | |||||
J_2.1.4.1 | 删除文章 | 进入【内容发布】界面,展示站点内文章,文章行“删除文章”按钮正常响应 | ①点击要删除文章所在行的“删除文章”按钮 | 删除成功,提示“删除文章表成功!”,【内容发布】界面中要删除的文章不出现在列表 | ||
Lv3 | 2.1.5 【停用文章】 | |||||
J_2.1.5.1 | 停用文章 | 进入【内容发布】界面,展示该站点内文章,各文章行的“停用”按钮正常响应 | ①点击要停用文章所在行的“停用文章”按钮 | 停用成功,提示“停用文章表成功”,该文章行的“停用文章”按钮变为“启用文章”按钮,状态由“正常”变为“停用”,“预览文章”按钮消失 | ||
Lv3 | 2.1.6 【启用文章】 | |||||
J_2.1.6.1 | 启用文章 | 进入【内容发布】界面,展示该站点内文章,已停用的文章“启用”按钮正常响应 | ①点击已经停用的文章中要启用的文章所在行的“启用文章”按钮 | 启用成功,提示“启用文章表成功”,该文章行的“启用文章”按钮变为“停用文章”按钮,状态由“停用”变为“正常”,“预览文章”按钮出现 | ||
Lv3 | 2.1.7 【预览文章】 | |||||
J_2.1.7.1 | 预览文章 | 进入【内容发布】界面,展示站点内文章,文章行的“预览”按钮正常响应 | ①点击要预览文章所在行的“预览文章”按钮 | 预览成功,显示所选文章的代码形式内容 | ||
Lv3 | 2.1.8 【编辑文章】 (必填信息栏:所属栏目、来源、内容标题、正文;选填信息栏:外部链接、权重、权重过期日期、摘要、内容图片、关键字、自定义内容视图、视图参数配置、备注信息、拓展字段) | |||||
J_2.1.8.1 | 不修改 | 进入【内容发布】界面,展示该站点内文章,各文章行的“编辑文章”按钮正常响应,进入【编辑文章】界面。【编辑文章】界面内的所有输入文本框均能正常显示相关信息,“保存”按钮正常响应 | ①点击“保存”按钮 | 编辑成功,提示“保存文章表成功!”,界面返回【内容发布】界面 | ||
J_2.1.8.2 | 修改内容但不清空必填信息栏数据 | ①修改内容(不清空必填信息) ②点击“保存”按钮 | 编辑成功,提示“保存文章表成功!”,界面返回【内容发布】界面 | |||
J_2.1.8.3 | 修改内容,清空必填信息栏任意栏的数据 | ①修改内容 ②清空任意的必填信息栏数据 ③点击“保存”按钮 | 编辑失败,提示“您填写的信息有误,请根据提示修正”,未填写的必填信息栏目处提示“必填信息” | |||
Lv3 | 2.1.9 【文章排序】 (排序依据:标题、栏目、权重、点击数、字数、状态、创建时间) | |||||
J_2.1.9.1 | 文章排序 | 进入【内容发布】界面,文章列表的首行排序箭头正常响应 | ①点击任意排序依据名称 ②选择上下箭头(正序/逆序) | 排序成功,【内容发布】界面中列表按选择的排序依据对应规则排序 | ||
Lv3 | 2.1.10 【访问网站】 | |||||
J_2.1.10.1 | 访问网站 | 进入【内容发布】界面,【访问网站】按钮正常响应 | ①点击“访问网站”按钮 | 访问成功,进入JeeSite首页网站 |
5.1.3 内容管理—栏目管理
级别 | 用例 编号 | 用例名称 | 预置条件 | 执行步骤 | 预期结果 | |
Lv1 | 2.【内容管理】(选择主管身份) | |||||
Lv2 | 2.2 【栏目管理】 | |||||
J_2.2.0 | 进入【栏目管理】 | 成功登录,进入主界面,用户为主管身份 | ①点击左侧栏【内容管理】 ②选择【栏目管理】 | 正常进入,且右侧界面显示所在站点的1级栏目 | ||
Lv3 | 2.2.1 【站点切换】 | |||||
J_2.2.1 | 选择不同站点 | 进入【栏目管理】界面 | ①点击右侧界面栏目管理当前站点名旁的下拉箭头 ②选择要切换的站点 | 正常进入到要切换到的站点,且右侧界面显示该站点内栏目列表 | ||
Lv3 | 2.2.2 【查询栏目】 (输入文本框:栏目名称、模块类型、状态、备注信息) | |||||
J_2.2.2.0 | 输入文本框不输入任何信息 | 进入【栏目管理】界面,点击右上角【查询】功能键正常响应,4个【输入文本框】均能正常显示相关信息,下方【查询】按钮正常响应 | ①点击右上角“查询”按钮 ②点击下方“查询”按钮 | 查询成功,展示所有栏目列表 | ||
J_2.2.2.1 | 选1个文本框输入对应信息 | ①点击右上角“查询”按钮 ②选择4个输入栏中任意1栏输入相应信息 ③点击下方“查询”按钮 | 查询成功,展示符合要求的对应栏目列表 | |||
J_2.1.2.2 | 选2个文本框输入对应信息 | ①点击右上角“查询”按钮 ②选择4个输入栏中任意2栏输入相应信息 ③点击下方“查询”按钮 | 查询成功,展示符合要求的对应栏目列表 | |||
J_2.1.2.3 | 选3个文本框输入对应信息 | ①点击右上角“查询”按钮 ②选择4个输入栏中任意3栏输入相应信息 ③点击下方“查询”按钮 | 查询成功,展示符合要求的对应栏目列表 | |||
J_2.1.2.4 | 4个文本框均输入对应信息 | ①点击右上角“查询”按钮 ②4个输入栏输入相应信息 ③点击下方“查询”按钮 | 查询成功,展示符合要求的对应栏目列表 | |||
J_2.1.2.5 | 重置 | ①点击右上角“查询”按钮 ②点击下方“重置”按钮 | 重置成功,4个输入栏的内容清空,展示当前站内所有栏目列表 | |||
Lv3 | 2.2.3 【新增栏目】 (必填信息栏:栏目名称;默认已有数据信息栏:栏目编码、归属站点、内容模型、排序号、是否在导航中显示、是否允许评论、是否在分类页中显示、是否需要审核、内容展现模式;选填信息栏:上级栏目、栏目图片、外部连接、超链接目标窗口、栏目描述信息、栏目关键字、自定义列表视图、自定义内容视图、视图参数配置、备注信息、拓展字段) | |||||
J_2.2.3.0 | 不输入任何信息 | 进入【栏目管理】界面,点击右上角【新增】功能键正常响应,进入【新增栏目】界面。 【新增栏目】界面内的所有输入文本框均能正常显示相关信息,“保存”按钮正常响应 | ①点击下方“保存”按钮 | 新增失败,提示“您填写的信息有误,请根据提示修正”,“栏目名称”栏处均提示“必填信息” | ||
J_2.2.3.1 | “栏目名称”栏不输入信息,选填信息栏输入信息 | ①“栏目名称”栏不输入信息 ②点击下方“保存”按钮 | 新增失败,提示“您填写的信息有误,请根据提示修正”,“栏目名称”栏处均提示“必填信息” | |||
J_2.2.3.2 | “栏目名称”栏输入信息,选填信息栏不输入信息 | ①“栏目名称”栏输入信息 ②点击下方“保存”按钮 | 新增成功,提示“保存栏目表成功!”,界面返回【栏目管理】界面,新增栏目出现在列表 | |||
J_2.2.3.3 | 必填信息栏和1或多个选填信息栏输入信息 | ①“栏目名称”栏输入信息 ②选择1或多个选填信息栏输入信息 ③点击下方“保存”按钮 | 新增成功,提示“保存栏目表成功!”,界面返回【栏目管理】界面,新增栏目出现在列表 | |||
Lv3 | 2.2.4 【删除栏目】 | |||||
J_2.2.4.1 | 删除栏目 | 进入【栏目管理】界面,展示站内栏目,栏目行“删除栏目”按钮正常响应 | 1.点击要删除栏目所在行的“删除栏目表”按钮 | 删除成功,提示“删除栏目表成功!”,【栏目管理】界面中要删除的栏目不出现在列表 | ||
Lv3 | 2.2.5 【停用栏目】 | |||||
J_2.2.5.1 | 停用子级栏目 | 进入【栏目管理】界面,展示站内栏目,栏目行“停用栏目表”按钮正常响应 | 1.点击要停用的子级栏目所在行的“停用栏目表”按钮 | 停用成功,提示“停用栏目表成功”,该栏目行的“停用栏目表”按钮变为“启用栏目表”按钮,“访问栏目”按钮消失 | ||
J_2.2.5.2 | 停用父级栏目但其目录下栏目未全部停用 | 1.点击要停用的父级栏目所在行的“停用栏目表”按钮 | 停用失败,提示“该栏目表包含未停用的子栏目表!” | |||
J_2.2.5.2 | 停用父级栏目且其目录下栏目全停用 | 1.点击要停用的父级栏目所在行的“停用栏目表”按钮 | 停用成功,提示“停用栏目表成功”,该栏目行的“停用栏目表”按钮变为“启用栏目表”按钮,“访问栏目”按钮消失,且其目录下栏目消失 | |||
Lv3 | 2.2.6 【启用栏目】 | |||||
J_2.2.6.1 | 启用栏目 | 进入【栏目管理】界面,展示站内栏目,已停用的栏目“启用栏目表”按钮正常响应 | 1.点击已经停用的栏目中要启用的栏目所在行的“启用栏目表”按钮 | 启用成功,提示“启用栏目表成功”,该栏目行的“启用栏目表”按钮变为“停用栏目表”按钮,“访问栏目”按钮出现 | ||
Lv3 | 2.2.7 【访问栏目】 | |||||
J_2.2.7.1 | 访问栏目 | 进入【栏目管理】界面,展示站内栏目,栏目行“访问栏目”按钮正常响应 | 1.点击要停用文章所在行的“预览文章”按钮 | 访问成功,进入【列表页面】网站 | ||
Lv3 | 2.2.8 【编辑栏目表】 (必填信息栏:栏目名称;默认已有数据信息栏:栏目编码、归属站点、内容模型、排序号、是否在导航中显示、是否允许评论、是否在分类页中显示、是否需要审核、内容展现模式;选填信息栏:上级栏目、栏目图片、外部连接、超链接目标窗口、栏目描述信息、栏目关键字、自定义列表视图、自定义内容视图、视图参数配置、备注信息、拓展字段) | |||||
J_2.2.8.1 | 不修改 | 进入【栏目管理】界面,展示站内栏目,各栏目行的“编辑栏目表”按钮正常响应,进入【编辑栏目表】界面。【编辑栏目表】界面内的所有输入文本框均正常显示相关信息,“保存”按钮正常响应 | 1.点击“保存”按钮 | 提示“保存栏目表成功!”,界面返回到【栏目管理】界面 | ||
J_2.2.8.2 | 修改内容但不清空必填信息栏数据 | 1.修改内容(不清空“栏目名称”) 2.点击“保存”按钮 | 提示“保存栏目表成功!”,界面返回到【栏目管理】界面 | |||
J_2.2.8.3 | 修改内容,清空必填信息栏数据 | 1.修改内容 2.清空“栏目名称”数据 3.点击“保存”按钮 | 提示“您填写的信息有误,请根据提示修正”,“栏目名称”栏提示“必填信息” | |||
Lv3 | 2.2.9 【新增下级栏目表】 (必填信息栏:栏目名称;默认已有数据信息栏:上级栏目、栏目编码、归属站点、内容模型、排序号、是否在导航中显示、是否允许评论、是否在分类页中显示、是否需要审核、内容展现模式;选填信息栏:栏目图片、外部连接、超链接目标窗口、栏目描述信息、栏目关键字、自定义列表视图、自定义内容视图、视图参数配置、备注信息、拓展字段) | |||||
J_2.2.9.0 | 不输入任何信息 | 进入【栏目管理】界面,点击右上角【新增】功能键正常响应,进入【新增栏目】界面。 【新增栏目】界面内的所有输入文本框均能正常显示相关信息,“保存”按钮正常响应 | ①点击下方“保存”按钮 | 新增失败,提示“您填写的信息有误,请根据提示修正”,“栏目名称”栏处均提示“必填信息” | ||
J_2.2.9.1 | “栏目名称”栏不输入信息,选填信息栏输入信息 | ①“栏目名称”栏不输入信息 ②点击下方“保存”按钮 | 新增失败,提示“您填写的信息有误,请根据提示修正”,“栏目名称”栏处均提示“必填信息” | |||
J_2.2.9.2 | “栏目名称”栏输入信息,选填信息栏不输入信息 | ①“栏目名称”栏输入信息 ②点击下方“保存”按钮 | 新增成功,提示“保存栏目表成功!”,界面返回【栏目管理】界面,新增栏目出现在列表 | |||
J_2.2.9.3 | “栏目名称”栏和1或多个选填信息栏输入信息 | ①“栏目名称”栏输入信息 ②选择1或多个选填信息栏输入信息 ③点击下方“保存”按钮 | 新增成功,提示“保存栏目表成功!”,界面返回【栏目管理】界面,新增栏目出现在列表 | |||
Lv3 | 2.2.10 【栏目展开】 | |||||
J_2.2. 10.1 | 栏目展开 | 进入【栏目管理】界面,栏目表的“展开”按钮正常响应 | 1.点击“展开”按钮 | 【栏目管理】界面中列表展示所有1级栏目 | ||
Lv3 | 2.2.10 【栏目折叠/刷新】 | |||||
J_2.2. 11.1 | 栏目折叠 | 进入【栏目管理】界面,栏目表的“折叠”/“刷新”按钮正常响应 | 1.点击“折叠”/“刷新”按钮 | 【栏目管理】界面中列表展示所有栏目 |
5.1.4 内容管理—站点设置
级别 | 用例 编号 | 用例 名称 | 预置条件 | 执行步骤 | 预期结果 | |
Lv1 | 2.【内容管理】(选择主管身份) | |||||
Lv2 | 2.3 【站点设置】 | |||||
J_2.1.0 | 进入【内容发布】 | 成功登录,进入主界面,用户为主管身份 | ①点击左侧栏【内容管理】 ②选择【站点设置】 | 正常进入,且右侧界面显示所有站点列表 | ||
Lv3 | 2.3.1 【查询站点】 (输入文本框:站点名称、站点标题、站点域名、状态) | |||||
J_2.3.1.0 | 输入文本框不输入任何信息 | 进入【站点设置】界面,点击右上角【查询】功能键正常响应,4个【输入文本框】均能正常显示相关信息,下方【查询】按钮正常响应 | ①点击右上角“查询”按钮 ②点击下方“查询”按钮 | 查询成功,展示所有站点列表 | ||
J_2.3.1.1 | 选1个文本框输入对应信息 | ①点击右上角“查询”按钮 ②选择4个输入栏中任意1栏输入相应信息 ③点击下方“查询”按钮 | 查询成功,展示符合要求的对应站点列表 | |||
J_2.3.1.2 | 选2个文本框输入对应信息 | ①点击右上角“查询”按钮 ②选择4个输入栏中任意2栏输入相应信息 ③点击下方“查询”按钮 | 查询成功,展示符合要求的对应站点列表 | |||
J_2.3.1.3 | 选3个文本框输入对应信息 | ①点击右上角“查询”按钮 ②选择4个输入栏中任意3栏输入相应信息 ③点击下方“查询”按钮 | 查询成功,展示符合要求的对应站点列表 | |||
J_2.3.1.4 | 4个文本框均输入对应信息 | ①点击右上角“查询”按钮 ②4个输入栏输入信息 ③点击下方“查询”按钮 | 查询成功,展示符合要求的对应站点列表 | |||
J_2.3.1.5 | 重置 | ①点击右上角“查询”按钮 ②点击下方“重置”按钮 | 重置成功,4个输入栏的内容清空,展示当前站内所有站点列表 | |||
Lv3 | 2.3.2 【新增站点】 (必填信息栏:站点名称、站点编码、站点标题、版权信息;已有数据信息栏:主题风格、首页视图;选填信息栏:站点域名、站点排序、站点logo、描述、关键字、备注信息) | |||||
J_2.3.2.0 | 不输入任何信息 | 进入【站点设置】界面,点击右上角【新增】功能键正常响应,进入【新增站点】界面。【新增站点】界面内的所有输入文本框均能正常显示相关信息,“保存”按钮正常响应 | ①点击下方“保存”按钮 | 新增失败,提示“您填写的信息有误,请根据提示修正”,未输入的必填信息栏处提示“必填信息” | ||
J_2.3.2.1 | 选部分必填信息栏输入信息 | ①选择部分必填信息栏输入信息 ②点击下方“保存”按钮 | 新增失败,提示“您填写的信息有误,请根据提示修正”,未输入的必填信息栏处提示“必填信息” | |||
J_2.3.2.2 | 所有必填信息栏均输入信息但“站点编码”已存在 | ①所有必填信息栏输入信息但“站点编码”输入已存在的编码号 ②点击下方“保存”按钮 | 新增失败,提示“编码已存在” | |||
J_2.3.2.3 | 所有必填信息栏均输入信息且“站点编码”不存在 | ①所有必填信息栏输入信息且“站点编码”输入不存在的编码号 ②点击下方“保存”按钮 | 新增成功,提示“保存站点表成功!”,界面返回到【站点管理】界面,新增站点出现在列表中 | |||
J_2.3.2.4 | 所有必填信息栏和1或多个选填信息栏输入信息 | ①所有必填信息栏输入信息 ②选择1或多个选填信息栏输入信息 ③点击下方“保存”按钮 | 新增成功,提示“保存站点表成功!”,界面返回到【站点管理】界面,新增站点出现在列表中 | |||
Lv3 | 2.3.3 【删除站点】 | |||||
J_2.3.3.1 | 删除站点 | 进入【站点设置】界面,展示所有站点,站点行“删除站点”按钮正常响应 | ①点击要删除站点所在行的“删除站点”按钮 | 删除成功,提示“删除站点表成功!”,【站点设置】界面中要删除的站点不出现在列表 | ||
Lv3 | 2.3.4 【停用站点】 | |||||
J_2.3.4.1 | 停用站点 | 进入【站点设置】界面,展示所有站点,站点行“停用站点”按钮正常响应 | ①点击要停用站点所在行的“停用站点”按钮 | 停用成功,提示“停用站点表成功”,该站点行的“停用站点”按钮变为“启用站点”按钮,状态由“正常”变为“停用”,“访问站点”按钮消失 | ||
Lv3 | 2.3.5 【启用站点】 | |||||
J_2.3.5.1 | 启用站点 | 进入【站点设置】界面,展示所有站点,已停用的站点“启用”按钮正常响应 | ①点击已经停用的站点中要启用的站点所在行的“启用站点”按钮 | 启用成功,提示“启用站点表成功”,该站点行的“启用站点”按钮变为“停用站点”按钮,状态由“停用”变为“正常”,“访问站点”按钮出现 | ||
Lv3 | 2.3.6 【访问站点】 | |||||
J_2.3.6.1 | 访问站点 | 进入【站点设置】界面,展示所有站点,站点行的“访问”按钮正常响应 | ①点击要访问站点所在行的“访问站点”按钮 | 访问成功,进入对应站点网站 | ||
Lv3 | 2.3.7 【编辑站点】 (必填信息栏:站点名称、站点标题、版权信息;已有数据信息栏:主题风格、首页视图;选填信息栏:站点域名、站点排序、站点logo、描述、关键字、备注信息;不可更改:站点编码) | |||||
J_2.3.7.1 | 不修改 | 进入【站点设置】界面,展示所有站点,各站点行的“编辑站点”按钮正常响应,进入【编辑站点】界面。【编辑站点】界面内的所有输入文本框均能正常显示相关信息,“保存”按钮正常响应 | ①点击“保存”按钮 | 编辑成功,提示“保存站点表成功!”,界面返回【站点设置】界面 | ||
J_2.3.7.2 | 修改内容但不清空必填信息栏数据 | ①修改内容(不清空必填信息) ②点击“保存”按钮 | 编辑成功,提示“保存站点表成功!”,界面返回【站点设置】界面 | |||
J_2.3.7.3 | 修改内容,清空必填信息栏任意栏的数据 | ①修改内容 ②清空任意的必填信息栏数据 ③点击“保存”按钮 | 编辑失败,提示“您填写的信息有误,请根据提示修正”,未填写的必填信息栏目处提示“必填信息” | |||
Lv3 | 2.3.8 【站点排序】 (排序依据:站点名称、站点标题、站点域名、描述、主题、状态、创建时间) | |||||
J_2.3.8.1 | 站点排序 | 进入【站点设置】界面,站点列表的首行排序箭头正常响应 | ①点击任意排序依据名称 ②选择上下箭头(正序/逆序) | 排序成功,【站点设置】界面中站点按选择的排序依据对应规则排序 |
5.1.5 内容管理—模板管理
级别 | 用例 编号 | 用例 名称 | 预置条件 | 执行步骤 | 预期结果 |
Lv1 | 2.【内容管理】(选择主管身份) | ||||
Lv2 | 2.4 【模板管理】 | ||||
J_2.4.0 | 进入【模板管理】 | 成功登录,进入主界面,用户为主管身份 | ①点击左侧栏【内容管理】 ②选择【模板管理】 | 正常进入,且右侧界面显示【模板目录】 | |
Lv3 | 2.4.1 【查看模板内容】 | ||||
J_2.4.1.1 | 查看模板内容 | 进入【模板管理】界面,展示模板目录 | ①在【模板目录】中进入要查看的模板路径 ②选择要查看的模板 | 查看成功,右侧界面出现【模板内容】,显示模板的文件名和代码 | |
Lv3 | 2.4.2 【修改模板文件名】 | ||||
J_2.4.2.1 | 修改模板文件名 | 进入【模板管理】界面,展示模板目录,进入到要修改文件名的模板中 | ①修改【模板内容】中的文件名 | 由于无权限,无法修改 | |
Lv3 | 2.4.3 【修改模板代码】 | ||||
J_2.4.3.1 | 修改模板代码 | 进入【模板管理】界面,展示模板目录,进入到要修改代码的模板中 | ①修改【模板内容】中的具体代码 | 由于无权限,无法修改 |
5.2 测试执行
使用Chrome浏览器,并在URL地址栏中输入网址,输入账号密码,进入主界面。
点击安装好的浏览器插件Selenium,并在URL地址栏中分别输入4个对应模块的网址,根据前面设计的用例进行脚本录制。Selenium会录制用户的一系列操作,并将这些操作转换为指令集存储下来。
录制完脚本后,还需要检查和微调测试脚本,以确保脚本能够流畅进行,没有额外人为的Bug。随后,点击执行测试按钮后,Selenium将执行脚本中的指令集。当测试完脚本可以正常通过后,将其导出为Junit测试用例。
5.2.1 内容发布
(1)脚本录制
(2)导出代码
// Generated by Selenium IDE
import org.junit.Test;
import org.junit.Before;
import org.junit.After;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.core.IsNot.not;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.Alert;
import org.openqa.selenium.Keys;
import java.util.*;
import java.MalformedURLException;
import java.URL;
public class NeiRongFaBuTest {
private WebDriver driver;
private Map<String, Object> vars;
JavascriptExecutor js;
@Before
public void setUp() {
driver = new ChromeDriver();
js = (JavascriptExecutor) driver;
vars = new HashMap<String, Object>();
}
@After
public void tearDown() {
driver.quit();
}
public String waitForWindow(int timeout) {
try {
Thread.sleep(timeout);
} catch (InterruptedException e) {
e.printStackTrace();
}
Set<String> whNow = driver.getWindowHandles();
Set<String> whThen = (Set<String>) vars.get("window_handles");
if (whNow.size() > whThen.size()) {
whNow.removeAll(whThen);
}
return whNow.iterator().next();
}
@Test
public void neiRongFaBu() {
driver.get("http://47.96.163.225:8080/js/a/index#/js/a/cms/index#%E5%86%85%E5%AE%B9%E5%8F%91%E5%B8%83");
driver.manage().window().setSize(new Dimension(1146, 680));
{
WebElement element = driver.findElement(By.id("switchSkin"));
Actions builder = new Actions(driver);
builder.moveToElement(element).perform();
}
{
WebElement element = driver.findElement(By.tagName("body"));
Actions builder = new Actions(driver);
builder.moveToElement(element, 0, 0).perform();
}
// 1.切换站点
driver.switchTo().frame(1);
driver.findElement(By.cssSelector(".caret")).click();
driver.findElement(By.linkText("JeeSite")).click();
driver.findElement(By.cssSelector(".dropdown-toggle")).click();
driver.findElement(By.linkText("Rql的站点")).click();
// 2.访问网站
driver.switchTo().frame(0);
vars.put("window_handles", driver.getWindowHandles());
driver.findElement(By.linkText("访问网站")).click();
vars.put("win583", waitForWindow(2000));
vars.put("root", driver.getWindowHandle());
driver.switchTo().window(vars.get("win583").toString());
driver.close();
// 3.查询文章
driver.switchTo().window(vars.get("root").toString());
driver.switchTo().frame(1);
driver.switchTo().frame(0);
driver.findElement(By.id("btnSearch")).click();
driver.findElement(By.id("categoryCode")).click();
driver.findElement(By.id("categoryCode")).sendKeys("114516001");
driver.findElement(By.cssSelector(".btn-primary")).click();
driver.findElement(By.id("categoryCode")).click();
driver.findElement(By.id("categoryCode")).sendKeys(" ", Keys.BACKSPACE, " ", Keys.BACKSPACE, Keys.BACKSPACE, Keys.BACKSPACE, Keys.BACKSPACE, Keys.BACKSPACE, Keys.BACKSPACE, " ", Keys.BACKSPACE, " ", Keys.BACKSPACE, " ", Keys.BACKSPACE, " ", Keys.BACKSPACE, " ", Keys.BACKSPACE, " ", Keys.BACKSPACE, " ", Keys.BACKSPACE);
driver.findElement(By.id("title")).click();
driver.findElement(By.id("title")).sendKeys("项目");
driver.findElement(By.cssSelector(".btn-primary")).click();
driver.findElement(By.id("title")).click();
driver.findElement(By.id("title")).sendKeys("2");
driver.findElement(By.cssSelector(".btn-primary")).click();
{
WebElement element = driver.findElement(By.cssSelector(".btn-primary"));
Actions builder = new Actions(driver);
builder.moveToElement(element).perform();
}
{
WebElement element = driver.findElement(By.tagName("body"));
Actions builder = new Actions(driver);
builder.moveToElement(element, 0, 0).perform();
}
driver.findElement(By.id("title")).click();
driver.findElement(By.id("title")).sendKeys(" ", Keys.BACKSPACE, " ", Keys.BACKSPACE, " ", Keys.BACKSPACE);
driver.findElement(By.id("keywords")).click();
driver.findElement(By.id("keywords")).sendKeys("1");
driver.findElement(By.cssSelector(".btn-primary")).click();
driver.findElement(By.id("keywords")).click();
driver.findElement(By.id("keywords")).sendKeys(" ", Keys.BACKSPACE);
driver.findElement(By.id("select2-status-container")).click();
driver.findElement(By.cssSelector(".btn-primary")).click();
driver.findElement(By.cssSelector(".select2-selection__arrow")).click();
driver.findElement(By.cssSelector(".btn-primary")).click();
driver.findElement(By.id("select2-status-container")).click();
driver.findElement(By.cssSelector(".btn-primary")).click();
driver.findElement(By.id("categoryCode")).click();
driver.findElement(By.id("categoryCode")).sendKeys("114516001");
driver.findElement(By.cssSelector(".btn-primary")).click();
driver.findElement(By.id("select2-status-container")).click();
driver.findElement(By.cssSelector(".btn-primary")).click();
{
WebElement element = driver.findElement(By.cssSelector(".btn-primary"));
Actions builder = new Actions(driver);
builder.moveToElement(element).perform();
}
{
WebElement element = driver.findElement(By.tagName("body"));
Actions builder = new Actions(driver);
builder.moveToElement(element, 0, 0).perform();
}
driver.findElement(By.id("title")).click();
driver.findElement(By.id("title")).sendKeys("实验");
driver.findElement(By.cssSelector(".btn-primary")).click();
driver.findElement(By.cssSelector(".isQuick")).click();
vars.put("window_handles", driver.getWindowHandles());
driver.findElement(By.xpath("//tr[@id=\'1669631558595641344\']/td[9]/a[4]/i")).click();
vars.put("win3323", waitForWindow(2000));
driver.switchTo().window(vars.get("win3323").toString());
driver.close();
driver.switchTo().window(vars.get("root").toString());
// 4.停用文章
driver.switchTo().frame(1);
driver.switchTo().frame(0);
driver.findElement(By.cssSelector("#\\31 669631558595641344 .glyphicon")).click();
driver.switchTo().defaultContent();
driver.switchTo().defaultContent();
driver.findElement(By.linkText("确定")).click();
// 5.启用文章
driver.switchTo().frame(1);
driver.switchTo().frame(0);
driver.findElement(By.cssSelector("#\\31 669631558595641344 .glyphicon")).click();
driver.switchTo().defaultContent();
driver.switchTo().defaultContent();
driver.findElement(By.linkText("确定")).click();
// 6.新增文章
driver.switchTo().frame(1);
driver.switchTo().frame(0);
driver.findElement(By.linkText("新增")).click();
driver.switchTo().defaultContent();
driver.switchTo().defaultContent();
driver.switchTo().frame(2);
driver.findElement(By.id("categoryName")).click();
driver.switchTo().defaultContent();
driver.switchTo().frame(3);
driver.findElement(By.id("tree_10_ico")).click();
driver.findElement(By.id("tree_12_ico")).click();
driver.switchTo().defaultContent();
driver.findElement(By.linkText("确定")).click();
driver.switchTo().frame(2);
driver.findElement(By.id("title")).click();
js.executeScript("window.scrollTo(0,475.3333435058594)");
driver.findElement(By.id("title")).sendKeys("多肉葡萄");
driver.findElement(By.id("btnSubmit")).click();
{
WebElement element = driver.findElement(By.id("btnSubmit"));
Actions builder = new Actions(driver);
builder.moveToElement(element).perform();
}
{
WebElement element = driver.findElement(By.tagName("body"));
Actions builder = new Actions(driver);
builder.moveToElement(element, 0, 0).perform();
}
driver.findElement(By.cssSelector(".focus > .iCheck-helper")).click();
driver.switchTo().frame(1);
driver.findElement(By.cssSelector(".view:nth-child(2)")).click();
driver.switchTo().defaultContent();
js.executeScript("window.scrollTo(0,466.6666564941406)");
driver.switchTo().frame(1);
{
WebElement element = driver.findElement(By.cssSelector(".view:nth-child(2)"));
js.executeScript("if(arguments[0].contentEditable === 'true') {arguments[0].innerText = '<p>好喝!</p>'}", element);
}
driver.switchTo().defaultContent();
{
WebElement element = driver.findElement(By.id("btnSubmit"));
Actions builder = new Actions(driver);
builder.moveToElement(element).perform();
}
driver.findElement(By.id("btnSubmit")).click();
driver.switchTo().defaultContent();
// 7.修改文章
driver.switchTo().frame(1);
driver.switchTo().frame(0);
{
WebElement element = driver.findElement(By.cssSelector(".disabled:nth-child(1) > a"));
Actions builder = new Actions(driver);
builder.moveToElement(element).perform();
}
driver.findElement(By.cssSelector("#\\31 669641308951543808 .fa-pencil")).click();
driver.switchTo().defaultContent();
driver.switchTo().defaultContent();
driver.switchTo().frame(2);
driver.findElement(By.id("title")).sendKeys("好多葡萄的多肉葡萄");
driver.findElement(By.id("description")).click();
driver.findElement(By.id("description")).sendKeys("多肉葡萄的摘要");
driver.switchTo().frame(1);
driver.findElement(By.cssSelector("p")).click();
driver.switchTo().defaultContent();
js.executeScript("window.scrollTo(0,489.3333435058594)");
driver.switchTo().frame(1);
{
WebElement element = driver.findElement(By.cssSelector(".view:nth-child(2)"));
js.executeScript("if(arguments[0].contentEditable === 'true') {arguments[0].innerText = '<!--HTML--><p>好喝!好多葡萄!</p>'}", element);
}
driver.switchTo().defaultContent();
driver.findElement(By.id("keywords")).click();
js.executeScript("window.scrollTo(0,940)");
driver.findElement(By.id("keywords")).sendKeys("葡萄");
driver.findElement(By.id("weight")).click();
driver.findElement(By.id("weight")).sendKeys("3");
driver.findElement(By.id("weightDate")).click();
driver.findElement(By.cssSelector(".laydate-btns-confirm")).click();
js.executeScript("window.scrollTo(0,524.6666870117188)");
driver.findElement(By.cssSelector(".fa-plus")).click();
driver.findElement(By.id("articleData_extend_extendS1")).click();
driver.findElement(By.id("articleData_extend_extendS1")).sendKeys("1111");
driver.findElement(By.cssSelector(".box-body:nth-child(2)")).click();
driver.findElement(By.id("articleData_extend_extendS2")).click();
driver.findElement(By.id("articleData_extend_extendS2")).sendKeys("2222");
driver.findElement(By.id("btnSubmit")).click();
driver.switchTo().defaultContent();
// 8.预览文章
driver.switchTo().frame(1);
driver.switchTo().frame(0);
driver.findElement(By.cssSelector("#\\31 669641308951543808 .fa-globe")).click();
driver.switchTo().defaultContent();
driver.switchTo().defaultContent();
driver.findElement(By.linkText("确定")).click();
// 9.删除文章
driver.switchTo().frame(1);
driver.switchTo().frame(0);
driver.findElement(By.cssSelector("#\\31 669641308951543808 .fa-trash-o")).click();
driver.switchTo().defaultContent();
driver.switchTo().defaultContent();
driver.findElement(By.linkText("确定")).click();
// 10.文章排序
driver.switchTo().frame(1);
driver.switchTo().frame(0);
driver.findElement(By.id("jqgh_dataGrid_title")).click();
driver.findElement(By.cssSelector("#jqgh_dataGrid_title .ui-icon-desc")).click();
driver.findElement(By.id("jqgh_dataGrid_category.categoryName")).click();
driver.findElement(By.cssSelector("#jqgh_dataGrid_category\\.categoryName .ui-icon-desc")).click();
driver.findElement(By.id("jqgh_dataGrid_weight")).click();
driver.findElement(By.cssSelector("#jqgh_dataGrid_weight .ui-icon-desc")).click();
driver.findElement(By.id("jqgh_dataGrid_hits")).click();
driver.findElement(By.cssSelector("#jqgh_dataGrid_hits .ui-icon-desc")).click();
driver.findElement(By.id("jqgh_dataGrid_wordCount")).click();
driver.findElement(By.cssSelector("#jqgh_dataGrid_wordCount .ui-icon-desc")).click();
driver.findElement(By.id("jqgh_dataGrid_status")).click();
driver.findElement(By.cssSelector("#jqgh_dataGrid_status .ui-icon-desc")).click();
driver.findElement(By.id("jqgh_dataGrid_createDate")).click();
driver.findElement(By.cssSelector("#jqgh_dataGrid_createDate .ui-icon-desc")).click();
}
}
5.2.2 栏目管理
(1)脚本录制
(2)测试代码
// Generated by Selenium IDE
import org.junit.Test;
import org.junit.Before;
import org.junit.After;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.core.IsNot.not;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.Alert;
import org.openqa.selenium.Keys;
import java.util.*;
import java.MalformedURLException;
import java.URL;
public class LanMuGuanLiTest {
private WebDriver driver;
private Map<String, Object> vars;
JavascriptExecutor js;
@Before
public void setUp() {
driver = new ChromeDriver();
js = (JavascriptExecutor) driver;
vars = new HashMap<String, Object>();
}
@After
public void tearDown() {
driver.quit();
}
public String waitForWindow(int timeout) {
try {
Thread.sleep(timeout);
} catch (InterruptedException e) {
e.printStackTrace();
}
Set<String> whNow = driver.getWindowHandles();
Set<String> whThen = (Set<String>) vars.get("window_handles");
if (whNow.size() > whThen.size()) {
whNow.removeAll(whThen);
}
return whNow.iterator().next();
}
@Test
public void lanMuGuanLi() {
driver.get("http://47.96.163.225:8080/js/a/index#/js/a/cms/category/list#%E6%A0%8F%E7%9B%AE%E7%AE%A1%E7%90%86");
driver.manage().window().setSize(new Dimension(1296, 696));
// 1.站点切换
driver.switchTo().frame(1);
driver.findElement(By.cssSelector(".dropdown-toggle")).click();
driver.findElement(By.linkText("JeeSite")).click();
driver.findElement(By.cssSelector(".dropdown-toggle")).click();
driver.findElement(By.linkText("Rql的站点")).click();
driver.findElement(By.cssSelector(".fa-angle-double-down")).click();
{
WebElement element = driver.findElement(By.cssSelector(".fa-angle-double-down"));
Actions builder = new Actions(driver);
builder.moveToElement(element).perform();
}
{
WebElement element = driver.findElement(By.tagName("body"));
Actions builder = new Actions(driver);
builder.moveToElement(element, 0, 0).perform();
}
// 2.刷新
driver.findElement(By.id("btnRefreshTree")).click();
// 3.展开
driver.findElement(By.id("btnExpandTreeNode")).click();
// 4.折叠
driver.findElement(By.id("btnCollapseTreeNode")).click();
// 5.查询栏目
driver.findElement(By.id("btnSearch")).click();
driver.findElement(By.id("categoryName")).click();
driver.findElement(By.id("categoryName")).sendKeys("学习");
driver.findElement(By.cssSelector(".btn-primary")).click();
driver.findElement(By.id("categoryName")).click();
driver.findElement(By.id("categoryName")).sendKeys(Keys.BACKSPACE, Keys.BACKSPACE, Keys.BACKSPACE, Keys.BACKSPACE, Keys.BACKSPACE);
driver.findElement(By.id("moduleType")).click();
driver.findElement(By.id("moduleType")).sendKeys("article");
driver.findElement(By.cssSelector(".btn-primary")).click();
{
WebElement element = driver.findElement(By.cssSelector(".btn-primary"));
Actions builder = new Actions(driver);
builder.moveToElement(element).perform();
}
{
WebElement element = driver.findElement(By.tagName("body"));
Actions builder = new Actions(driver);
builder.moveToElement(element, 0, 0).perform();
}
driver.findElement(By.cssSelector(".form-group:nth-child(3)")).click();
driver.findElement(By.id("moduleType")).sendKeys(Keys.BACKSPACE, Keys.BACKSPACE, Keys.BACKSPACE, Keys.BACKSPACE, Keys.BACKSPACE, Keys.BACKSPACE, Keys.BACKSPACE, Keys.BACKSPACE, Keys.BACKSPACE, Keys.BACKSPACE, Keys.BACKSPACE, Keys.BACKSPACE, Keys.BACKSPACE);
driver.findElement(By.id("select2-status-container")).click();
driver.findElement(By.cssSelector(".btn-primary")).click();
driver.findElement(By.id("select2-status-container")).click();
driver.findElement(By.cssSelector(".btn-primary")).click();
driver.findElement(By.cssSelector(".form-group:nth-child(4)")).click();
driver.findElement(By.id("categoryName")).click();
driver.findElement(By.id("categoryName")).sendKeys("学习");
driver.findElement(By.id("moduleType")).click();
driver.findElement(By.id("moduleType")).sendKeys("article");
driver.findElement(By.cssSelector(".select2-selection__arrow")).click();
driver.findElement(By.cssSelector(".btn-primary")).click();
{
WebElement element = driver.findElement(By.cssSelector(".btn-primary"));
Actions builder = new Actions(driver);
builder.moveToElement(element).perform();
}
{
WebElement element = driver.findElement(By.tagName("body"));
Actions builder = new Actions(driver);
builder.moveToElement(element, 0, 0).perform();
}
// 6.新增栏目
driver.findElement(By.cssSelector(".isQuick")).click();
driver.findElement(By.linkText("新增")).click();
driver.switchTo().defaultContent();
driver.switchTo().frame(2);
driver.findElement(By.id("categoryCode")).click();
driver.findElement(By.id("categoryCode")).sendKeys("1201399");
driver.findElement(By.id("categoryName")).click();
driver.findElement(By.id("categoryName")).sendKeys("音乐");
driver.findElement(By.id("btnSubmit")).click();
// 7.访问栏目
driver.switchTo().defaultContent();
driver.switchTo().frame(1);
vars.put("window_handles", driver.getWindowHandles());
driver.findElement(By.cssSelector("#\\31 14516 .fa-globe")).click();
vars.put("win9879", waitForWindow(2000));
vars.put("root", driver.getWindowHandle());
driver.switchTo().window(vars.get("win9879").toString());
driver.close();
// 8.新增下级栏目
driver.switchTo().window(vars.get("root").toString());
driver.switchTo().frame(1);
driver.findElement(By.cssSelector("#\\31 201399 .fa-plus-square")).click();
driver.switchTo().defaultContent();
driver.switchTo().frame(2);
driver.findElement(By.id("categoryName")).click();
driver.findElement(By.id("categoryName")).sendKeys("五月天");
driver.findElement(By.id("btnSubmit")).click();
driver.switchTo().defaultContent();
driver.switchTo().frame(1);
driver.findElement(By.cssSelector("#\\31 201399 .fa-plus-square")).click();
driver.switchTo().defaultContent();
driver.switchTo().frame(2);
driver.findElement(By.id("categoryName")).click();
driver.findElement(By.id("categoryName")).sendKeys("孙燕姿");
driver.findElement(By.id("btnSubmit")).click();
// 9.停用栏目
driver.switchTo().defaultContent();
driver.switchTo().frame(1);
driver.findElement(By.cssSelector("#\\31 201399001 .glyphicon")).click();
driver.switchTo().defaultContent();
driver.findElement(By.linkText("确定")).click();
driver.switchTo().frame(1);
driver.findElement(By.cssSelector("#\\31 201399 .glyphicon")).click();
driver.switchTo().defaultContent();
driver.findElement(By.linkText("确定")).click();
driver.switchTo().frame(1);
driver.findElement(By.cssSelector("#\\31 201399002 .glyphicon")).click();
driver.switchTo().defaultContent();
driver.findElement(By.linkText("确定")).click();
driver.switchTo().frame(1);
driver.findElement(By.cssSelector("#\\31 201399 .glyphicon")).click();
driver.switchTo().defaultContent();
driver.findElement(By.linkText("确定")).click();
driver.switchTo().frame(1);
// 10.启用栏目
driver.findElement(By.cssSelector("#\\31 201399 .glyphicon")).click();
driver.switchTo().defaultContent();
driver.findElement(By.linkText("确定")).click();
driver.switchTo().frame(1);
// 11.编辑栏目
driver.findElement(By.cssSelector("#\\31 201399 .fa-pencil")).click();
driver.switchTo().defaultContent();
driver.switchTo().frame(2);
driver.findElement(By.id("categoryName")).click();
driver.findElement(By.id("remarks")).click();
driver.findElement(By.id("remarks")).sendKeys("我要去演唱会!");
driver.findElement(By.id("btnSubmit")).click();
driver.switchTo().defaultContent();
driver.switchTo().frame(1);
// 8.新增下级栏目(原先停用后启动的栏目下内容恢复)
driver.findElement(By.cssSelector("#\\31 201399 .fa-plus-square")).click();
driver.switchTo().defaultContent();
driver.switchTo().frame(2);
driver.findElement(By.id("categoryName")).click();
driver.findElement(By.id("categoryName")).sendKeys("1");
driver.findElement(By.id("btnSubmit")).click();
driver.findElement(By.id("categoryCode")).click();
driver.findElement(By.id("categoryCode")).sendKeys("1201399005");
driver.findElement(By.id("btnSubmit")).click();
}
}
5.2.3 站点设置
(1)脚本录制
(2)测试代码
/ Generated by Selenium IDE
import org.junit.Test;
import org.junit.Before;
import org.junit.After;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.core.IsNot.not;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.Alert;
import org.openqa.selenium.Keys;
import java.util.*;
import java.MalformedURLException;
import java.URL;
public class ZhanDianSheZhiTest {
private WebDriver driver;
private Map<String, Object> vars;
JavascriptExecutor js;
@Before
public void setUp() {
driver = new ChromeDriver();
js = (JavascriptExecutor) driver;
vars = new HashMap<String, Object>();
}
@After
public void tearDown() {
driver.quit();
}
public String waitForWindow(int timeout) {
try {
Thread.sleep(timeout);
} catch (InterruptedException e) {
e.printStackTrace();
}
Set<String> whNow = driver.getWindowHandles();
Set<String> whThen = (Set<String>) vars.get("window_handles");
if (whNow.size() > whThen.size()) {
whNow.removeAll(whThen);
}
return whNow.iterator().next();
}
@Test
public void zhanDianSheZhi() {
driver.get("http://47.96.163.225:8080/js/a/index#/js/a/cms/site/list#%E7%AB%99%E7%82%B9%E8%AE%BE%E7%BD%AE");
driver.manage().window().setSize(new Dimension(1296, 696));
// 1.查询站点
driver.switchTo().frame(1);
driver.findElement(By.cssSelector(".fa-filter")).click();
driver.findElement(By.id("siteName")).click();
driver.findElement(By.id("siteName")).sendKeys("Rql");
driver.findElement(By.cssSelector(".btn-primary")).click();
driver.findElement(By.id("siteName")).click();
driver.findElement(By.id("siteName")).sendKeys(Keys.BACKSPACE, Keys.BACKSPACE, Keys.BACKSPACE);
driver.findElement(By.id("title")).click();
driver.findElement(By.id("title")).sendKeys("不");
driver.findElement(By.cssSelector(".btn-primary")).click();
{
WebElement element = driver.findElement(By.cssSelector(".btn-primary"));
Actions builder = new Actions(driver);
builder.moveToElement(element).perform();
}
{
WebElement element = driver.findElement(By.tagName("body"));
Actions builder = new Actions(driver);
builder.moveToElement(element, 0, 0).perform();
}
driver.findElement(By.id("title")).click();
driver.findElement(By.id("title")).sendKeys(Keys.BACKSPACE, Keys.BACKSPACE);
driver.findElement(By.id("domain")).click();
driver.findElement(By.id("domain")).sendKeys("www");
driver.findElement(By.cssSelector(".btn-primary")).click();
driver.findElement(By.id("domain")).click();
driver.findElement(By.id("domain")).sendKeys(Keys.BACKSPACE, Keys.BACKSPACE, Keys.BACKSPACE);
driver.findElement(By.id("select2-status-container")).click();
driver.findElement(By.cssSelector(".btn-primary")).click();
{
WebElement element = driver.findElement(By.cssSelector(".btn-primary"));
Actions builder = new Actions(driver);
builder.moveToElement(element).perform();
}
{
WebElement element = driver.findElement(By.tagName("body"));
Actions builder = new Actions(driver);
builder.moveToElement(element, 0, 0).perform();
}
driver.findElement(By.id("select2-status-container")).click();
driver.findElement(By.cssSelector(".btn-primary")).click();
driver.findElement(By.cssSelector(".select2-selection__arrow")).click();
driver.findElement(By.cssSelector(".btn-primary")).click();
driver.findElement(By.cssSelector(".select2-selection__arrow")).click();
driver.findElement(By.id("siteName")).click();
driver.findElement(By.id("siteName")).sendKeys("Rql");
driver.findElement(By.id("title")).click();
driver.findElement(By.id("title")).sendKeys("不");
driver.findElement(By.cssSelector(".btn-primary")).click();
{
WebElement element = driver.findElement(By.cssSelector(".btn-primary"));
Actions builder = new Actions(driver);
builder.moveToElement(element).perform();
}
{
WebElement element = driver.findElement(By.tagName("body"));
Actions builder = new Actions(driver);
builder.moveToElement(element, 0, 0).perform();
}
driver.findElement(By.cssSelector(".ui-jqgrid-bdiv")).click();
// 2.浏览站点
vars.put("window_handles", driver.getWindowHandles());
driver.findElement(By.cssSelector("#\\33 0 .fa-globe")).click();
vars.put("win5972", waitForWindow(2000));
vars.put("root", driver.getWindowHandle());
driver.switchTo().window(vars.get("win5972").toString());
driver.close();
// 3.新增站点
driver.switchTo().window(vars.get("root").toString());
driver.switchTo().frame(1);
driver.findElement(By.linkText("新增")).click();
driver.switchTo().defaultContent();
driver.switchTo().frame(2);
driver.findElement(By.id("siteName")).click();
driver.findElement(By.id("siteName")).sendKeys("Rql的站点3");
driver.findElement(By.id("siteCode")).click();
js.executeScript("window.scrollTo(0,780.6666870117188)");
driver.findElement(By.id("siteCode")).sendKeys("3");
driver.findElement(By.id("btnSubmit")).click();
{
WebElement element = driver.findElement(By.id("btnSubmit"));
Actions builder = new Actions(driver);
builder.moveToElement(element).perform();
}
{
WebElement element = driver.findElement(By.tagName("body"));
Actions builder = new Actions(driver);
builder.moveToElement(element, 0, 0).perform();
}
driver.findElement(By.id("title")).click();
driver.findElement(By.id("title")).sendKeys("啊啊啊啊啊");
driver.findElement(By.id("siteSort")).click();
driver.findElement(By.id("siteSort")).sendKeys("4");
driver.switchTo().frame(1);
driver.findElement(By.cssSelector(".view:nth-child(2)")).click();
driver.switchTo().defaultContent();
js.executeScript("window.scrollTo(0,759.3333129882812)");
js.executeScript("window.scrollTo(0,795.3333129882812)");
driver.switchTo().frame(1);
{
WebElement element = driver.findElement(By.cssSelector(".view:nth-child(2)"));
js.executeScript("if(arguments[0].contentEditable === 'true') {arguments[0].innerText = '<p>Rql的站点3</p>'}", element);
}
driver.switchTo().defaultContent();
driver.findElement(By.id("btnSubmit")).click();
js.executeScript("window.scrollTo(0,430)");
driver.findElement(By.id("siteCode")).click();
js.executeScript("window.scrollTo(0,762)");
driver.findElement(By.id("siteCode")).sendKeys("1200");
driver.findElement(By.id("btnSubmit")).click();
// 4.编辑站点
driver.switchTo().defaultContent();
driver.switchTo().frame(1);
driver.findElement(By.id("title")).click();
driver.findElement(By.id("title")).sendKeys(Keys.BACKSPACE, Keys.BACKSPACE, Keys.BACKSPACE, Keys.BACKSPACE, Keys.BACKSPACE, Keys.BACKSPACE, Keys.BACKSPACE, Keys.BACKSPACE);
driver.findElement(By.cssSelector(".btn-primary")).click();
{
WebElement element = driver.findElement(By.cssSelector(".btn-primary"));
Actions builder = new Actions(driver);
builder.moveToElement(element).perform();
}
{
WebElement element = driver.findElement(By.tagName("body"));
Actions builder = new Actions(driver);
builder.moveToElement(element, 0, 0).perform();
}
driver.findElement(By.cssSelector("#\\31 20 .fa-pencil")).click();
driver.switchTo().defaultContent();
driver.switchTo().frame(2);
driver.findElement(By.id("title")).click();
js.executeScript("window.scrollTo(0,791.3333129882812)");
driver.findElement(By.id("title")).sendKeys("快点成功");
driver.findElement(By.id("description")).click();
driver.findElement(By.id("description")).sendKeys("这是一个测试3");
driver.findElement(By.id("keywords")).click();
driver.findElement(By.id("keywords")).sendKeys("Rql");
js.executeScript("window.scrollTo(0,804.6666870117188)");
driver.findElement(By.id("select2-theme-container")).click();
js.executeScript("window.scrollTo(0,768.6666870117188)");
driver.findElement(By.id("btnSubmit")).click();
// 5.禁用站点
driver.switchTo().defaultContent();
driver.switchTo().frame(1);
driver.findElement(By.cssSelector("#\\31 20 .glyphicon")).click();
driver.switchTo().defaultContent();
driver.findElement(By.linkText("确定")).click();
// 6.启用站点
driver.switchTo().frame(1);
driver.findElement(By.cssSelector(".glyphicon-ok-circle")).click();
driver.switchTo().defaultContent();
driver.findElement(By.linkText("确定")).click();
// 7.删除站点
driver.switchTo().frame(1);
driver.findElement(By.cssSelector("#\\31 20 .fa-trash-o")).click();
driver.switchTo().defaultContent();
driver.findElement(By.linkText("确定")).click();
driver.switchTo().frame(1);
driver.findElement(By.cssSelector(".isQuick")).click();
// 8.站点排序
driver.switchTo().frame(1);
driver.findElement(By.cssSelector(".isQuick")).click();
driver.findElement(By.id("jqgh_dataGrid_siteName")).click();
driver.findElement(By.cssSelector("#jqgh_dataGrid_siteName .ui-icon-desc")).click();
driver.findElement(By.id("jqgh_dataGrid_title")).click();
driver.findElement(By.cssSelector("#jqgh_dataGrid_title .ui-icon-desc")).click();
driver.findElement(By.id("jqgh_dataGrid_domain")).click();
driver.findElement(By.cssSelector("#jqgh_dataGrid_domain .ui-icon-desc")).click();
driver.findElement(By.id("jqgh_dataGrid_description")).click();
driver.findElement(By.cssSelector("#jqgh_dataGrid_description .ui-icon-desc")).click();
driver.findElement(By.id("jqgh_dataGrid_theme")).click();
driver.findElement(By.cssSelector("#jqgh_dataGrid_theme .ui-icon-desc")).click();
driver.findElement(By.id("jqgh_dataGrid_status")).click();
driver.findElement(By.cssSelector("#jqgh_dataGrid_status .ui-icon-desc")).click();
driver.findElement(By.id("jqgh_dataGrid_createDate")).click();
driver.findElement(By.cssSelector("#jqgh_dataGrid_createDate .ui-icon-desc")).click();
driver.switchTo().defaultContent();
{
WebElement element = driver.findElement(By.id("btnOnline"));
Actions builder = new Actions(driver);
builder.moveToElement(element).perform();
}
{
WebElement element = driver.findElement(By.tagName("body"));
Actions builder = new Actions(driver);
builder.moveToElement(element, 0, 0).perform();
}
}
}
5.2.4 模板管理
(1)脚本录制
(2)测试代码
// Generated by Selenium IDE
import org.junit.Test;
import org.junit.Before;
import org.junit.After;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.core.IsNot.not;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.Alert;
import org.openqa.selenium.Keys;
import java.util.*;
import java.MalformedURLException;
import java.URL;
public class MoBanGuanLiTest {
private WebDriver driver;
private Map<String, Object> vars;
JavascriptExecutor js;
@Before
public void setUp() {
driver = new ChromeDriver();
js = (JavascriptExecutor) driver;
vars = new HashMap<String, Object>();
}
@After
public void tearDown() {
driver.quit();
}
@Test
public void moBanGuanLi() {
driver.get("http://47.96.163.225:8080/js/a/index#/js/a/cms/template/list#%E6%A8%A1%E7%89%88%E7%AE%A1%E7%90%86");
driver.manage().window().setSize(new Dimension(1296, 696));
// 1.查看模板目录
driver.switchTo().frame(1);
driver.findElement(By.cssSelector(".fa-chevron-down")).click();
driver.findElement(By.id("tree_1_switch")).click();
driver.findElement(By.id("tree_2_switch")).click();
driver.findElement(By.id("tree_3_span")).click();
// 2.修改模板文件名(不可)
driver.switchTo().frame(0);
driver.findElement(By.id("fileName")).click();
driver.findElement(By.id("fileName")).click();
driver.findElement(By.id("fileName")).sendKeys("views/modules/cmsfront/themes/default/include/banne.html");
driver.findElement(By.id("fileName")).sendKeys(Keys.ENTER);
driver.findElement(By.cssSelector(".btn-danger")).click();
driver.switchTo().defaultContent();
driver.findElement(By.id("tree_3_span")).click();
driver.findElement(By.id("tree_3_span")).click();
{
WebElement element = driver.findElement(By.id("tree_3_span"));
Actions builder = new Actions(driver);
builder.doubleClick(element).perform();
}
// 3.修改模板代码(不可)
driver.switchTo().frame(0);
driver.findElement(By.id("fileContent")).click();
driver.findElement(By.id("fileContent")).sendKeys("<div class=\"row\"><br/>\\n <ul class=\"breadcrumb\">\\n <li><span style=\"color:#998;\">当前位置:</span><a href=\"vars.get("ctx").toString()/index-${site.siteCode}\">首页</a></li>\\n <%\\n var pcs = @StringUtils.split(category.parentCodes, \',\');\\n var tns = @StringUtils.split(category.treeNames, \'/\');\\n for(var i = 0; i < pcs.~size - 1; i++){\\n %>\\n <li><a href=\"${ctx}/list-${pcs[i+1]}\">${tns[i]}</a></li>\\n <%\\n }\\n %>\\n <li><a href=\"${ctx}/list-${category.categoryCode}\">${category.categoryName}</a></li>\\n </ul>\\n</div>");
driver.switchTo().defaultContent();
driver.findElement(By.id("tree_4_span")).click();
driver.findElement(By.id("tree_3_span")).click();
}
}
5.3 缺陷分析
最终导出Junit形式时要求“type”类型的操作“value”不能为空,因此将其转换为“send keys”类型操作,并将其“value”设置为“${KEY_BACKSPACE}${KEY_BACKSPACE}……”(要删掉多少字节就用多少次${KEY_BACKSPACE})。不过当转出为Junit文件时,可以调用clear()方法更加方便快捷。
最终4个模块对应的测试脚本均顺利通过,且实现的效果与前面设计的用例的预期结果相符,说明各个功能模块符合《内容管理模块功能说明》文档中所描述的要求。
同时,它具有较好的可靠性。在模板管理模块中,即使用户尝试修改模板文件名和代码,系统并不给予权限,不会造成修改。
不过,系统也存在下述问题。
(1)分析1:栏目和站点删除未完全清空数据,造成编码值浪费
在测试时,我发现在本项目中,栏目编码、站点编码是具有唯一性的,我们已经使用过的编码值,即使后面删除了,要想再使用是不可行的,必须用一个从没使用过的编码值。这对于使用者来说就造成了很大的麻烦,无法知晓一些已经用过但现在删除的编码值,只能在发现编码冲突时不断尝试。并且对于系统而言,造成了一定程度的内存浪费。说明系统在处理删除栏目操作和删除站点操作时,没有在内存中释放其占用的资源,没有在数据库中彻底删除其对应的数据。
程序修改:可以考虑增加一个“回收站”功能,将已经删除但是编码值未被重新使用的栏目和站点暂时存放于回收站中,以便随时恢复和重新使用。即:增加一个“回收站”页面,用来展示所有已经删除的栏目和站点。回收站页面提供栏目和站点的编码值、名称、删除时间等信息,同时提供恢复和彻底删除功能。当用户选择恢复操作时,系统会将栏目或站点从回收站中恢复,并重新使用其对应的编码值;当用户选择彻底删除操作时,系统会将栏目或站点从回收站中彻底删除,释放其对应的编码值。这样既可以减少编码值的浪费,也可以方便使用者了解和管理已经删除的栏目和站点。
(2)分析2:父栏目停用前提繁琐,重新启用后无法知晓子栏目信息
在栏目管理中,系统实现的效果是:父级栏目停用的前提是所有子级栏目停用;将停用的父级栏目重新启用时,其下的子级栏目不会展示,需要在该父级栏目下再新建一个子栏目,才会展示原先的子级栏目信息。
这样的操作虽然实现了防误停用的效果,但是对于用户想要停用有很多子级栏目的父级栏目而言,非常的繁琐。而且在重新启用后,不能及时知晓该父级栏目的子级栏目信息,非常的不便,影响用户体验。
程序修改:可以采用一种新的机制。①当一个父级栏目下面有子级栏目时,如果要停用该父级栏目,可以弹出一个提示框,询问用户是否需要同时停用其下所有子级栏目。如果用户选择是,系统将停用该父级栏目及其下子级栏目,否则只停用该父级栏目本身。②当父级栏目重新启用时,展示该栏目下的所有子级栏目。这样用户可以更方便地管理父级栏目和其下的子级栏目,不需要再新建一个子栏目才能够展示原有的子级栏目信息,同时可以及时获取父级栏目下的所有子级栏目信息,提高操作效率和用户体验。
版权声明:本文标题:软件测试和质量管理——课设2 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1727197547a1101825.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论