问卷管理系统测试报告
目录
- 一,报告概述
- 1,项目背景
- 2,测试目的
- 3,测试环境
- 二,测试用例
- 三,手动测试
- 1,注册账号页面
- 2,用户登录页面
- 3,系统首页功能
- 4,设置页面
- 5,我的项目页面
- 6,我的练习页面
- 7、我的题库页面功能
- 8,问题管理页面功能
- 9,我的笔记功能
- 10、模板广场页面功能
- 11、用户管理页面功能
- 12,个人设置页面功能
- 四,兼容性测试
- 五,自动化测试
- 1,驱动类
- 2、注册模块测试类
- 3,登录模块测试类
- 4,首页功能测试类
- 5,我的项目页面功能测试类
- 6,我的题库页面功能测试类
- 7,模板广场页面功能测试类
- 8,个人设置页面功能测试类
- 9,启动文件
- 六,性能测试
- 1,登录
- 2,首页
- 3,我的项目
- 4,我的题库
- 5,模板广场
- 6,用户列表
- 7,聚合报告
- 七,BUG描述
- 1,我的题库导出功能
- 2,我的模板功能
- 3,用户更新功能
- 八,测试总结
- 1,严重问题点
- 2,优秀表现点
- 3,总结
一,报告概述
1,项目背景
在当前数字化时代背景下,教育、培训与市场调研领域对于高效、便捷、智能的在线评估工具需求日益增长。传统的纸质问卷和线下考试方式在试题管理、组织协调、数据收集与分析等环节存在效率低下、成本高昂、覆盖面有限等诸多痛点,难以满足机构快速发展的需求。
为应对这一挑战,我们计划开发“问卷考试系统”,一款功能强大、操作便捷的基于Web的在线测评平台。该系统旨在为教育机构(如学校、培训机构)、企业培训部门以及市场调研机构提供一站式的问卷和考试解决方案。
系统包含以下核心模块:
- 用户管理:注册,登录,权限控制,个人信息编辑
- 首页:实时数据概览 ,快捷入口跳转
- 问卷/考试管理:创建,编辑,发布,统计分析
- 题库管理:试题创建,分类,导入导出,
- 自主学习中心:随机组卷练习,练习记录追踪
- 模板管理:预置模板库,模板复用与共享,一键生成项目
- 系统设置:安全设置,界面风格,通知偏好管理
2,测试目的
1. 功能验证(Functional Validation)
核心目标:确保系统行为与需求规格说明书100%对齐
① 用户流程验证
端到端测试用户注册/登录/权限分配流程
验证个人信息编辑及保存的准确性
② 核心业务流测试
完整覆盖问卷/考试从创建→编辑→发布→数据回收→统计分析的闭环
验证题库管理全功能(试题增删改查/分类标签/批量导入导出)
③ 高阶功能确认
测试模板创建、共享机制及权限控制(如部门级模板可见性)
验证练习系统中错题自动归档与练习记录的实时同步性
2. 用户体验优化(UX Optimization)
核心目标:打造符合直觉且无障碍的操作流
① 交互设计验证
评估导航路径深度(如从模板广场创建考试需≤3步)
测试功能入口布局合理性(关键操作在1屏内可见)
② 反馈机制测试
验证90%以上操作错误提示的易懂性(含表单验证提示)
③ 效率增强验证
测量高频操作耗时(如题库导入100题≤5秒)
验证批量操作流程的便捷性(如全选试题删除)
3. 系统稳定性保障(System Reliability)
核心目标:保障生产环境可持续运行
① 负载能力验证
压力测试:支撑5000人并发考试(含实时提交防崩溃)
② 异常工况处理
模拟网络中断时答卷自动缓存与恢复机制
③ 数据完整性检查
验证跨模块数据同步(如练习错题→题库中心→笔记)
4. 安全性加固(Security Enhancement)
核心目标:构建零信任防护体系
攻击面防御测试
渗透测试:SQL注入/XSS/CSRF等OWASP Top 10漏洞扫描
敏感操作二次验证(如删除题库需短信确认)
② 权限控制验证
越权测试:普通用户禁止访问系统管理模块
5. 兼容性确认(Compatibility Assurance)
核心目标:实现全平台无缝运行
① 浏览器兼容矩阵
覆盖:Chrome/Firefox/Edge(最新3个主版本)
② 跨平台适配测试
操作系统:Windows/macOS/Ubuntu/Android/iOS
3,测试环境
- 操作系统:Windows 11
- 浏览器:Chrome/Firefox/Edge
- 测试工具:Selenium、JMeter、postman
二,测试用例
由于测试用例太大了,所以分成三个图发出来,最下面有百度网盘图片链接
通过网盘分享的文件:问卷考试系统ui测试用例.png 链接: https://pan.baidu.com/s/1f45RRt4gf7feY6Dm1791lw 提取码: 6666
三,手动测试
1,注册账号页面
测试场景一:输入用户名、登录账号、密码、确认密码后进行注册
预期结果:注册成功跳转到登录页面可以正常登录跳转到问卷考试系统首页
测试场景二:不输入用户名、但输入登陆账号、密码、确认密码后进行注册
预期结果:提示:用户名是必填项
测试场景三:输入用户名、但不输入登陆账号、密码、确认密码后进行注册
预期结果:提示:登陆账号不能为空,密码是必填项,请再次输入密码
测试场景四:输入用户名、登陆账号、但密码、确认密码不足六位后进行注册
预期结果:提示:密码至少6位
测试场景五:密码和密码确认时输入的不一致
预期结果:提示两次密码不一致
2,用户登录页面
测试场景一:输入正确用户名和密码点击登录
预期结果:登录成功,直接跳转到问卷考试系统首页
测试场景二:输入错误的用户名和密码点击登录
预期结果:提示错误的用户名和密码
测试场景三:输入错误的用户名和密码点击眼睛符号查看已经输入的密码
预期结果:可看到自己已经输入的密码
测试场景四:输入用户名但不输入密码点击登录
预期结果:提示密码是必填项
测试场景五:输入用户名但不输入密码点击登录
预期结果:提示密码是必填项
3,系统首页功能
测试场景一:点击“创建问卷”按钮
预期结果:跳转到编辑问卷页面
测试场景二:编辑好问卷后点击“保存”按钮
预期结果:提示保存成功,首页问卷数+1,可在我的项目中查看到新创建标题为“这是测试来的啊”的问卷
测试场景三:点击“创考试卷”按钮
预期结果:跳转到编辑考试页面
测试场景三:正常看到首页内容,的考试情况,我的问卷情况,问卷记录,考试记录
预期结果:显示我要参加考试的时间内考试名称和完成状态,显示我要参加问卷的时间内考试名称和完成状态,显示我已参加问卷的答题开始时间和答题结束时间,显示我已参加考试的答题开始时间和答题结束时间
4,设置页面
测试场景一:点击页面右上方设置图标
预期结果:弹出选项栏
测试场景二:点击“整体风格设置”按钮后更改为暗黑风格
预期结果:页面主题变为暗黑风格
测试场景三:点击“退出登录”按钮
预期结果:直接跳转到登录页面
5,我的项目页面
测试场景一:点击项目搜索框,输入已创建的项目名称
预期结果:显示搜索出的项目
测试场景二:点击“新建”按钮
预期结果:弹出需要新建的项目选项栏
测试场景三:点击“问卷调查”按钮,并编辑好问卷
预期结果:跳转到编辑问卷页面,并在我的项目可看到新创建的项目
测试场景四:点击“回收站”按钮
预期结果:弹出回收站页面
测试场景五:删除项目,并点击回收站回收
预期结果:项目删除成功,通过回收站回收,再项目里面重新看到
测试场景六:开启问卷后,点击“打开”按钮并作答
预期结果:跳转到正式问卷,可以作答并提交,提交后项目状态由未发布变为收集中
6,我的练习页面
测试场景一:点击状态选择框,状态选择“正在进行”并且点击“查询”按钮
预期结果:查询显示出正在进行状态的练习
测试场景二:点击状态选择框,状态选择“已完成”并且点击“查询”按钮
预期结果:查询显示出已完成状态的练习
测试场景三:点击“重置”按钮
预期结果:状态选择框清空,下方显示全部我的练习
7、我的题库页面功能
测试场景一:名称输入框输入题库名称,选择题库的类型,点击“查询”按钮
预期结果:查询出了符合条件的题库
测试场景二:点击“重置”按钮
预期结果:名称输入框和类型选择框清空,下方题库列表中显示全部题库
测试场景三:点击“新建”按钮
预期结果:弹出新增题库编辑页面
测试场景四:编辑好题库后点击“确定”按钮
预期结果:题库列表新增了刚新建的名为“测试新增题库功能”的题库
测试场景五:新建题库时未填写题库名称和选择题库类型
预期结果:提示题库名称不能为空,请选择题库类型
测试场景七:点击“导出”按钮
预期结果:成功导出了选择的题库
实际结果:点击“导出”按钮没有反应
Bug:“导出”按钮异常,导出功能失效
8,问题管理页面功能
测试场景一:选择好类型和题型,输入要查询的问题名称,点击“查询”按钮
预期结果:查询出了符合条件的问题
测试场景二:选择好类型和题型,输入要查询的问题名称,点击“查询”按钮
预期结果:因为没有这个问题,查询结果为空
测试场景三:点击“重置”按钮
预期结果:类型、题型选项框和名称输入框清空,试题列表显示全部问题
9,我的笔记功能
测试场景一:输入好问题和笔记,输入要查询的问题名称,点击“查询”按钮
预期结果:查询出了符合条件的笔记
测试场景二:什么也不输入点击查询
预期结果:显示所有查询结果
测试场景三:点击“重置”按钮
预期结果:显示所有查询结果
10、模板广场页面功能
测试场景一:点击“添加模板”按钮
预期结果:跳转到编辑模板页面
测试场景二:编辑好模板后点击“保存”按钮
预期结果:可以在模板广场公有库看到新添加的名为“test”的模板
测试场景三:点击模板搜索框输入已有模板名字(test),点击“搜模板”按钮
预期结果:搜索出并显示名为“test”的模板
实际结果:输入“test”点击“搜模板”按钮后,什么也没有搜索出来
Bug:“搜模板”按钮异常,搜模板功能失效
11、用户管理页面功能
测试场景一:姓名输入框输入用户姓名后,点击“查询”按钮
预期结果:查询到此用户信息
测试场景二:点击“重置”按钮
预期结果:姓名输入框清空,下面系统用户列表显示全部用户信息
测试场景三:点击“新建”按钮
预期结果:弹出新建编辑用户信息页面
测试场景四:编辑好新建用户信息,点击“确定”按钮
预期结果:用户列表中新增了刚创建的test用户
测试场景五:编辑新建用户信息时,登录名输入的是已存在的用户登录名
预期结果:提示登录名已存在
测试场景六:编辑新建用户信息时,输入密码和确认密码两次输入的不一致
预期结果:提示两次输入的密码不一致
测试场景七:编辑新建用户信息时,未输入用户名
预期结果:提示用户名不能为空
测试场景八:编辑新建用户信息时,必选项状态未选择,点击“确定”按钮
预期结果:提示请选择状态
实际结果:成功创建了新用户1111,并且状态为激活
Bug:必选项状态未选也正常创建用户成功了
测试场景九:点击“编辑”按钮
预期结果:弹出修改用户信息页面
测试场景十:用户名修改为已存在的用户名张三
预期结果:提示用户名已存在
实际结果:成功创建出了用户名为abcabc的用户
Bug:用户名已存在不进行提示而且还可以正常创建
测试场景十一:登录名修改为已存在的用户名张三
预期结果:提示用户名已存在
测试场景十二:点击“重置密码”按钮进行重置密码
预期结果:修改成功
测试场景十三:点击“删除用户”按钮
预期结果:提示删除成功
12,个人设置页面功能
测试场景一:基本设置信息全部填写后点击“提交”按钮
预期结果:提示更新基本信息成功
测试场景二:基本信息不输入姓名
预期结果:提示请输入您的昵称
测试场景三:基本信息不输入手机号
预期结果:提示请输入您的联系电话
测试场景四:安全设置界面修改账户密码,点击“修改”按钮
预期结果:弹出修改密码页面弹窗
测试场景六:旧密码未输入
预期结果:提示请输入密码
测试场景七:输入旧密码,新密码和确认密码不一致
预期结果:提示两次密码输入不一致
测试场景七:输入旧密码,新密码和确认密码
预期结果:提示密码修改成功
四,兼容性测试
测试场景一:在GoogleChrome浏览器下进入问卷考试系统
预期结果:无异常且一切布局显示功能等与其一致
测试场景二:在Edge浏览器下进入问卷考试系统
预期结果:无异常且一切布局显示功能等与其一致
测试场景三:在安卓进入问卷考试系统
预期结果:无异常且布局显示不同但功能等与其一致
五,自动化测试
自动化测试项目结构
1,驱动类
# 创建一个浏览器对象from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import Byclass Driver:driver = ""def __init__(self):chrome_driver_path = "./chromedriver-win64/chromedriver.exe"# 创建Chrome浏览器实例self.driver = webdriver.Chrome(service=Service(chrome_driver_path))# 添加隐式等待:因为隐式等待的作用域在driver的整个生命周期self.driver.implicitly_wait(3)QEDriver = Driver()
2、注册模块测试类
import timefrom selenium.webdriver.common.by import Byfrom common.utils import QEDriver#测试问卷考试系统注册页面class QERegisterTest:url = ""driver = ""def __init__(self):self.url = "http://8.155.1.153:8081/user/register"self.driver = QEDriver.driverself.driver.get(self.url)#注册成功的测试用例def RegisterSuccessTest(self):self.driver.maximize_window()self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("test1111")self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("test111")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span").click()time.sleep(3)#如果能跳转到登录页面,并找到登录按钮则说明注册成功,否则注册失败self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button > span")########################################################################################################################### 注册失败的测试用例def RegisterFailTest(self):# 测试用例一:不输入用户名、但输入登陆账号、密码、确认密码后进行注册self.driver.maximize_window()self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("")self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("test111")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span").click()time.sleep(3)#检查是否注册失败actual = self.driver.find_element(By.CSS_SELECTOR, "#name_help > div").text#断言检测一下是否符合预期assert actual == "用户名是必填项!"###########################################################################################################################测试用例二:输入了已经存在的账号进行注册self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("test1111")self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("test111")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span").click()time.sleep(3)#检查是否注册失败actual = self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___1k5Ro > div.main___19HXK > div > form > div.ant-alert.ant-alert-error > div > div").text#断言检测一下是否符合预期assert actual == "账号已存在"########################################################################################################################### 测试用例三:密码和密码确认时输入的不一致#清空输入框QEDriver.clear(self.driver.find_element(By.CSS_SELECTOR, "#name"))QEDriver.clear(self.driver.find_element(By.CSS_SELECTOR, "#username"))QEDriver.clear(self.driver.find_element(By.CSS_SELECTOR, "#password"))QEDriver.clear(self.driver.find_element(By.CSS_SELECTOR, "#rePassword"))self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("test")self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("test")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("123123")self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span").click()time.sleep(3)#检查是否注册失败actual = self.driver.find_element(By.CSS_SELECTOR, "#rePassword_help > div").text#断言检测一下是否符合预期assert actual == "两次密码不一致!"#测试
# register = QERegisterTest()
# # # register.RegisterFailTest()
# register.RegisterSuccessTest()
#
# #指定浏览器的退出
# QEDriver.driver.quit()
3,登录模块测试类
from selenium.webdriver.common.by import Byfrom common.utils import QEDriver
#测试博客登录界面class QELogin:url = ""driver = ""def __init__(self):self.url = "http://8.155.1.153:8081/user/login"self.driver = QEDriver.driverself.driver.get(self.url)#成功登录得测试用例def LoginSucTest(self):self.driver.maximize_window()self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("111111")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("1111111")self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button > span").click()# 如果能够找到问卷考试系统首页用户的昵称,说明登录成功,否则登陆失败self.driver.find_element(By.XPATH,"/html/body/div[1]/div/div/div/section/div[2]/header[2]/div/div[3]/div/div/div/span/div/span[2]")#失败登录得测试用例# 登录异常的测试用例def LoginFailTest(self):# 测试用例一:输入错误的用户名和错误的密码self.driver.maximize_window()self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("error")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("1234")self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button > span").click()# 验证是否登陆失败actual = self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > div.ant-alert.ant-alert-error > div > div").textprint(f"提示信息: {actual}")# 断言检测一下是否符合预期assert actual == "错误的用户名和密码"########################################################################################################################### 测试用例二:输入错误的用户名和正确的密码self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("error")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button > span").click()# 验证是否登陆失败actual = self.driver.find_element(By.CSS_SELECTOR,"body > #root > div > div.content___2zk1- > div.main___x4OjT > div > form > div.ant-alert.ant-alert-error > div > div").textprint(f"提示信息: {actual}")# 断言检测一下是否符合预期assert actual == "错误的用户名和密码"########################################################################################################################### 测试用例三:输入正确的用户名和错误的密码self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("admin")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("1234")self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button > span").click()# 验证是否登陆失败actual = self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > div.ant-alert.ant-alert-error > div > div").textprint(f"提示信息: {actual}")# 添加屏幕截图QEDriver.getScreenshot()# 断言检测一下是否符合预期assert actual == "错误的用户名和密码"########################################################################################################################### 测试用例四:不输入用户名但输入密码self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button > span").click()# 验证是否登陆失败actual = self.driver.find_element(By.CSS_SELECTOR, "#username_help > div").textprint(f"提示信息: {actual}")# 添加屏幕截图########################################################################################################################### 测试用例五:输入用户名但不输入密码self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("admin")self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button > span").click()# 验证是否登陆失败actual = self.driver.find_element(By.CSS_SELECTOR, "#password_help > div").textprint(f"提示信息: {actual}")# 添加屏幕截图QEDriver.getScreenshot()# 断言检测一下是否符合预期assert actual == "密码是必填项!"# 测试
# login = QELogin()
# # # login.LoginFailTest()
# login.LoginSucTest()# 指定浏览器的退出
# QEDriver.driver.quit()
4,首页功能测试类
import time
from selenium.webdriver.common.by import By
from common.utils import QEDriver#测试问卷考试系统首页class QEHomeTest:url = ""driver = ""def __init__(self):self.url = "http://8.155.1.153:8081/home"self.driver = QEDriver.driverself.driver.get(self.url)#进行首页元素的查找检查def HomeCheckElement(self):self.driver.maximize_window()#检查首页标题元素self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-heading > div")#检查问卷数元素self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div.extraContent___3rMo7 > div:nth-child(1) > div > div.ant-statistic-title")#检查考试数元素self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div.extraContent___3rMo7 > div:nth-child(2) > div > div.ant-statistic-title")#检查我的考试按钮self.driver.find_element(By.CSS_SELECTOR, "#rc-tabs-0-tab-exam")#检查我的问卷按钮self.driver.find_element(By.CSS_SELECTOR, "#rc-tabs-0-tab-survey")#检查问卷记录按钮self.driver.find_element(By.CSS_SELECTOR, "#rc-tabs-0-tab-surveyHistory")#检查考试记录按钮self.driver.find_element(By.CSS_SELECTOR, "#rc-tabs-0-tab-examHistory")#检查创建问卷按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-col.ant-col-xs-24.ant-col-sm-24.ant-col-md-24.ant-col-lg-24.ant-col-xl-8 > div > div.ant-card-body > div > a:nth-child(1)")#检查创建考试按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-col.ant-col-xs-24.ant-col-sm-24.ant-col-md-24.ant-col-lg-24.ant-col-xl-8 > div > div.ant-card-body > div > a:nth-child(2)")# home = QEHomeTest()
# home.HomeCheckElement()#指定浏览器的退出
# QEDriver.driver.quit()
5,我的项目页面功能测试类
import timefrom selenium.webdriver.common.by import By
from common.utils import QEDriver#测试问卷考试系统我的项目页面class QEProjectTest:url = ""driver = ""def __init__(self):self.url = "http://8.155.1.153:8081/project"self.driver = QEDriver.driverself.driver.get(self.url)#进行页面元素的查找检查def ProjectCheckElement(self):self.driver.maximize_window()#检查页面标题元素self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-heading > div > span")#检查新建按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-heading > span > div > div > button")#检查搜索框self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div > div > span > span > input")#检查搜索按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div > div > span > span > span > button > span > svg")###########################################################################################################################功能测试def ProjectFunctionTest(self):#测试新建功能#点击新建按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-heading > span > div > div > button").click()#测试用例一:测试新建问卷调查功能#选择新建问卷调查self.driver.find_element(By.CSS_SELECTOR, "body > div:nth-child(7) > div > div > ul > li:nth-child(1)").click()time.sleep(1)#添加屏幕截图QEDriver.getScreenshot()#点击保存按钮self.driver.find_element(By.CSS_SELECTOR, "#editor > div.survey-main-panel > div.survey-main-panel-toolbar > div:nth-child(2) > div > button.ant-btn.ant-btn-primary.ant-btn-sm").click()#返回到项目页面self.driver.back()self.driver.back()time.sleep(1)#测试项目查询功能self.driver.find_element(By.XPATH, "/html/body/div[1]/div/div/div/section/div[2]/main/div/div[1]/div[2]/div/div/div/div/div/div/div/span/span/input").send_keys("请输入标题")time.sleep(1)#点击查询按钮self.driver.find_element(By.XPATH, "/html/body/div[1]/div/div/div/section/div[2]/main/div/div[1]/div[2]/div/div/div/div/div/div/div/span/span/span/button").click()time.sleep(1)#检查是否查询成功同时验证刚刚新建功能是否保存成功actual = self.driver.find_element(By.XPATH, "/html/body/div[1]/div/div/div/section/div[2]/main/div/div[2]/div/div/div/div[1]/div/div/div/div[1]/div/div/div/div/div/div[1]/span[1]").textprint(f"提示信息: {actual}")#断言检测一下是否符合预期assert actual == "请输入标题"###########################################################################################################################测试用例二:测试新建在线考试功能#点击新建按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-heading > span > div > div > button").click()#选择新建在线考试self.driver.find_element(By.XPATH, "/html/body/div[5]/div/div/ul/li[2]").click()time.sleep(1)#点击保存按钮self.driver.find_element(By.XPATH, "/html/body/div[1]/div/div[2]/div/div[2]/div[1]/div[2]/div/button[5]").click()time.sleep(1)#返回到项目页面self.driver.back()self.driver.back()#测试项目查询功能self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div > div > span > span > input").send_keys("考试名称")#点击查询按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div > div > span > span > span > button > span > svg").click()#检查是否查询成功同时验证刚刚新建功能是否保存成功actual = self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-list.ant-list-split.ant-list-grid.survey-home-content > div > div > div > div > div > div > div > div > div > div.card-header > span.survey-title").textprint(f"项目名称: {actual}")#断言检测一下是否符合预期assert actual == "考试名称"# project = QEProjectTest()
# project.ProjectCheckElement()
# project.ProjectFunctionTest()#指定浏览器的退出
# QE_river.driver.quit()
6,我的题库页面功能测试类
import time
from selenium.webdriver.common.by import Byfrom common.utils import QEDriver#测试问卷考试系统我的题库页面class QEQuestionTest:url = ""driver = ""def __init__(self):self.url = "http://8.155.1.153:8081/repo/index"self.driver = QEDriver.driverself.driver.get(self.url)#进行页面元素的查找检查def QuestionCheckElement(self):self.driver.maximize_window()#检查名称输入标签self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(1) > div > div > div.ant-col.ant-form-item-label > label")#检查名称输入框self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(1) > div > div > div.ant-col.ant-form-item-control > div > div > span")#检查类型选择框标签self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(2)")#检查重置按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(3) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(1) > button")#检查查询按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(3) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(2) > button")#检查新建按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div:nth-child(2) > div > div.ant-pro-table-list-toolbar > div > div.ant-space.ant-space-horizontal.ant-space-align-center.ant-pro-table-list-toolbar-right > div:nth-child(1) > div > div:nth-child(1) > button")#检查导出按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div:nth-child(2) > div > div.ant-pro-table-list-toolbar > div > div.ant-space.ant-space-horizontal.ant-space-align-center.ant-pro-table-list-toolbar-right > div:nth-child(1) > div > div:nth-child(2) > button")#检查题库列表self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div:nth-child(2) > div > div.ant-pro-table-list-toolbar > div > div.ant-pro-table-list-toolbar-left > div")#检查文本导入按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div:nth-child(2) > div > div.ant-table-wrapper > div > div > div > div > div > table > tbody > tr:nth-child(2) > td:nth-child(9) > div > div:nth-child(1) > a")#检查试题管理按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div:nth-child(2) > div > div.ant-table-wrapper > div > div > div > div > div > table > tbody > tr:nth-child(2) > td:nth-child(9) > div > div:nth-child(3) > a")###########################################################################################################################功能测试def QuestionFunctionTest(self):type ="考试"#测试新建功能#点击新建按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div:nth-child(2) > div > div.ant-pro-table-list-toolbar > div > div.ant-space.ant-space-horizontal.ant-space-align-center.ant-pro-table-list-toolbar-right > div:nth-child(1) > div > div:nth-child(1) > button").click()#输入题库名称# 切换到点击新建之后的页面之中,因为新建之后的页面里面的元素的id和没点击新建的时候的元素是一样的,所以要限制一下查找元素的范围drawer = self.driver.find_element(By.CLASS_NAME,"ant-drawer-wrapper-body")#后续使用drawer 进行查找元素操作,意思就是在ant-drawer-body元素范围内进行查找元素drawer.find_element(By.CSS_SELECTOR, "#name").send_keys("测试新增题库功能")time.sleep(3)#选择题库类型drawer.find_element(By.CSS_SELECTOR, "#mode").click()time.sleep(1)#选择问卷select_option= drawer.find_element(By.CLASS_NAME,"rc-virtual-list-holder-inner")option = select_option.find_element(By.XPATH,f'.//div[@title="问卷"]')self.driver.execute_script("arguments[0].scrollIntoView(true);",option)self.driver.execute_script("arguments[0].click();", option)# 这里并不是一个select组件,不能直接使用Selecttime.sleep(2)time.sleep(1)#点击确定按钮drawer.find_element(By.XPATH, "/html/body/div[4]/div/div[3]/div/div/div[3]/div/div/div[2]/button").click()#检查是否回到题库列表页面,如果是则创建题库成功,否则创建失败self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(3) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(2) > button")###########################################################################################################################测试查询功能#名称输入框输入题库名称“测试新增题库功能”self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("测试新增题库功能")#点击查询按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(3) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(2) > button").click()time.sleep(1)#验证是否查询到,如果题库列表有输出则查询成功,否则查询失败self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div:nth-child(2) > div > div.ant-table-wrapper > div > div > div > div > div > table > tbody > tr.ant-table-row.ant-table-row-level-0 > td:nth-child(1) > div")time.sleep(1)###########################################################################################################################测试重置功能#点击重置按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(3) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(1) > button").click()time.sleep(1)#验证是否重置成功,如果名称输入框为空则代表重置成功,否则重置失败actual = self.driver.find_element(By.CSS_SELECTOR, "#name").text# 断言检测一下是否符合预期assert actual == ""# question = QEQuestionTest()
# question.QuestionCheckElement()
# question.QuestionFunctionTest()# 指定浏览器的退出
# QEDriver.driver.quit()
7,模板广场页面功能测试类
import time
from selenium.webdriver.common.by import Byfrom common.utils import QEDriver#测试问卷考试系统模板广场页面class QETemplateTest:url = ""driver = ""def __init__(self):self.url = "http://8.155.1.153:8081/template"self.driver = QEDriver.driverself.driver.get(self.url)#进行页面元素的查找检查def TemplateCheckElement(self):self.driver.maximize_window()#检查页面标题self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-has-footer.ant-page-header-ghost > div.ant-page-header-heading > div > span")#检查模板名字检索框self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-has-footer.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > span > span > input")#检查搜模板按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-has-footer.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > span > span > span > button")#检查添加模板按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-has-footer.ant-page-header-ghost > div.ant-page-header-heading > span > div > div > button")#检查公有库按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-has-footer.ant-page-header-ghost > div.ant-page-header-footer > div > div.ant-tabs-nav > div.ant-tabs-nav-wrap > div > div.ant-tabs-tab.ant-tabs-tab-active")#检查私有库按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-has-footer.ant-page-header-ghost > div.ant-page-header-footer > div > div.ant-tabs-nav > div.ant-tabs-nav-wrap > div > div:nth-child(2)")#检查分类标签self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-card > div > form > div:nth-child(1) > div.label___12r3x > span")#检查标签标签self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-card > div > form > div:nth-child(2) > div.label___12r3x > span")###########################################################################################################################功能测试def TemplateFunctionTest(self):#测试添加模板功能#点击添加模板按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-has-footer.ant-page-header-ghost > div.ant-page-header-heading > span > div > div > button").click()time.sleep(1)#点击保存按钮self.driver.find_element(By.CSS_SELECTOR, "#editor > div.survey-main-panel > div.survey-main-panel-toolbar > div:nth-child(2) > div > button:nth-child(5)").click()time.sleep(1)#输入新增模板名称self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("测试添加模板功能")#分类输入二号self.driver.find_element(By.CSS_SELECTOR, "#category").send_keys("二号")#选择添加到公有库self.driver.find_element(By.CSS_SELECTOR, "#survey-modal-container > div > div > div.ant-modal-wrap > div > div.ant-modal-content > div.ant-modal-body > form > div:nth-child(4) > div > div > div > div > label > span.ant-checkbox > input").click()#点击保存按钮self.driver.find_element(By.CSS_SELECTOR, "#survey-modal-container > div > div > div.ant-modal-wrap > div > div.ant-modal-content > div.ant-modal-footer > button.ant-btn.ant-btn-primary").click()time.sleep(5)#点击关闭按钮self.driver.find_element(By.CSS_SELECTOR, "#editor > div.survey-main-panel > div.survey-main-panel-toolbar > div:nth-child(2) > div > button.ant-btn.ant-btn-primary.ant-btn-sm.ant-btn-dangerous").click()time.sleep(1)#验证是否添加模板成功actual = self.driver.find_element(By.XPATH, "//*[contains(text(),'测试添加模板功能')]").textprint(f"找到的文本内容: {actual}")#断言检测一下是否符合预期assert "测试添加模板功能" in actual###########################################################################################################################测试模板名字检索功能#模板检索框中输入模板名字“测试添加模板功能”self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-has-footer.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > span > span > input").send_keys("测试添加模板功能")#点击搜模板按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-has-footer.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > span > span > span > button").click()time.sleep(1)#验证是否检索成功#若搜索出显示”暂无数据“则说明搜索功能异常,反之搜索功能成功actual = self.driver.find_element(By.XPATH, "//*[contains(text(),'暂无数据')]").textprint(f"找到的文本内容: {actual}")#断言检测一下是否符合预期assert "暂无数据" in actual#Bug:搜模板搜索功能异常# template = QETemplateTest()
# # template.TemplateCheckElement()
# template.TemplateFunctionTest()# 指定浏览器的退出
# QEDriver.driver.quit()
8,个人设置页面功能测试类
#测试用例一:不输入姓名,其他信息正常输入#输入手机号self.driver.find_element(By.CSS_SELECTOR, "#phone").send_keys("14745667235")#输入邮箱self.driver.find_element(By.CSS_SELECTOR, "#email").send_keys("lvdongrui2023@163.com")#输入个人简介self.driver.find_element(By.CSS_SELECTOR, "#profile").send_keys("这是更新个人基本信息功能测试")#点击提交按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div.ant-space.ant-space-horizontal.ant-space-align-center > div:nth-child(2) > button").click()time.sleep(1)# 添加屏幕截图# QE_Driver.getScreenshot()#验证是否更新失败actual = self.driver.find_element(By.CSS_SELECTOR, "#name_help > div").textprint(f"提示信息: {actual}")# 添加屏幕截图# QE_Driver.getScreenshot()# 断言检测一下是否符合预期assert actual == "请输入您的昵称!"########################################################################################################################### 测试用例二:不输入手机号,其他信息正常输入#清空姓名输入框# 输入姓名self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("Admin123")# 输入邮箱self.driver.find_element(By.CSS_SELECTOR, "#email").send_keys("lvdongrui2023@163.com")# 输入个人简介self.driver.find_element(By.CSS_SELECTOR, "#profile").send_keys("这是更新个人基本信息功能测试")# 点击提交按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div.ant-space.ant-space-horizontal.ant-space-align-center > div:nth-child(2) > button").click()time.sleep(1)# 添加屏幕截图# QE_Driver.getScreenshot()# 验证是否更新失败actual = self.driver.find_element(By.CSS_SELECTOR, "#phone_help > div").textprint(f"提示信息: {actual}")# 添加屏幕截图# QE_Driver.getScreenshot()# 断言检测一下是否符合预期assert actual == "请输入您的联系电话!"########################################################################################################################### 测试用例三:不输入邮箱,其他信息正常输入# 输入姓名self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("Admin123")#输入手机号self.driver.find_element(By.CSS_SELECTOR, "#phone").send_keys("14745667235")# 输入个人简介self.driver.find_element(By.CSS_SELECTOR, "#profile").send_keys("这是更新个人基本信息功能测试")# 点击提交按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div.ant-space.ant-space-horizontal.ant-space-align-center > div:nth-child(2) > button").click()time.sleep(1)# 添加屏幕截图# QE_Driver.getScreenshot()# 验证是否更新失败actual = self.driver.find_element(By.CSS_SELECTOR, "#email_help > div").textprint(f"提示信息: {actual}")# 添加屏幕截图# QE_Driver.getScreenshot()# 断言检测一下是否符合预期assert actual == "请输入您的邮箱!"#
# personal = QEPersonalTest()
# personal.PersonalCheckElement()
# personal.PersonalFailTest()
# personal.PersonalSuccessTest()# 指定浏览器的退出
# QEDriver.driver.quit()
9,启动文件
from tests import QERegisterTest, QETemplateTest
from tests import QELoginTest
from tests import QEHomeTest
from tests import QEProjectTest
from tests import QEQuestionTest
from tests import QEPersonalTest
from common.utils import QEDriverif __name__ == '__main__':# 已注释掉的注册测试# QERegisterTest.QERegisterTest().RegisterFailTest()# QERegisterTest.QERegisterTest().RegisterSuccessTest()# QELoginTest.QELogin().LoginFailTest()QELoginTest.QELogin().LoginSucTest()QEHomeTest.QEHomeTest().HomeCheckElement()QEProjectTest.QEProjectTest().ProjectCheckElement()QEProjectTest.QEProjectTest().ProjectFunctionTest()QEQuestionTest.QEQuestionTest().QuestionCheckElement()QEQuestionTest.QEQuestionTest().QuestionFunctionTest()QETemplateTest.QETemplateTest().TemplateCheckElement()QETemplateTest.QETemplateTest().TemplateFunctionTest()QEPersonalTest.QEPersonalTest().PersonalCheckElement()QEPersonalTest.QEPersonalTest().PersonalSuccessTest()# 指定浏览器的退出QEDriver.driver.quit()print("所有测试已完成执行")
六,性能测试
1,登录
2,首页
3,我的项目
4,我的题库
5,模板广场
6,用户列表
7,聚合报告
七,BUG描述
1,我的题库导出功能
点击“导出”按钮,预期结果:成功导出了选择的题库
实际结果:点击“导出”按钮没有反应
Bug:“导出”按钮异常,导出功能失效
2,我的模板功能
点击模板搜索框输入已有模板名字(test),点击“搜模板”按钮
预期结果:搜索出并显示名为“test”的模板
实际结果:输入“test”点击“搜模板”按钮后,什么也没有搜索出来
Bug:“搜模板”按钮异常,搜模板功能失效
3,用户更新功能
编辑新建用户信息时,必选项状态未选择,点击“确定”按钮
预期结果:提示请选择状态
实际结果:成功创建了新用户1111,并且状态为激活
Bug:必选项状态未选也正常创建用户成功了
八,测试总结
1,严重问题点
登录页面的平均响应时间最高(88毫秒),这可能由于认证流程较复杂;其他页面(如首页、练习页面)的平均响应时间在42-43毫秒左右,表现一致且较低。
总体响应时间:平均值为49毫秒,中位数为44毫秒,90%百分位为84毫秒,表明大多数请求响应较快,但少数请求(如登录页面)拉高了整体平均值
2,优秀表现点
吐量:每个页面的吞吐量均在90-95请求/秒之间,总体吞吐量为519.7请求/秒,说明系统处理能力良好。
网络流量:接收和发送的数据速率也相对稳定,例如总体接收速率为233.23 KB/秒,发送速率为88.23 KB/秒。
3,总结
优化登录接口的认证逻辑或数据库查询,以降低响应时间。
当前性能可支持中等并发场景,若需更高并发可进一步扩展资源。
出现少数BUG但不影响项目的总体使用,