当前位置: 首页 > news >正文

测试报告——“问卷考试系统”项目

本文主要讲述“问卷考试系统”项目的测试报告

目录

一、项目介绍

1.1 项目背景

1.2 系统包含以下核心模块:

1.3 测试环境

二、设计测试用例

功能测是用例图:

兼容性测试用例图:

安全测试测试用例:

性能测试测试用例:

易用性测试测试用例:

网络测试测试用例:

界面测试测试用例:

三、手动测试

分别对注册页面、登录页面、整个系统进行功能测试:

3.1 注册页面

3.2 登录页面

3.3 问卷考试系统 

3.3.1 首页

3.3.2 我的项目

3.3.3 我的练习

3.3.4 题库中心

3.3.5 模板广场

3.3.6 系统管理

四、自动化测试

4.1自动化测试用例图

4.2 设计自动化测试代码

4.3 commom

4.4 Test

        4.4.1 注册页面

        4.4.2 登录页面

        4.4.3 首页HomePage.py

        4.4.4 我的项目

        4.4.5 我的练习

        4.4.6 题库中心

        4.4.7 模板广场

        4.4.8 系统管理

        4.4.9 测试代码

五、兼容性测试

本次兼容性测试用到的场景有:

PC端:

Edge浏览器

Chrome浏览器

移动端:

六、发现的BUG

6.1 功能异常

注册页面:

登录页面:

首页:

我的项目:

我的练习:

题库中心--我的题库:

模板广场:

系统管理--用户管理:

系统管理--角色管理

系统管理--组织机构:

系统管理--岗位设置:

系统管理--字典设置:

系统管理--个人设置:

6.2 兼容性异常

兼容性测试:

移动端:

在Android系统下:

 七、测试总结

项目功能完整性

7.1 细节体验优化类问题

7.2 核心功能与安全风险类问题

附录

整体系统测试用例

自动化测试用例

自动化测试脚


一、项目介绍

1.1 项目背景

在数字化转型加速渗透各行业的当下,“数据驱动决策” 已成为企业优化运营、机构提升服务效率、科研团队保障研究科学性的核心逻辑。而问卷作为低成本、广覆盖、高灵活性的数据收集工具,其应用场景已从传统的市场调研、用户满意度调查,延伸至企业内部管理(如员工需求调研)、教育领域(如学生学习情况反馈)、公共服务(如政策落地效果评估)等多个维度,市场对专业问卷系统的需求呈现持续增长态势。
然而,当前市场中的问卷相关工具仍存在明显痛点,难以满足用户对 “高效、安全、个性化” 的核心诉求:一方面,传统纸质问卷存在数据录入效率低、统计误差大、存储成本高、结果分析滞后等问题,已无法适配数字化时代的快节奏需求;另一方面,部分简易在线问卷工具虽解决了 “线上化” 问题,但普遍存在功能单一(如缺乏复杂逻辑跳转、自定义报表生成)、操作门槛高(界面设计不友好,非专业用户上手难)、数据安全无保障(用户数据归属模糊,缺乏加密存储机制)、多角色权限管理缺失(无法满足企业 / 机构内部 “创建者 - 审核者 - 查看者” 的分工需求)等短板,尤其难以支撑中大型组织的规模化问卷调研场景。
在此背景下,“问卷考试系统” 应运而生。系统以 “解决用户数据收集痛点,提供全流程问卷管理服务” 为核心定位,而当前呈现的 “登录 / 注册” 页面(http://8.155.1.153:8081/user/login),正是系统实现服务闭环的关键入口 —— 通过建立用户账号体系,既保障了不同用户(个人用户、企业用户、机构用户)的数据归属权与隐私安全,也为后续的问卷创建、模板选择、精准发放、实时统计、多维度分析等核心功能提供了权限管理基础。
本项目的开发旨在填补现有工具的功能与体验空白,面向企业、教育机构、科研团队及个人用户,提供从 “问卷设计” 到 “结果应用” 的全流程数字化解决方案,帮助用户以更低成本、更高效率完成数据收集与分析,最终为决策提供可靠的数据支撑,助力各领域用户在数字化时代实现运营与服务的优化升级。

1.2 系统包含以下核心模块:

1.2.1 用户管理模块
承担用户账号体系的基础建设工作,具体涵盖用户注册(为新用户开通系统使用权限)、用户登录(验证身份并提供个性化服务入口),以及组织机构与用户的关联分配(实现不同组织架构下用户的归属与权限适配),是保障系统安全、区分用户角色与数据边界的核心基础。
1.2.2 项目与考试管理模块
聚焦 “问卷 / 考试类项目全生命周期管理”,支持用户创建、编辑各类问卷或考试项目,完成项目的发布与触达,并提供数据统计与汇总分析功能—— 从答题数据回收,到多维度结果可视化呈现,助力用户基于数据实现决策或评估的科学性。
1.2.3 题库管理模块
为项目、练习提供 “题目资源池” 的核心支撑,具备题库创建、批量导入导出(高效管理题库资源),以及题目增删改查、错题本记录、笔记留存等细粒度功能,既满足用户自主构建专属题库的需求,也为练习、考试的开展储备充足且灵活的题目资源。
1.2.4  练习与结果管理模块
面向用户 “自我检测、能力巩固” 的需求,支持基于系统已有题目发起练习、查看练习结果(如答题正确率、错误题目分布),并提供练习进度追踪功能,帮助用户清晰掌握自身对知识或题型的掌握情况,实现针对性提升。
1.2.5 模板资源管理模块
以 “提升项目创建效率” 为核心,打造 “模板广场” 类功能,提供各类问卷、考试模板的直接选用(覆盖常见场景,降低设计门槛),同时支持用户新建并保存自定义模板,满足个性化与标准化结合的项目创建需求。
1.2.6  系统配置管理模块
作为系统的 “后台中枢”,负责角色、组织、岗位、字典等基础数据与功能的设置(如定义不同角色的操作权限、搭建组织架构体系),以及个人信息修改、安全设置(如密码管理、账号安全防护),从底层保障系统的稳定性、安全性与个性化使用体验。

1.3 测试环境

操作系统:Windows 11
浏览器:Chrome、Edge
测试工具:Selenium、PyCharm

二、设计测试用例

测试用例设计锚定需求分析,结合等价类划分(覆盖有效 / 无效输入)与边界值分析(验证临界场景),再通过场景测试模拟用户实际操作,最终保障测试既全面覆盖关键场景,又具备贴合实际使用的实用性。
如下图是全部整体的测试用例图:

功能测是用例图:

兼容性测试用例图:

安全测试测试用例:

性能测试测试用例:

易用性测试测试用例:

网络测试测试用例:

界面测试测试用例:

三、手动测试

分别对注册页面、登录页面、整个系统进行功能测试

3.1 注册页面

场景一:输入正确的账号、密码、确认密码后进行注册。
预期结果:注册成功跳转到登录页面可以正常登录跳转到系统首页

场景二:只输入一个或者是有一个没有输入都是会有提示的,不能注册成功
预期结果:注册失败,会有提示的弹出

场景三:输入重复的账号进行注册
预期结果:注册失败,提示账号已存在

场景四:输入用户名,输入密码,输入错的确认密码进行注册
预期结果:注册失败,提示两次密码不一致!

这是后面测试的账号

3.2 登录页面

场景一:输入正确的账号、密码后进行登录
预期结果:正常登录并跳转到系统首页

场景二:只输入一个或者是有一个没有输入都是会有提示的
预期结果:登录失败

场景三:账号和密码有一个不正确
预期结果:登录失败

3.3 问卷考试系统 

整个系统的核心功能有:首页、我的项目、我的练习、题库中心、模板广场、用户设置;
分别对这些核心功能进行功能测试:

3.3.1 首页

新注册的账号,首页中的我的考试,我的问卷,问卷记录考试记录以及旁边的快速开始等功能都没有显示,首先就来验证创建考试和创建考试的这两个功能

创建问卷预期结果:在点击创建问卷之后,跳转到创建问卷的页面,然后将问卷题型模板拖入,根据所需进行修改,并点击保存,在提示“成功创建”之后可以在我的问卷页面看到新创建的问卷

首页的数据也跟着更改

问卷可以创建成功,但是问卷创建成功之后保存在了我的项目里面,在个人首页的我的问卷是没有的,另外个人主页的问卷数也是可以增加的

创建考试预期结果:在点击创建考试之后,跳转到创建考试的页面,然后将题型模板拖入,根据所需进行修改,并点击保存,在提示“创建成功”之后可以在我的考试页面看到新创建的考试:

但是实际情况同创建问卷一样,并没有在我的考试中显示出来
问卷记录和考试记录:当我们填写了问卷或者是进行了考试之后,都会在这两栏进行显示具体的信息:

考试记录

其中,这些记录也有刷新,密度、列设置这些功能都可以使用,不同的密度展示的记录紧凑程度不同,列设置如果不勾选,则不会出现:

这是问卷调查过多的样子

3.3.2 我的项目

首先在我的项目里点击新建

这里可以看到,多种选择提供参考,这里选择基础的问卷调查

左边提供多种题型的编辑,下面编辑一个简单的问卷调查

如图,左边是题型的简单添加,右边是每道题的细节控制,中间就是整体视角,完成编辑后,点击保存

在返回我的项目就可以看得,刚刚新建的项目

这里的左上角是页面布局的调整

旁边是搜索框,下面让我们试一试搜索功能如何
预期结果:成功出现搜索的内容

测试对于项目的各类功能,在项目的右下角的“三个小点”点击之后显示

1.预览
注意,预览功能需要打开此开关

2.重命名

3.停止

4.移动功能暂时用不了
5.下载

6.复制
自动跳转一个新创作页面,并附带TOP1的所有内容

7.删除

成功删除

3.3.3 我的练习

由于是新注册的账号,所以没有对应的练习,我们在我的题库中新建两个,分别是C++和java

点击开始练习之后会跳转到选择“顺序练习”、“随机练习”、“错题练习”,点击“顺序练习”之后直接跳转到了答题页面:

答题结束之后就可以在我的练习页面查看到所做过的题可以通过状态的选择进行筛选,也可以看到完成的进度,没有完成的题也可以继续答题,完成的题可以查看结果,也可以对题目进行删除:

删除练习
预期结果:点击最右面的“删除”,提示是否删除,点击OK,即可以删除练习

点击旁边的二维码,会弹出本网站的二维码

3.3.4 题库中心

题库中心有三个模块:我的题库、问题管理、我的笔记;
依次对这三个模块进行功能测试:

我的题库:

输入需要搜索的名称:

并且点击重置之后我们之前输入的查询关键字都会被清空:
新建题库预期结果:点击新建之后跳转到新增题库的页面,其中可以创建新的题库,输入好题库信息之后点击确定便可以创建好题库了:

试题管理预期结果:点击试题管理之后会跳转到试题管理的页面,我们可以通过添加试题来为我们新创建的题库增添题目,另外也可以对我们添加好的试题进行再次编辑:

编制和删除题库预期结果:点击题库最右边的“三个点”可以弹出编辑和删除,我们点击编制,会跳转到编辑页面,可以修改名字和标签等基本信息:

我们点击删除之后会有一个再次确认的弹窗,点击删除之后就可以将对应的题库从中删除掉:

问题管理:
问题管理模块是对我们创建的题库中新添加的题目的管理;
我们可以对这些题目进行编辑或者进行指定查询:

以及批量操作:

我的笔记:
在答题的时候,题目下面有一个笔的小标志,点击一下就可以进行笔记的记录,记录完成之后就会在我的笔记页面进行展示:

笔记的删除预期结果:我们点击删除操作之后,会有提示弹窗,点击OK之后就可以删除该条笔记:

3.3.5 模板广场

模板广场添加模板功能验证;
预期结果:点击“添加模版”之后跳转至添加模板的页面,然后选择题型进行修改,点击保存时会弹出一个设置模板的页面,其中可以填写模板的名称,分类以及标签,还可以勾选“添加到公共库”,点击保存,就可以看到我们新建的模板了:

搜索模板功能验证
预期结果:输入关键字并点击“搜模板”即可以查找到对应的模板:

搜索模板这里是有功能bug的,不能根据输入的关键字来查找对应的模板,但私有库可以看到

模板筛选功能验证:
预期结果:通过对模板分类的选择,筛选出对应分类的模板:

私有库的验证:

这里我们重新创建一个模版,不勾选“添加到公共库”

测试模版的各个功能:删除,下载,预览和应用

1.删除

原本的qqq1已经消失
2.下载

3.预览

4.应用


3.3.6 系统管理

系统管理分为以下几个模块:用户管理、角色管理、组织机构、岗位设置、字典管理、个人设置;
接下来分别对这些模块进行功能验证:

用户管理

组织机构筛选验证:
可以根据选择对应的组织机构筛选出隶属于这个组织机构的用户:

输入查询功能验证:
通过输入姓名,点击查询之后可以筛选出对应姓名的用户:

用户编辑功能以及重置密码、删除用户验证:
点击“编辑”之后可以看到用户的各种信息,可以对这些信息进行修改,另外,点击“更多”之后会出现“重置密码”和“删除用户”的选项,可以点击达到对应的效果

新建角色功能测试:

角色管理:角色管理功能和上面的用户管理功能相似,这里只测试上面没有的功能

点击编辑:可以修改各种权限

点击更多:看到分配用户,其功能可以分配到指定的组织中

组织机构
新建组织机构功能测试:
点击“新建”之后跳转到信息填写页面,填写完成之后点击“确定”即可以创建新的机构:

删除机构功能测试:
点击“删除”会跳出弹窗提示是否删除,点击“确定”即可以删除对应的机构:

岗位设置

搜索功能验证:
输入对应的关键字,并点击“查询”可以筛选出对应的岗位:

新建岗位功能验证:
点击“新建”跳转到信息填写页面,填写完成之后点击“确定”既可以完成新建:

删除岗位功能验证:
点击“删除”之后会有二次确认,点击“确定”既可以删除对应的岗位:

字典管理

查询字典功能验证:
输入对应的关键字,并点击“查询”就可以筛选出对应的字典:

新建字典功能验证:
点击“新建”然后跳转到填写字典信息页面,填写完对应的信息之后点击“确定”可以完成对字典的新建:

编辑/删除字典功能验证:
点击“三个小点”出现的删除,点击“编辑”进行编辑字典:

点击“删除”进行二次确认即可完成删除字典:

个人设置

基本设置:
可以修改姓名、手机号、邮箱、个人简介以及更换头像:

安全设置:
修改账户密码:

四、自动化测试

4.1自动化测试用例图

4.2 设计自动化测试代码

自动化这里我们用的到工具是Pycharm以及selenium库,在自动化测试这里我们根据系统功能的不同,分功能编写测试脚本,分为注册页面、登录页面、首页、我的项目、我的练习、题库中心、模板广场、系统管理这几个页面,我们根据不同的页面来针对性的设计自动化测试代码: 
整体框架:

整体分三个文件:
commom:主要存放的是公共类的功能
image:对屏幕截图的保存
Test:对每个板块完成后的测试

4.3 commom

在这个文件里面,主要实现驱动的创建、屏幕截图、清空输入框、设计单例
这里我用的是Edge的驱动,如果换别的浏览器需要根据浏览器版本下载合适的驱动:
Utils.py:
import datetime
import os
import sys
import atexit
from selenium import webdriver
from selenium.webdriver import ActionChains, Keys
from selenium.webdriver.edge.options import Options
from selenium.webdriver.edge.service import Service
from selenium.webdriver.support.wait import WebDriverWaitdef singleton(cls):"""单例模式装饰器"""_instance = {}def wrapper(*args, **kwargs):if cls not in _instance:_instance[cls] = cls(*args, **kwargs)return _instance[cls]return wrapper@singleton
class EdgeDriver:def __init__(self):# 手动指定Edge驱动路径self.driver_path = r"D:\Edge驱动\edgedriver_win64\msedgedriver.exe"self.driver = Noneself.init_driver()def init_driver(self):"""初始化Edge浏览器驱动"""# 校验驱动路径是否存在if not os.path.exists(self.driver_path):raise FileNotFoundError(f"Edge驱动文件不存在:{self.driver_path}")# 配置Edge浏览器选项edge_options = Options()edge_options.add_argument("--remote-allow-origins=*")edge_options.add_argument("--disable-blink-features=AutomationControlled")  # 隐藏自动化标识edge_options.add_argument("--start-maximized")  # 窗口最大化# 创建驱动实例self.driver = webdriver.Edge(service=Service(self.driver_path),options=edge_options)# 设置隐式等待self.driver.implicitly_wait(5)# 注册程序退出时自动关闭驱动atexit.register(self.quit_driver)def GetScreenShot(self, custom_name=""):"""屏幕截图功能:param custom_name: 自定义截图名称后缀(可选)"""try:# 构建截图保存路径(适配不同操作系统)base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../images"))dirname = datetime.datetime.now().strftime("%Y-%m-%d")save_dir = os.path.join(base_dir, dirname)# 确保文件夹存在os.makedirs(save_dir, exist_ok=True)# 生成截图文件名time_str = datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S")caller_name = sys._getframe().f_back.f_code.co_name  # 调用函数名filename = f"{caller_name}-{time_str}"if custom_name:filename += f"-{custom_name}"filename += ".png"# 保存截图save_path = os.path.join(save_dir, filename)self.driver.save_screenshot(save_path)print(f"截图成功,保存路径:{save_path}")return save_pathexcept Exception as e:print(f"截图失败:{str(e)}")return Nonedef ClearInput(self, element):actions = ActionChains(self.driver)actions.click(element)  # 点击元素actions.key_down(Keys.CONTROL).send_keys("a").key_up(Keys.CONTROL)  # Ctrl+Aactions.send_keys(Keys.DELETE)  # 删除actions.perform()  # 执行所有动作def quit_driver(self):"""安全关闭浏览器驱动"""if hasattr(self, "driver") and self.driver:try:self.driver.quit()print("Edge浏览器已安全关闭")except Exception as e:print(f"关闭浏览器失败:{str(e)}")# 创建单例实例
QESDriver = EdgeDriver()

4.4 Test

在该模块中对问卷考试系统的主要功能进行自动化脚本的设计,为了更加直观,将每个页面都按文件分别编写:
首页:HomePage.py
登录页面:LoginPage.py
我的练习:MyPracticePage.py
我的项目:MyProjectPage.py
题库中心:QuestionBankCenterPage.py
注册页面:RegistrationPage.py
测试:RunTest.py
系统管理:SystemManagementPage.py
模板广场:TemplateSquarePage.py

4.4.1 注册页面

RegistrationPage.py
import timefrom selenium.webdriver.common.by import Byfrom common.Untils import QESDriver# 注册页面
class RegPage:url = ""driver = ""def __init__(self):self.url = "http://8.155.1.153:8081/user/login"self.driver = QESDriver.driverself.driver.get(self.url)def GetRegPage(self):# 查找注册按钮并点击self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > div:nth-child(4) > a").click()# 什么都不输入直接点击注册并截图self.driver.find_element(By.CSS_SELECTOR, '#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button').click()time.sleep(2)QESDriver.GetScreenShot()#输入正确信息注册并截图# 查找姓名输入框并输入self.driver.find_element(By.CSS_SELECTOR, '#name').send_keys("林动")# 查找登录账号输入框并输入self.driver.find_element(By.CSS_SELECTOR, '#username').send_keys("lindong")# 查找密码输入框并输入self.driver.find_element(By.CSS_SELECTOR, '#password').send_keys("sss123")# 查找密码确认输入框并输入self.driver.find_element(By.CSS_SELECTOR, '#rePassword').send_keys("sss123")# 点击注册self.driver.find_element(By.CSS_SELECTOR, '#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button').click()time.sleep(2)QESDriver.GetScreenShot()
顺便进行测试:
Test:
from RegistrationPage import RegPage
from common.Untils import QESDriverif __name__ == "__main__":# 创建 RegPage 实例(自动初始化浏览器并打开登录页)reg_page = RegPage()# 执行注册流程(点击注册、填写表单等)reg_page.GetRegPage()# 关闭浏览器QESDriver.driver.quit()

4.4.2 登录页面

LoginPage.py

import timefrom selenium.webdriver.common.by import Byfrom common.Untils import QESDriverclass LoginPage:url = ""driver = ""def __init__(self):self.url = "http://8.155.1.153:8081/user/login"self.driver = QESDriver.driverself.driver.get(self.url)def GetloginPage(self):#不输入用户名直接点击登录self.driver.find_element(By.XPATH, '//*[@id="root"]/div/div[2]/div[2]/div/form/button').click()time.sleep(2)QESDriver.GetScreenShot()#输入正确的账户,错误的密码并进行截图#查找用户名输入栏并输入“lindong”self.driver.find_element(By.XPATH,'//*[@id="username"]').send_keys("lindong")# 查找密码输入栏并输入错误密码“123456”self.driver.find_element(By.XPATH,'//*[@id="password"]').send_keys("123456")# 使用错误密码并点击登录然后截图展示self.driver.find_element(By.XPATH,'//*[@id="root"]/div/div[2]/div[2]/div/form/button/span').click()time.sleep(2)QESDriver.GetScreenShot()# 使用正确密码登录并截图查看# 先清空,再输入正确密码QESDriver.ClearInput(self.driver.find_element(By.XPATH,'//*[@id="password"]'))self.driver.find_element(By.XPATH, '//*[@id="password"]').send_keys("sss123")self.driver.find_element(By.XPATH, '//*[@id="root"]/div/div[2]/div[2]/div/form/button').click()time.sleep(2)QESDriver.GetScreenShot()
Test:
from common.Untils import QESDriver#from RegistrationPage import RegPagefrom LoginPage import LoginPageif __name__ == "__main__":LoginPage().GetloginPage()# 关闭浏览器QESDriver.driver.quit()
这是第一次什么都不输入

第二次只输入正确的账号,错误的密码

第三次全部正确的输入

4.4.3 首页HomePage.py

在首页我们对首页的元素进行查找,然后点击创建问卷或者点击创建考试并截图:
import timefrom selenium.webdriver.common.by import Byfrom common.Untils import QESDriverclass HomePage:url = ""driver = ""def __init__(self):self.url = "http://8.155.1.153:8081/home"  # 首页对应的urlself.driver = QESDriver.driver  # 创建驱动self.driver.get(self.url)  # 访问首页# 点击、查找首页对应的元素def GetHomePage(self):# 查找首页元素并截图home = self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[1]/nav/ol/li[2]/span[1]/span').click()#assert home == "首页"navigation_bar = self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[2]/div/div[1]/div/div').textassert navigation_bar == "快速开始 / 便捷导航"  # 断言失败会直接报错QESDriver.GetScreenShot()#################################################################### 依次点击“我的考试”“我的问卷”“问卷记录”“考试记录”标签self.driver.find_element(By.XPATH,'//*[@id="rc-tabs-0-panel-exam"]/div/div/div/div[2]/div/div/div/div/div/table/thead/tr/th[1]').click()self.driver.find_element(By.XPATH,'//*[@id="rc-tabs-0-panel-exam"]/div/div/div/div[2]/div/div/div/div/div/table/thead/tr/th[2]').click()self.driver.find_element(By.XPATH,'//*[@id="rc-tabs-0-panel-exam"]/div/div/div/div[2]/div/div/div/div/div/table/thead/tr/th[3]').click()self.driver.find_element(By.XPATH,'//*[@id="rc-tabs-0-panel-exam"]/div/div/div/div[2]/div/div/div/div/div/table/thead/tr/th[4]').click()# 点击创建问卷并截图def hp_CreateQuestionnaire(self):# 点击“创建问卷”按钮self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[2]/div/div[2]/div/a[1]').click()time.sleep(2)  # 等待页面跳转QESDriver.GetScreenShot()  # 截图记录创建问卷页面self.driver.back()  # 返回首页# 点击创建考试并截图def hp_CreateExaminations(self):# 点击“创建考试”按钮self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[2]/div/div[2]/div/a[2]').click()time.sleep(2)  # 等待页面跳转QESDriver.GetScreenShot()  # 截图记录创建考试页面self.driver.back()  # 返回首页
Test:
from common.Untils import QESDriver#from RegistrationPage import RegPagefrom LoginPage import LoginPagefrom HomePage import HomePageif __name__ == "__main__":#登录账号LoginPage().GetloginPage()#进行首页的测试HomePage().GetHomePage()# 首页--创建问卷HomePage().hp_CreateQuestionnaire()# 首页--创建考试HomePage().hp_CreateExaminations()# 关闭浏览器QESDriver.driver.quit()

4.4.4 我的项目

MyProjectPage.py

import timefrom selenium.webdriver.common.by import Byfrom common.Untils import QESDriverclass MyProject:url = ""driver = ""def __init__(self):self.url = "http://8.155.1.153:8081/project"self.driver = QESDriver.driverself.driver.get(self.url)def GetMyProject(self):# 列展示self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[1]/div[2]/div/div/div/div/div/div/div/div/label[2]').click()time.sleep(5)QESDriver.GetScreenShot()# 平铺展示self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[1]/div[2]/div/div/div/div/div/div/div/div/label[1]').click()time.sleep(5)QESDriver.GetScreenShot()# 新建项目self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[1]/div[1]/span/div/div/button').click()QESDriver.GetScreenShot()

4.4.5 我的练习

我的练习页面,先查找页面元素,然后分别对数学练习以及语文练习进行测试并截图:

MyPracticePage.py:

import timefrom selenium.webdriver.common.by import Byfrom common.Untils import QESDriverclass MyPractice:def __init__(self):self.url = "http://8.155.1.153:8081/exercise"self.driver = QESDriver.driverself.driver.get(self.url)def GetMyPractice(self):# 查找页面元素并截图title1 = self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div[2]/div[2]/div/div[1]/div/div[1]/div').textassert title1 == "我的练习"title2 = self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div[2]/div[2]/div/div[2]/div/div/div/div/div/table/thead/tr/th[1]').textassert title2 == "练习名称"title3 = self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div[2]/div[2]/div/div[2]/div/div/div/div/div/table/thead/tr/th[2]').textassert title3 == "练习进度"title4 = self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div[2]/div[2]/div/div[2]/div/div/div/div/div/table/thead/tr/th[3]').textassert title4 == "练习类型"title5 = self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div[2]/div[2]/div/div[2]/div/div/div/div/div/table/thead/tr/th[4]').textassert title5 == "状态"title6 = self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div[2]/div[2]/div/div[2]/div/div/div/div/div/table/thead/tr/th[5]').textassert title6 == "创建时间"title7 = self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div[2]/div[2]/div/div[2]/div/div/div/div/div/table/thead/tr/th[6]').textassert title7 == "操作"QESDriver.GetScreenShot()################################################################################def Numxercise(self):# 找到"123"并点击self.driver.find_element(By.XPATH, '//*[@id="rc-tabs-0-tab-123"]/span').click()time.sleep(1.5)# 查找输入框并输入“测试部门”self.driver.find_element(By.XPATH, '//*[@id="name"]').send_keys("测试部门")# 查找“查询”并点击self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div[2]/div[1]/form/div/div[2]/div/div/div[2]/div/div/div/div/div/div[2]/button/span').click()time.sleep(1.5)QESDriver.GetScreenShot()# 查找“重置”并点击self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div[2]/div[1]/form/div/div[2]/div/div/div[2]/div/div/div/div/div/div[1]/button/span').click()# 查找“开始练习”并点击self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div[2]/div[2]/div/div[2]/div/div/div/div/div/table/tbody/tr[4]/td[3]/div/div/a').click()QESDriver.GetScreenShot()# 查找页面元素title1 = self.driver.find_element(By.XPATH,'/html/body/div[4]/div/div[2]/div/div[2]/div/div/div[2]/div[1]/div/div/div').textassert title1 == "顺序练习"title2 = self.driver.find_element(By.XPATH,'/html/body/div[4]/div/div[2]/div/div[2]/div/div/div[2]/div[2]/div/div/div').textassert title2 == "随机练习"title3 = self.driver.find_element(By.XPATH,'/html/body/div[4]/div/div[2]/div/div[2]/div/div/div[2]/div[3]/div/div/div').textassert title3 == "错题练习"
Test:
from common.Untils import QESDriver#from RegistrationPage import RegPagefrom LoginPage import LoginPagefrom HomePage import HomePagefrom MyProjectPage import MyProjectfrom MyPracticePage import MyPractice
if __name__ == "__main__":#登录账号LoginPage().GetloginPage()# 我的练习MyPractice().GetMyPractice()MyPractice().Numxercise()# 关闭浏览器QESDriver.driver.quit()

4.4.6 题库中心

题库中心这里分为三个模块,我们按照不同的模块设计了不同的类对象进行自动化测试:
  • 我的题库:MyQuestionBank
  • 问题管理:ProblemManagement
  • 我的笔记:MyNotes
我的题库:MyQuestionBank:
import timefrom selenium.webdriver.common.by import Byfrom common.Untils import QESDriverclass MyQuestionBank:def __init__(self):self.url = "http://8.155.1.153:8081/repo/index"self.driver = QESDriver.driverself.driver.get(self.url)def GetMyQuestionBank(self):# 查找输入框并输入“111”self.driver.find_element(By.XPATH, '//*[@id="name"]').send_keys("111")# 查找“查询”并点击self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[1]/form/div/div[3]/div/div/div[2]/div/div/div/div/div/div[2]/button').click()time.sleep(1.5)QESDriver.GetScreenShot()# 查找“重置”并点击self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[1]/form/div/div[3]/div/div/div[2]/div/div/div/div/div/div[1]/button').click()# 新建题库def CreateNewQuestionBank(self):self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[2]/div/div[1]/div/div[2]/div[1]/div/div[1]/button/span[2]').click()# 查找输入“题库名称”self.driver.find_element(By.CSS_SELECTOR, '#name').send_keys("自动化测试新建题库")time.sleep(1.5)# 查找输入“题库分类”self.driver.find_element(By.XPATH, '//*[@id="category"]').send_keys("自动化")# 查找输入“题库描述”self.driver.find_element(By.XPATH, '//*[@id="description"]').send_keys("自动化")QESDriver.GetScreenShot()# 返回self.driver.back()def TestManagement(self):# 试题管理self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[2]/div/div[2]/div/div/div/div/div/table/tbody/tr[2]/td[9]/div/div[3]/a').click()time.sleep(1.5)QESDriver.GetScreenShot()
问题管理:ProblemManagement
class ProblemManagement:def __init__(self):self.url = "http://8.155.1.153:8081/repo/template"self.driver = QESDriver.driverself.driver.get(self.url)def GetProblemManagement(self):QESDriver.GetScreenShot()# 点击展开self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[1]/form/div/div[5]/div/div/div[2]/div/div/div/div[2]/a').click()# 输入“单选”并搜索self.driver.find_element(By.XPATH, '//*[@id="name"]').send_keys("单选")time.sleep(0.5)QESDriver.GetScreenShot()# 点击“重置”并点击“编辑”self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[1]/form/div/div[5]/div/div/div[2]/div/div/div/div[1]/div/div[1]/button').click()self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[2]/div/div[2]/div/div/div/div/div/table/tbody/tr[2]/td[10]/div/div/a').click()time.sleep(0.5)QESDriver.GetScreenShot()# 退出编辑self.driver.find_element(By.XPATH, '//*[@id="editor"]/div[1]/div[1]/div[2]/div/button[1]').click()

我的笔记:MyNotes
#我的笔记
class MyNotes:url = ""driver = ""def __init__(self):self.url = "http://8.155.1.153:8081/repo/book"self.driver = QESDriver.driverself.driver.get(self.url)def GetMyNotes(self):# 查找输入框并输入“一”“1”self.driver.find_element(By.XPATH, '//*[@id="name"]').send_keys("一")# 点击展开self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[1]/form/div/div[4]/div/div/div[2]/div/div/div/div[2]/a').click()self.driver.find_element(By.XPATH, '//*[@id="note"]').send_keys("1")# 点击查询self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[1]/form/div/div[4]/div/div/div[2]/div/div/div/div[1]/div/div[2]/button').click()time.sleep(0.5)QESDriver.GetScreenShot()# 点击重置并点击删除self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[1]/form/div/div[4]/div/div/div[2]/div/div/div/div[1]/div/div[1]/button').click()self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[2]/div/div[2]/div/div/div/div/div/table/tbody/tr[1]/td[5]/div/div/a').click()# 出现二次确认截图并返回# self.driver.switch_to.alert.accept()# self.driver.find_element(By.XPATH,'/html/body/div[6]/div/div[2]/div/div[2]/div/div/div[2]/button[2]').click()time.sleep(0.5)QESDriver.GetScreenShot()self.driver.refresh()

Test:
from common.Untils import QESDriver#from RegistrationPage import RegPagefrom LoginPage import LoginPagefrom HomePage import HomePagefrom MyProjectPage import MyProjectfrom MyPracticePage import MyPracticefrom QuestionBankCenterPage import MyQuestionBankfrom QuestionBankCenterPage import ProblemManagementfrom QuestionBankCenterPage import MyNotesif __name__ == "__main__":#登录账号LoginPage().GetloginPage()# 题库中心MyQuestionBank().GetMyQuestionBank()#题库中心--我的题库--新建题库#MyQuestionBank().CreateNewQuestionBank()# 试题管理#MyQuestionBank().TestManagement()#问题管理#ProblemManagement().GetProblemManagement()# 我的笔记MyNotes().GetMyNotes()# 关闭浏览器QESDriver.driver.quit()

4.4.7 模板广场

模板广场对元素的查找、添加模板、以及搜索模板的自动化测试:
TemplateSquarePage.py:
import timefrom selenium.webdriver.common.by import Byfrom common.Untils import QESDriverclass TemplateSquare:def __init__(self):self.url = "http://8.155.1.153:8081/template"self.driver = QESDriver.driverself.driver.get(self.url)def GetTemplateSquare(self):# 查找页面元素title = self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[1]/div[1]/div/span').textassert title == "模板广场"# 添加模板self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[1]/div[1]/span/div/div/button').click()time.sleep(1.5)QESDriver.GetScreenShot()# 关闭添加模板self.driver.find_element(By.XPATH, '//*[@id="editor"]/div[2]/div[1]/div[2]/div/button[1]').click()# 公共库self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[1]/div[3]/div/div[1]/div[1]/div/div[1]').click()# 私有库self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[1]/div[3]/div/div[1]/div[1]/div/div[2]').click()#返回公共库self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[1]/div[3]/div/div[1]/div[1]/div/div[1]').click()time.sleep(1)# 分类选择#点击二号self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[1]/div/form/div[1]/div[2]/div/div/div/div/div/div/span[2]').click()time.sleep(1)QESDriver.GetScreenShot()#点击考试self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[1]/div/form/div[1]/div[2]/div/div/div/div/div/div/span[3]').click()time.sleep(1)QESDriver.GetScreenShot()#点击自动化分类self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[1]/div/form/div[1]/div[2]/div/div/div/div/div/div/span[4]').click()time.sleep(1)QESDriver.GetScreenShot()# 搜索模板self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[1]/div[2]/div/div/div/div/div/span/span/input').send_keys("测试")self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[1]/div[2]/div/div/div/div/div/span/span/span/button').click()time.sleep(1.5)QESDriver.GetScreenShot()
Test:
from common.Untils import QESDriver#from RegistrationPage import RegPagefrom LoginPage import LoginPagefrom HomePage import HomePagefrom MyProjectPage import MyProjectfrom MyPracticePage import MyPracticefrom QuestionBankCenterPage import MyQuestionBankfrom QuestionBankCenterPage import ProblemManagementfrom QuestionBankCenterPage import MyNotesfrom TemplateSquarePage import TemplateSquare
if __name__ == "__main__":#登录账号LoginPage().GetloginPage()# 模板广场TemplateSquare().GetTemplateSquare()# 关闭浏览器QESDriver.driver.quit()

4.4.8 系统管理

系统管理这里分为6个模块,根据不同的模块分别设计对应的类对象进行自动化测试:
用户管理:UserManagement:
import timefrom selenium.webdriver.common.by import Byfrom common.Untils import QESDriver# 用户管理
class UserManagement:def __init__(self):self.url = "http://8.155.1.153:8081/system/user"self.driver = QESDriver.driverself.driver.get(self.url)def GetUserManagement(self):# 筛选机构self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[2]/div/div[2]/div/div[2]/div/div/div/div/div/table/thead/tr/th[1]/div/label/span/input').click()time.sleep(1.5)QESDriver.GetScreenShot()self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[2]/div/div[2]/div/div[2]/div/div/div/div/div[1]/div/div/span/a').click()# 按照姓名搜索self.driver.find_element(By.XPATH, '//*[@id="name"]').send_keys("k大王")# 点击搜索self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[2]/div/div[1]/form/div/div[2]/div/div/div[2]/div/div/div/div/div/div[2]/button/span').click()time.sleep(1.5)# 截图查看QESDriver.GetScreenShot()# 点击重置self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[2]/div/div[1]/form/div/div[2]/div/div/div[2]/div/div/div/div/div/div[1]/button/span').click()################################################################
    def CreateNewUsers(self):# 新建self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div/main/div/div[2]/div/div/div/div[2]/div/div[2]/div/div[1]/div/div[2]/div[1]/div/div[1]/button').click()# 输入用户名:测试新建用户self.driver.find_element(By.XPATH, '//*[@id="name"]').send_keys("测试新建用户")# 输入登录名:Testself.driver.find_element(By.XPATH, '//*[@id="username"]').send_keys("Test")# 输入密码:123456self.driver.find_element(By.XPATH, '//*[@id="password"]').send_keys("123456")# 输入确认密码:123456self.driver.find_element(By.XPATH, '//*[@id="rePassword"]').send_keys("123456")QESDriver.GetScreenShot()self.driver.refresh()# 批量导入self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[2]/div/div[2]/div/div[1]/div/div[2]/div[1]/div/div[2]/button').click()time.sleep(1.5)QESDriver.GetScreenShot()self.driver.refresh()# 编辑用户self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[2]/div/div[2]/div/div[2]/div/div/div/div/div/table/tbody/tr[2]/td[8]/div/div[1]/a').click()time.sleep(1.5)QESDriver.GetScreenShot()self.driver.refresh()
角色管理:RoleManagement
# 角色管理
class RoleManagement:def __init__(self):self.url = "http://8.155.1.153:8081/system/role"self.driver = QESDriver.driverself.driver.get(self.url)def GetRoleManagement(self):# 查询self.driver.find_element(By.CSS_SELECTOR, '#name').send_keys("k小兵")self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[1]/form/div/div[2]/div/div/div[2]/div/div/div/div/div/div[2]/button').click()time.sleep(1.5)self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[1]/form/div/div[2]/div/div/div[2]/div/div/div/div/div/div[1]/button').click()# 新建self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[2]/div/div[1]/div/div[2]/div[1]/div/div/button').click()# 输入角色信息self.driver.find_element(By.CSS_SELECTOR, '#name').send_keys("Test")# 输入角色编码self.driver.find_element(By.XPATH, '//*[@id="code"]').send_keys("10110")# 输入描述self.driver.find_element(By.XPATH, '//*[@id="remark"]').send_keys("测试新建角色")time.sleep(1.5)QESDriver.GetScreenShot()self.driver.refresh()# 编辑角色self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[2]/div/div[2]/div/div/div/div/div/table/tbody/tr[2]/td[6]/div/div[1]/a').click()time.sleep(1.5)QESDriver.GetScreenShot()self.driver.refresh()

组织机构:InstitutionalFramework
# 组织机构
class InstitutionalFramework:def __init__(self):self.url = "http://8.155.1.153:8081/system/dept"self.driver = QESDriver.driverself.driver.get(self.url)def GetInstitutionalFramework(self):# 新建操作self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[2]/div/div/div/div/div[1]/div/div[2]/div[1]/div/div/button').click()time.sleep(1.5)QESDriver.GetScreenShot()self.driver.refresh()

岗位设置:PostSetting
# 岗位设置
class PostSetting:def __init__(self):self.url = "http://8.155.1.153:8081/system/position"self.driver = QESDriver.driverself.driver.get(self.url)def GetPostSetting(self):# 输入查询self.driver.find_element(By.XPATH, '//*[@id="name"]').send_keys("k部队")self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[1]/form/div/div[2]/div/div/div[2]/div/div/div/div/div/div[2]/button').click()time.sleep(1.5)QESDriver.GetScreenShot()self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[1]/form/div/div[2]/div/div/div[2]/div/div/div/div/div/div[1]/button').click()# 新建岗位self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[2]/div/div[1]/div/div[2]/div[1]/div/div/button').click()# 输入岗位名称self.driver.find_element(By.CSS_SELECTOR, '#name').send_keys("测试新建岗位")time.sleep(1.5)# 输入岗位编码self.driver.find_element(By.XPATH, '//*[@id="code"]').send_keys("1010101")time.sleep(1.5)QESDriver.GetScreenShot()self.driver.refresh()# 编辑岗位self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[2]/div/div[2]/div/div/div/div/div/table/tbody/tr[2]/td[4]/div/div[1]/a').click()time.sleep(1.5)QESDriver.GetScreenShot()self.driver.refresh()# 删除岗位self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[2]/div/div[2]/div/div/div/div/div/table/tbody/tr[2]/td[4]/div/div[2]/a').click()time.sleep(1.5)QESDriver.GetScreenShot()self.driver.refresh()
字典管理:Dictionarization
# 字典设置
class Dictionarization:def __init__(self):self.url = "http://8.155.1.153:8081/system/dict"self.driver = QESDriver.driverself.driver.get(self.url)def GetDictionarization(self):# 输入查询self.driver.find_element(By.XPATH, '//*[@id="name"]').send_keys("k字典")self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[1]/form/div/div[2]/div/div/div[2]/div/div/div/div/div/div[2]/button').click()time.sleep(1.5)QESDriver.GetScreenShot()self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[1]/form/div/div[2]/div/div/div[2]/div/div/div/div/div/div[1]/button').click()time.sleep(1.5)# 新建字典self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[2]/div/div[1]/div/div[2]/div[1]/div/div/button').click()# 输入字典名称self.driver.find_element(By.XPATH, '//*[@id="name"]').send_keys("小k字典")# 输入字典编码self.driver.find_element(By.XPATH, '//*[@id="code"]').send_keys("2222222")time.sleep(1.5)QESDriver.GetScreenShot()self.driver.refresh()# 字典项self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[2]/div/div[2]/div/div/div/div/div/table/tbody/tr[2]/td[6]/div/div[1]/a').click()time.sleep(1.5)QESDriver.GetScreenShot()self.driver.refresh()
个人设置:PersonalSettings
# 个人设置
class PersonalSettings:def __init__(self):self.url = "http://8.155.1.153:8081/system/setting"self.driver = QESDriver.driverself.driver.get(self.url)def GetPersonalSettings(self):# 清空原有的信息QESDriver.ClearInput(self.driver.find_element(By.XPATH, '//*[@id="name"]'))QESDriver.ClearInput(self.driver.find_element(By.XPATH, '//*[@id="phone"]'))QESDriver.ClearInput(self.driver.find_element(By.XPATH, '//*[@id="email"]'))QESDriver.ClearInput(self.driver.find_element(By.XPATH, '//*[@id="profile"]'))time.sleep(5)# 输入新的self.driver.find_element(By.XPATH, '//*[@id="name"]').send_keys("k小王")# 查找输入手机号self.driver.find_element(By.XPATH, '//*[@id="phone"]').send_keys("18888888888")# 查找输入邮箱self.driver.find_element(By.XPATH, '//*[@id="email"]').send_keys("39999999999@qq.com")# 查找输入个人简介self.driver.find_element(By.XPATH, '//*[@id="profile"]').send_keys("无")time.sleep(1.5)QESDriver.GetScreenShot()# 点击提交self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div/div/div[2]/div[2]/div[1]/form/div[5]/div[2]/button').click()# 点击安全设置self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div/div/div[1]/ul/li[2]/span').click()time.sleep(1.5)QESDriver.GetScreenShot()# 点击修改self.driver.find_element(By.XPATH,'//*[@id="sk-layout"]/div/div/section/div[2]/main/div/div/div/div[2]/div[2]/div/div/ul/li/ul/li/a').click()#输入旧密码self.driver.find_element(By.XPATH,'//*[@id="oldPassword"]').send_keys("sss123")# 输入新密码self.driver.find_element(By.XPATH,'//*[@id="password"]').send_keys("sss111")# 确认新密码self.driver.find_element(By.XPATH,'//*[@id="confirmPassword"]').send_keys("sss111")time.sleep(1.5)QESDriver.GetScreenShot()self.driver.refresh()

4.4.9 测试代码

from common.Untils import QESDriver#from RegistrationPage import RegPagefrom LoginPage import LoginPagefrom HomePage import HomePagefrom MyProjectPage import MyProjectfrom MyPracticePage import MyPracticefrom QuestionBankCenterPage import MyQuestionBankfrom QuestionBankCenterPage import ProblemManagementfrom QuestionBankCenterPage import MyNotesfrom TemplateSquarePage import TemplateSquarefrom SystemManagementPage import UserManagementfrom SystemManagementPage import RoleManagementfrom SystemManagementPage import InstitutionalFrameworkfrom SystemManagementPage import PostSettingfrom SystemManagementPage import Dictionarizationfrom SystemManagementPage import PersonalSettingsif __name__ == "__main__":#登录账号LoginPage().GetloginPage()# 系统管理--用户管理#UserManagement().GetUserManagement()# 系统管理--用户管理--新建用户#UserManagement().CreateNewUsers()# 系统管理--角色管理#RoleManagement().GetRoleManagement()# 系统管理--组织机构#InstitutionalFramework().GetInstitutionalFramework()# 系统管理--岗位设置#PostSetting().GetPostSetting()# 系统管理--字典管理#Dictionarization().GetDictionarization()# 系统管理--个人设置PersonalSettings().GetPersonalSettings()# 关闭浏览器QESDriver.driver.quit()
这里推荐一个功能一个的去测试

五、兼容性测试

本次兼容性测试用到的场景有:

PC端:

  • Edge浏览器

  • Chrome浏览器

移动端:

  • IOS系统

  • Android系统

Edge浏览器:

Chrome浏览器:

IOS系统:

Android系统:

六、发现的BUG

6.1 功能异常

注册页面:

  • 打开大小写输入框不会有提示;
  • 在注册账号时登录账号设置为空格依然可以注册成功(没有对特殊符号进行处理);
  • “姓名” 标签对应的输入框placeholder为 “用户名”,标识逻辑混淆,易导致用户对输入项的理解偏差。

  • 空格输入未限制:姓名、登录账号、密码等必填项(带*)未限制全空格输入,可能导致用户注册无效信息(如全空格的账号 / 姓名),进而影响系统数据管理。
  • 密码一致性无校验:“密码” 与 “密码确认” 输入框未做一致性校验,用户输入不同密码时无错误提示,易导致注册流程因密码不匹配失败。
  • 密码复杂度无要求:未对密码长度、字符类型(大小写、数字、特殊字符)做限制,存在用户设置弱密码的安全隐患。
  • 注册成功或失败后无明确提示(如弹窗、页面文字提示),用户无法判断操作结果,体验不友好。

登录页面:

  • 用户名、密码输入框未限制全空格输入,可能导致用户误输入空格后登录失败,或因无效账号信息引发后续系统数据异常
  • 未对 “账号不存在”“密码错误” 等不同失败场景做差异化提示,仅靠 “登录失败” 无法让用户精准定位问题

首页:

  • 创建问卷后,“我的问卷” 列表无任何数据展示;创建考试后,“我的考试” 列表也无数据呈现。但页面右上角 “问卷数”“考试数” 统计值却随创建操作实时变化,形成数据展示与实际功能的割裂。
    影响:用户无法在列表中查看、编辑或管理自己创建的问卷 / 考试,破坏 “创建 - 查看 - 管理” 的操作闭环;统计数与列表的矛盾会让用户对系统数据的准确性产生质疑。
  • 统计数更新说明后台已成功存储问卷 / 考试数据,但前端列表模块未同步渲染数据,属于前端数据渲染或模块间数据同步逻辑的缺陷,导致功能模块衔接不完整。
  • 因列表无数据,用户无法对已创建的问卷 / 考试执行 “编辑”“删除”“发布” 等后续操作,直接影响系统核心功能的可用性。
  • 数据展示的不一致性会增加用户的操作困惑(如不确定创建是否成功、重复创建导致数据冗余),降低系统使用效率。

我的项目:

项目内容管理缺陷
存在 “请输入标题” 的默认占位项目卡片,未对用户进行 “及时修改标题” 的引导,易导致项目识别混淆,增加后续管理成本。
项目状态(如 “未发布”“收集中”)与操作逻辑的关联不明确,用户无法直观判断不同状态下可执行的操作(如发布、编辑、停止收集等)。

我的练习:

创建时间缺失:练习列表的 “创建时间” 列统一显示为 “-”,未正确展示练习的创建时间,用户无法通过时间维度管理或追溯练习,影响数据完整性。

题库中心--我的题库:

  • 首页元素加载不明确,当侧边栏出现的时候,主页面元素信息不全

  • 点击导出并无任何反应:

名称信息不完整:部分题库名称显示为截断形式(如 “C++ 基础...”),用户无法直观获取完整名称,易导致题库识别混淆,增加管理成本。
时间维度缺失:题库列表无 “创建时间”“更新时间” 字段,用户无法按时间维度管理或追溯题库,影响数据管理的全链路完整性。

模板广场:

  • 在通过输入的关键字搜索模板时,并不能根据关键字检索出对应的模板;

标签功能缺失:仅提供 “全部” 标签选项,缺乏细分标签(如 “考试”“问卷”“练习” 等),标签体系未发挥分类检索的功能价值。

系统管理--用户管理:

组织机构功能不全到时新建用户功能不全面

筛选功能单一:仅支持 “姓名” 维度筛选,缺乏 “角色”“手机号”“组织机构” 等常用筛选条件,用户无法高效定位目标用户。
操作功能不明确:“更多” 操作按钮功能未明确(如无悬浮提示或选项说明),用户无法预判后续操作选项,易引发交互困惑;且仅提供 “编辑” 操作,缺乏 “删除”“重置密码”“批量操作” 等核心用户管理功能。
批量导入逻辑模糊:“批量导入” 功能未明确导入格式要求、数据校验规则、导入后的数据处理逻辑(如重复数据处理),易导致用户数据导入异常或冗余。

角色权限体系混乱:多数用户角色为 “admin1”,权限可能过度集中或未按需分配,存在越权操作的安全风险;且角色与权限的映射关系不明确,无法保障权限管控的精准性。

系统管理--角色管理

筛选与操作功能不足
仅支持 “角色名称” 单一维度筛选,缺乏 “状态”“创建时间” 等常用条件,用户无法高效定位目标角色;
操作仅提供 “编辑” 和 “更多(...)”,缺少 “删除”“批量操作”“权限分配” 等核心功能;“更多” 按钮无功能说明,用户无法预判后续操作。

状态管控缺失
所有角色状态均为 “启用”,无 “禁用” 逻辑,若存在无效角色无法通过状态控制,易引发权限混乱(如废弃角色仍可分配权限)。
权限关联不透明
列表未展示角色对应的权限信息,用户无法确认角色的具体权限范围,权限管控缺乏透明度,增加权限配置的误操作风险。

系统管理--组织机构:

缺乏 “编辑”“删除”“层级调整”“批量操作” 等核心组织机构管理功能,仅 “新建” 按钮无法支撑完整的机构管理流程,功能模块完整性严重不足。
功能交互逻辑模糊:
左侧 “组织机构” 区域的操作图标(上下箭头、刷新)功能未明确,用户无法判断其用途(如是否用于机构层级调整、数据刷新);
右侧 “新建” 按钮的创建流程不清晰(如机构名称、层级、负责人等字段的填写要求,创建后的数据存储与展示逻辑),易导致新建操作无反馈或数据异常。

系统管理--岗位设置:

筛选与操作功能不足
仅支持 “名称” 单一维度筛选,缺乏 “数据权限”“创建时间” 等常用条件,用户无法高效定位目标岗位;
操作仅提供 “编辑”“删除”,缺少 “批量操作”“权限分配”“岗位关联(如关联角色、用户)” 等核心功能;且无操作反馈提示(如删除成功 / 失败),用户无法确认操作结果。

岗位权限体系不完整(如数据权限仅 “本人” 维度,缺乏 “部门”“全部” 等粒度),权限管控精度不足,存在越权操作的安全风险。

系统管理--字典设置:

创建校验缺失:字典创建时未对编码唯一性、命名规范性做校验,导致数据冗余(如重复编码、无意义命名),增加管理成本。
类型体系不足:字典类型均为 “问卷字典”,类型单一且未覆盖潜在业务场景,字典分类体系缺乏扩展性。

字段说明缺失:
字典类型的 “?” 提示若未关联具体说明(如 “问卷字典的适用场景”),则属于无效引导;
描述字段仅提示 “请输入字典描述信息”,未说明描述的用途(如 “用于记录字典功能、业务场景”),用户易忽略该字段的价值。
操作反馈待验:点击 “确定” 后,缺乏 “编码重复提示”“保存成功 / 失败弹窗” 等交互反馈,用户无法确认操作结果。

系统管理--个人设置:

手机号格式异常:输入的手机号 “10101110110110” 不符合国内手机号 “11 位数字” 的格式规范,且无输入校验提示(如 “请输入正确的手机号”),易导致用户留存无效联系方式,影响后续业务联动(如短信通知)。
邮箱格式存疑:邮箱 “302216515307@ss.com” 的域名 “ss.com” 非正规邮箱域名,邮箱格式校验缺失,可能导致邮件通知功能失效。
字段编辑引导不足:个人简介 “wdf” 无内容长度、填写规范的提示(如 “请输入 5-100 字个人简介”),用户易留存无效或歧义内容。
信息校验逻辑缺失:姓名、手机号、邮箱等字段未设置 “修改时的实时校验”(如输入手机号时即时提示格式错误),需用户提交后才可能发现问题,增加无效操作成本。

再修改用户密码之后,点击修改,会提示修改成功,但是再次点击修改之后,上一次的输入并没有清除,存在密码暴露风险:

修改的新密码与就密码相同时,依旧可以修改成功:

对密码框也没有特殊字符的限制,密码可以设置为空格
安全功能单一:仅提供 “账户密码修改” 功能,缺乏密码强度校验(如密码复杂度提示)、多因素认证(短信 / 邮箱验证码、第三方认证)、登录日志查看(记录登录时间、地点、设备)、安全策略配置(登录失败次数限制、密码过期提醒)等核心安全功能,无法满足账户安全的全链路管理需求。
密码修改流程模糊:“修改” 按钮未明确操作步骤(如是否需验证旧密码、新密码格式要求),用户操作时易因流程不清晰导致修改失败或设置弱密码。
弱密码风险:无密码复杂度要求(如长度、大小写、数字、特殊字符的组合规则),用户可能设置简单密码,增加账户被破解的风险。
密码找回链路缺失:未关联手机号、邮箱等 “密码找回” 渠道,若用户遗忘密码,可能无法自助重置,依赖人工处理会降低效率并增加安全管理成本。
“修改” 操作无前置引导(如 “修改密码需验证旧密码,新密码需包含大小写字母、数字和特殊字符”),用户操作时缺乏明确的规则参考,易引发无效操作或安全隐患。

6.2 兼容性异常

兼容性测试:

移动端:

  • 在IOS系统下的首页没有便捷导航栏;
  • 在IOS系统下无题库中心;
  • 在IOS系统下无模板广场;

在Android系统下:

首页没有便捷导航栏;
无题库中心;
无模版广场;

 七、测试总结

项目功能完整性

从项目整体交付状态来看,核心功能模块已实现基础运行能力,但在细节体验优化与安全合规性上仍存在待改进项,具体可划分为两类问题:

7.1 细节体验优化类问题

账号注册环节缺乏输入有效性校验,账号名与用户名字段允许输入空格字符,可能导致用户误操作(如创建无效账号)或后续系统数据管理异常;

当系统启用 “大小写敏感” 功能(如账号登录、内容检索的大小写区分)时,未通过页面提示、弹窗等方式向用户传递当前功能状态,易造成用户操作困惑(如输入密码时因大小写匹配问题导致登录失败)。

7.2 核心功能与安全风险类问题

搜索功能存在核心逻辑缺陷,检索结果与用户输入的关键字匹配度不足,无法精准反馈目标内容,直接影响用户对系统信息的获取效率;

密码修改模块存在安全隐患(如未校验原密码、允许设置弱密码、修改过程缺乏身份二次验证等),可能导致用户账号被非法篡改,威胁账号资产安全。

附录

整体系统测试用例

测试用例/问卷考试系统.xmind · @Eldrin-Han/测试项目-问卷考试系统 - Gitee.com

自动化测试用例

测试用例/自动化测试.xmind · @Eldrin-Han/测试项目-问卷考试系统 - 码云 - 开源中国

自动化测试脚本、

问卷调查系统自动化项目 · @Eldrin-Han/测试项目-问卷考试系统 - 码云 - 开源中国

http://www.dtcms.com/a/431400.html

相关文章:

  • 网站开发者常见问题网站建设 010
  • Digi-Star精准饲喂系统:牧场收益提升的利器,把Digi XBee模块应用到了极致
  • LED点阵屏
  • 图片方向矫正工具,批量处理超高效
  • 网站开发系统源代码模板兔自用主题WordPress
  • 鄢陵县网站wordpress编辑器器更换
  • 安阳网站推广优化点击最多的网站
  • 护理+人工智能研究热点数据分析项目实战(五)
  • 重庆市建设工程质量协会网站在招聘网站做销售
  • 2007 年真题配套词汇单词笔记(考研真相)
  • 羽毛球笔记
  • 风险 评估
  • Vue中使用el-table实现表格数据合并展示-demo
  • 【药物设计】三种分子碎片化方法介绍:Recap、BRICS与eMolFrag
  • 中断控制器介绍-硬件篇(arm)
  • 静态文件,动态文件,静态网站,动态网站
  • 如何做自动网站网站开发使用的工具
  • 用.net做购物网站西安公积金 网站建设
  • S7-200 SMART PROFINET 通信入门:硬件组态与原理详解
  • 已知三极管的类型(NPN/PNP)和基极引脚,如何区分集电极(c)和发射极(e)
  • 沈阳做网站 熊掌号西安百度竞价代运营
  • FFmpeg和ZLMediaKit 实现本地视频推流
  • 学校网站模板图片马来西亚做网站
  • 深圳展览设计网站建设门户是什么意思
  • k8s-Service服务
  • Arthas JVM 性能排查
  • 从静态图表到交互叙事:数据可视化的新范式与实现
  • QT肝8天07--连接数据库
  • 三合一网站建设什么意思做生存曲线的网站
  • 如何查询网站接入商校园网站建设系统设计