卷王问卷考试系统—测试报告
目录
1 项目背景
1.1 项目介绍
1.2 测试目标
2 测试概述
2.1 测试安排
2.2 测试环境
2.2.1 硬件环境
2.2.2 软件环境
2.2.3 测试工具
3 测试分类
3.1界面测试
3.1.1 测试目的
3.1.2 测试内容
3.1.3 界面测试结果分析
3.2功能测试
3.2.1 功能测试用例图
3.2.2 功能测试
3.2.3 功能测试结果分析
3.3自动化测试
3.3.1 自动化测试覆盖范围
3.3.2 自动化代码示例
项目结构
commom.py
registerTest.py
loginTest.py
homeTest.py
myprojectTest.py
mypracticeTest.py
qbcenterTest.py
mouldplazaTest.py
systemmangeTest.py
3.3.3 自动化测试结果分析
3.4 性能测试
3.4.1 性能测试覆盖范围
3.4.2 性能测试展示
登录测试
4 测试分析与总结
4.1 风险遗留
4.2 测试分析
4.3 测试总结
1 项目背景
1.1 项目介绍
卷王问卷考试系统是一个管理、收集问卷和考试的系统,用户可以自定义问卷和考卷,发布出去之后可以收集用户所填写的信息。该系统的内容丰富,自定义化程度高,旨在为用户提供便捷的问卷创建,发布,数据 收集以及考试组织功能。
测试网址:问卷考试系统
1.2 测试目标
本次测试针对此问卷考试系统进行核心功能的测试,包括:
- 用户的登陆与注册
- “我的项目”模块
- “我的练习”模块
- “题库中心”模块
- “模板广场”模块
- “系统管理”模块
2 测试概述
2.1 测试安排
模块 | 子模块 | 测试人员 | 测试工时 | 测试结果 |
登录和注册 | 登录和注册功能 | 本人 | 0.5d | 测试完成 |
“我的项目” | 创建、编辑、查看和搜索项目 | 本人 | 0.5d | 测试完成 |
“我的练习” | 列表页面的查看、搜索和题库的练习、查看 | 本人 | 1d | 测试完成 |
“题库中心” | “我的题库”、“问题管理”、“我的笔记” | 本人 | 1d | 测试完成 |
“模板广场” | 模板的下载、应用、删除和搜索 | 本人 | 1d | 测试完成 |
“系统管理” | 个人设置 | 本人 | 0.5d | 测试完成 |
2.2 测试环境
2.2.1 硬件环境
- 电脑名称:Dell G15 5515
- CPU:AMD Ryzen 5 5600H
- 显卡:NVIDIA GeForce RTX 3050
- 内存:16GB
- 硬盘:1024GB
2.2.2 软件环境
- 操作系统:windows 10 x64
- 浏览器:Edge 139.0.3405.102
2.2.3 测试工具
- JMeter
- Postman
- Selenium
3 测试分类
3.1界面测试
3.1.1 测试目的
验证界面内容显示的完整性、一致性、准确性、友好性。验证整个界面布局和排版是否合理,不同板块字体的设计,图片的展示是否符合需求,无效的状态是否设计合理,界面的布局和色调是否正常。
3.1.2 测试内容
- 登录界面
测试点 | 操作步骤 | 预期结果 | 实际结果 | 结论 |
标题显示 | 查看页面标题 | 显示“问卷调查”系统 | 显示“问卷调查”系统 | 通过 |
用户名输入框 | 检查输入框样式以及是否能输入 | 输入框样式清晰,可输入数值 | 输入框样式清晰,可输入数值 | 通过 |
密码输入框 | 检查输入框样式以及是否能输入 | 输入框样式清晰,可输入数值 | 输入框样式清晰,可输入数值 | 通过 |
"显示密码"按钮 | 检查按钮是否显示或隐藏密码 | 点击后显示密码、再次点击后隐藏密码 | 点击后显示密码、再次点击后隐藏密码 | 通过 |
"注册账户"链接 | 检查链接样式以及是否能跳转 | 蓝色文字链接“注册账户”,点击后可跳转至注册界面 | 蓝色文字链接“注册账户”,点击后可跳转至注册界面 | 通过 |
“登录”按钮 | 检查按钮样式以及能否登录 | 蓝色按钮白字按钮“登录”,点击后可跳转至首页界面 | 蓝色按钮白字按钮“登录”,点击后可跳转至首页界面 | 通过 |
中英文转换按钮 | 检查页面右上方中英文转换按钮 | 点击后可进行中英文切换 | 点击后可进行中英文切换 | 通过 |
- 注册界面
测试点 | 操作步骤 | 预期结果 | 实际结果 | 结论 |
标题显示 | 查看页面标题 | 显示“问卷调查”系统 | 显示“问卷调查”系统 | 通过 |
用户名、密码和确认密码输入框 | 检查输入框样式以及是否能输入 | 输入框样式清晰,可输入数值 | 输入框样式清晰,可输入数值 | 通过 |
“显示密码”按钮 | 检查按钮是否显示或隐藏密码 | 击后显示密码、再次点击后隐藏密码 | 击后显示密码、再次点击后隐藏密码 | 通过 |
“返回登录”链接 | 检查链接样式以及是否能跳转 | 蓝色文字链接“返回登录”,点击后可跳转至登录界面 | 蓝色文字链接“返回登录”,点击后可跳转至登录界面 | 通过 |
“注册账户”按钮 | 检查按钮样式以及能否登录 | 蓝色按钮白字按钮“登录”,点击后可跳转至登录界面 | 蓝色按钮白字按钮“登录”,点击后可跳转至登录界面 | 通过 |
中英文转换按钮 | 检查页面右上方中英文转换按钮 | 点击后可进行中英文切换 | 点击后可进行中英文切换 | 通过 |
- 首页
测试点 | 操作步骤 | 预期结果 | 实际结果 | 结论 |
系统标题 | 查看页面标题 | 显示“问卷调查”系统 | 显示“问卷调查”系统 | 通过 |
左侧导航栏 | 检查导航栏菜单项(首页、我的项目、我的练习、题库中心、模板广场、系统管理 ) | 菜单项名称正确、样式统一,可点击展开 / 收起 | 菜单项名称正确、样式统一,可点击展开 / 收起 | 通过 |
上方路径栏 | 查看页面上方路径(首页 / 首页 ) | 显示当前位置路径,清晰指引层级 | 显示 “首页 / 首页”,层级清晰 | 通过 |
欢迎信息 | 看欢迎语(晚上好,Admin,祝你开心每一天!) | 文字显示正确、排版合理 | 文字显示正确、排版合理 | 通过 |
数据展示栏 | 检查“我的考试”、“我的问卷”、“问卷记录”和“考试记录”的完整性 | 创建的问卷、试卷信息显示在该界面 | 创建的问卷、试卷信息显示在该界面 | 通过 |
数据统计区 | 检查 “问卷数” “考试数” 展示 | 数据显示清晰,数字准确 | 数据显示清晰,数字准确 | 通过 |
右侧便捷操作 | 检查 “创建问卷”“创建考试” 按钮 | 按钮样式统一、文字清晰,可点击 | 按钮样式统一、文字清晰,可点击 | 通过 |
右上角综合控制键 | 检查“官方文档”、“设置”按钮是否可用 | 按钮可点击,排版合理 | 按钮可点击,排版合理 | 通过 |
- 我的项目
测试点 | 操作步骤 | 预期结果 | 实际结果 | 结论 |
上方路径栏 | 查看页面上方标题 | 显示 “我的项目”,与左侧导航栏选中项匹配 | 显示 “我的项目”,匹配一致 | 通过 |
左侧导航栏 | 检查 “我的项目” 选中状态及其他菜单项 | “我的项目” 高亮显示,其他菜单项(首页、我的练习等)样式正常 | “我的项目” 高亮,其他菜单项正常 | 通过 |
搜索功能 | 检查搜索框及搜索按钮 | 搜索框有 “搜索项目名称” 占位符,按钮可点击 | 搜索框占位符正常,按钮可点击 | 通过 |
项目卡片 | 检查卡片展示内容(名称、类型、状态、数据量 ) | 卡片显示项目名称、类型(问卷 / 考试)、状态(收集中 / 未发布等)、数据量,样式统一 | 卡片内容显示完整、样式统一 | 通过 |
项目操作按钮 | 检查卡片下方操作按钮(编辑、数据查看等图标 ) | 按钮图标清晰、可点击,功能标识明确 | 按钮清晰、可点击 | 通过 |
“新建” 按钮 | 检查页面右上角 “新建” 按钮 | 蓝色按钮,显示 “+ 新建”,可点击 | 按钮样式正常、可点击 | 通过 |
- 我的练习
测试点 | 操作步骤 | 预期结果 | 实际结果 | 结论 |
上方路径栏 | 查看页面上方标题 | 显示 “我的练习”,与左侧导航栏选中项匹配 | 显示 “我的练习”,匹配一致 | 通过 |
左侧导航栏 | 检查 “我的练习” 选中状态及其他菜单项 | “我的练习” 高亮显示,其他菜单项(首页、我的练习等)样式正常 | “我的练习“ 高亮,其他菜单项正常 | 通过 |
筛选组件 | 检查状态下拉框、“重置”“查询” 按钮 | 下拉框显示 “请选择”,按钮可点击、样式清晰 | 组件显示及交互正常 | 通过 |
练习列表 | 验证表头与数据展示 | 表头(练习名称、进度等 )完整,练习数据(如 “人口属性” )显示清晰 | 列表数据展示正常 | 通过 |
操作按钮 | 检查 “查看结果”“二维码”“删除” 按钮 | 按钮图标清晰、可点击,功能标识明确 | 按钮图标清晰、可点击,功能标识明确 | 通过 |
- 题库中心
测试点 | 操作步骤 | 预期结果 | 实际结果 | 结论 |
页面路径 | 检查 “首页 / 题库中心 / 我的题库” 路径 | 路径清晰展示层级,与左侧导航匹配 | 路径正常显示,匹配 “我的题库” 选中状态 | 通过 |
左侧导航栏 | 验证 “题库中心” 展开及 “我的题库” 选中 | 题库中心” 展开显示子菜单(我的题库、问题管理等 ),“我的题库” 高亮 | 导航展开与选中状态正确 | 通过 |
筛选组件 | 检查名称输入框、类型下拉框、“重置”“查询” 按钮 | 输入框有 “请输入” 占位,下拉框显示 “请选择”,按钮可点击 | 组件显示及交互正常 | 通过 |
题库列表 | 验证表头与数据展示 | 表头(名称、类型、共享题库等 )完整,题库数据(如类型 “问卷”、题目数量 )显示清晰 | 表头中“名称、类型”两项显示不完整 | 不通过 |
操作按钮 | 检查 “新建”“导出”“文本导入”“试题管理” 按钮 | 按钮样式统一、可点击,功能标识明确 | 按钮交互正常 | 通过 |
- 模板广场
测试点 | 操作步骤 | 预期结果 | 实际结果 | 结论 |
上方状态栏 | 检查 “首页 / 模板广场 | 显示”模板广场“,与左侧导航匹配 | 显示 “模板广场”,匹配一致 | 通过 |
左侧导航栏 | 检查 “模板广场” 选中状态及其他菜单项 | “模板广场” 高亮显示,其他菜单项(首页、我的练习等)样式正常 | 导航展开与选中状态正确 | 通过 |
”模板“搜索框 | 检查搜索框的样式以及可用性 | 搜索框可输入内容,并且对当前内容进行搜索 | 组件显示及交互正常 | 通过 |
模板展示列表 | 验证列表的可用性 | 可以通过列表进行模板筛选 | 组件显示及交互正常 | 通过 |
模板组件 | 验证模板是否能下载、删除、浏览和应用 | 组件显示及交互正常 | 组件显示及交互正常 | 通过 |
”添加模板“按钮 | 验证按钮的外观、可用性 | 按钮外观符合主题、可点击 | 按钮外观符合主题、可点击 | 通过 |
- 系统管理
测试点 | 操作步骤 | 预期结果 | 实际结果 | 结论 |
左侧导航栏 | 验证 “系统管理” 展开及 “个人设置” 选中 | 系统设置” 展开显示子菜单,“系统管理” 高亮 | 导航展开与选中状态正确 | 通过 |
”个人设置“页面 | 验证”个人设置“页面上的显示和交互 | 页面设计合理,界面可交互 | 页页面设计合理,界面可交互 | 通过 |
“用户管理”页面 | 验证”用户管理“页面上的显示和交互 | 页面设计合理,界面可交互 | 页面设计合理,界面可交互 | 通过 |
3.1.3 界面测试结果分析
- 测试用例:70例
- 发现bug:1个;1个次要bug
- bug详情:
- 题库中心(次要):题库列表中排版不规范导致信息显示不全
- 测试通过率:98.85%
3.2功能测试
3.2.1 功能测试用例图
3.2.2 功能测试
因该系统的功能较多,所以只选取部分有效功能和bug进行展示
- 登录界面
输入正确的用户名和密码时 ,成功登录
只输入其中一项或者都不输入时,登录失败
输入正确的一项和错误的一项时,登录失败
sql注入攻击,失败
- 注册界面
输入正确的信息,注册成功
输入已经注册过的账户,注册失败
输入长度为24的用户名和密码,注册成功
密码与确认密码不同时,注册失败
部分注册信息不填写时,注册失败
密码数少于6位时,注册失败
- 首页
可通过路径栏快速回到首页
可通过便捷栏快速创建问卷和试卷
bug(一般):创建好的试卷和问卷无法显示在列表中
右上角的操作按钮可用,并且排版合理
bug(一般):并不能为用户进行答疑解惑
风格设置栏可用且布局合理
- 我的题库
可以通过上方路径栏回到首页
可以对问卷进行创建和修改
可通过二维码或地址进行问卷的填写
bug(一般):填写问卷中无法选定位置信息
问卷填写一半退出时会保存进度,方便下一次继续填写
用户填写后可进行数据分析与展示
可对每个项目进行更改操作
“新建项目”按钮可用
搜索栏可用
- 我的练习
选择栏可正常选择并筛选出正确的列表
“继续答题”、“查看结果”、“二维码”和删除功能均能正常使用
题目搜索功能能正常使用并且搜索正确
练习功能能正常使用
- 题库中心
搜索框和选择框能正常使用
列表上的功能均能正常使用
“新建题库”按钮能进行题库的创建
bug(一般):“导出”按钮失效,无法导出题库
- 模板广场
“添加模板”按钮可用,点击后会进行创建
bug(一般):无法搜索模板
分类功能正常并且能对模板进行筛选
模板可进行删除、下载、浏览和应用
- 系统管理
能对账户进行基本的设置功能
bug(次要):重置密码时新密码可以和旧密码相同
bug(一般):修改密码时密码可以小于6位数
3.2.3 功能测试结果分析
- 测试用例:80例
- 发现bug:7个;6个一般bug、1个次要bug
- bug详情:
- 首页(一般):展示出错,数据展示栏中无法显示试卷和问卷的信息
- 官方文档(一般):功能不全,在输入框中输入用户疑问时并不能为其解答
- 我的项目(一般):填写问卷中无法选定位置信息
- 题库中心(一般):在“我的题库”页面中无法导出题库
- 模板广场(一般):搜索栏无法搜索模板
- 系统管理(一般):在重置密码时可以设置少于6位数的密码
- 系统管理(次要):在重置密码时新密码可以和旧密码相同
- 测试通过率:91.25%
3.3自动化测试
3.3.1 自动化测试覆盖范围
- 注册界面:正确的注册、错误的注册、“返回账户”按钮
- 登录界面:正确的登录、错误的登录、“注册账户”按钮
- 首页:便捷操作、列表切换、“设置”按钮、“官方文档”按钮
- 我的项目:新建项目、搜索项目、项目卡片
- 我的练习:分类查询、练习列表的各项操作
- 题库中心-我的模板:题库列表的各项操作、查询、新建题库
- 模板广场:新建模板、模板的分类搜索
- 系统管理-个人设置:更改密码、更改个人信息
3.3.2 自动化代码示例
项目结构
commom.py
公共类,用来存放驱动,管理截图
import datetime
import os.path
import sys
import timefrom selenium import webdriver
from selenium.webdriver import ActionChains, Keys
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManagerclass Driver:driver=""def __init__(self):chrome_driver_path = "D:/chromedriver-win64/chromedriver.exe"options = webdriver.ChromeOptions()self.driver = webdriver.Chrome(service=Service(chrome_driver_path),options=options)# 添加隐式等待:因为隐式等待的作用域在driver的整个生命周期self.driver.implicitly_wait(3)def getScreenShot(self):# 创建屏幕截图# 图片文件名称:年-月-日-时分秒.png# 根据每天的日期进行分类,当天运行的自动化图片文件放到当天的文件夹下# 图片路径:../images/日期/图片名称.pngdirname = datetime.datetime.now().strftime("%Y-%m-%d")# 判断dirname文件夹是否已经存在,若不存在则创建文件夹# ../images/日期if not os.path.exists("../images/"+dirname):os.mkdir("../images/"+dirname)# 图片名称:方法名-日期-时分秒.pngfilename = sys._getframe().f_back.f_code.co_name+"-"+datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S")+".png"self.driver.save_screenshot("../images/"+dirname+"/"+filename)# 由于项目外层不是一个单纯的input标签,而是组件封装之后的,所以不能使用selenium中的clear()# 清空指定输入框的内容def clear(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() # 执行所有动作autoTest=Driver()
registerTest.py
注册测试
import time
from selenium.webdriver.common.by import By
from common.common import autoTestclass registerTest:url=""driver=""def __init__(self):self.url=url="http://8.155.1.153:8081/user/register"self.driver=autoTest.driverself.driver.get(self.url)#注册成功测试用例def registerSuccess(self):#清空注册栏autoTest.clear(self.driver.find_element(By.CSS_SELECTOR, "#name"))autoTest.clear(self.driver.find_element(By.CSS_SELECTOR, "#username"))autoTest.clear(self.driver.find_element(By.CSS_SELECTOR, "#password"))autoTest.clear(self.driver.find_element(By.CSS_SELECTOR, "#rePassword"))#输入正确的账户和密码self.driver.find_element(By.CSS_SELECTOR,"#name").send_keys("jacklove")self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("jacklove")self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("jacklove")self.driver.find_element(By.CSS_SELECTOR,"#rePassword").send_keys("jacklove")self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button").click()time.sleep(1)# 如果能跳转到登录页面,说明注册成功,否则注册失败self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button > span")# 添加屏幕截图autoTest.getScreenShot()#################################################################################################################注册失败测试用例def registerFail(self):# 测试1:所有信息都不填写autoTest.clear(self.driver.find_element(By.CSS_SELECTOR, "#name"))autoTest.clear(self.driver.find_element(By.CSS_SELECTOR, "#username"))autoTest.clear(self.driver.find_element(By.CSS_SELECTOR, "#password"))autoTest.clear(self.driver.find_element(By.CSS_SELECTOR, "#rePassword"))self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("")self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("")self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("")self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button").click()time.sleep(1)autoTest.getScreenShot()#测试2:只填写部分信息autoTest.clear(self.driver.find_element(By.CSS_SELECTOR, "#name"))autoTest.clear(self.driver.find_element(By.CSS_SELECTOR, "#username"))autoTest.clear(self.driver.find_element(By.CSS_SELECTOR, "#password"))autoTest.clear(self.driver.find_element(By.CSS_SELECTOR, "#rePassword"))self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("jacklove7")self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("")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").click()time.sleep(1)autoTest.getScreenShot()#测试3:填写已经注册过的用户autoTest.clear(self.driver.find_element(By.CSS_SELECTOR, "#username"))autoTest.clear(self.driver.find_element(By.CSS_SELECTOR, "#password"))autoTest.clear(self.driver.find_element(By.CSS_SELECTOR, "#rePassword"))self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("zhangsan")self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangsan")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").click()time.sleep(1)autoTest.getScreenShot()#测试4:注册时密码和确认密码不一致autoTest.clear(self.driver.find_element(By.CSS_SELECTOR, "#username"))autoTest.clear(self.driver.find_element(By.CSS_SELECTOR, "#password"))autoTest.clear(self.driver.find_element(By.CSS_SELECTOR, "#rePassword"))self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("zhangsan")self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangsan")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("654321")self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button").click()time.sleep(1)autoTest.getScreenShot()#测试5:注册密码少于6位数autoTest.clear(self.driver.find_element(By.CSS_SELECTOR, "#username"))autoTest.clear(self.driver.find_element(By.CSS_SELECTOR, "#password"))autoTest.clear(self.driver.find_element(By.CSS_SELECTOR, "#rePassword"))self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("jacklove7")self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("jacklove")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123")self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("123")self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button").click()time.sleep(1)autoTest.getScreenShot()# register=registerTest()
# register.registerSuccess()
# register.registerFail()# autoTest.driver.quit()
loginTest.py
登录测试
import time
from selenium.webdriver.common.by import By
from common.common import autoTest#测试问卷考试系统登录页面
class loginTest:driver=""url=""def __init__(self):self.url="http://8.155.1.153:8081/user/login"self.driver=autoTest.driverself.driver.get(self.url)#登录成功测试用例def loginSuccess(self):#清空输入框autoTest.clear(self.driver.find_element(By.CSS_SELECTOR,"#username"))#清空密码框autoTest.clear(self.driver.find_element(By.CSS_SELECTOR,"#password"))#输入账户和密码,点击登录self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("zhangsan")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").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]")#添加屏幕截图autoTest.getScreenShot()############################################################################################################登录失败测试用例def loginFail(self):#测试1:输入错误的用户名和密码autoTest.clear(self.driver.find_element(By.CSS_SELECTOR, "#username"))autoTest.clear(self.driver.find_element(By.CSS_SELECTOR, "#password"))self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("jkl")self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("jkl")self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button").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}")# 添加屏幕截图autoTest.getScreenShot()assert actual == "错误的用户名和密码"#测试2:输入正确的用户名和错误的密码autoTest.clear(self.driver.find_element(By.CSS_SELECTOR, "#username"))autoTest.clear(self.driver.find_element(By.CSS_SELECTOR, "#password"))self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangsan")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("jkl")self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button").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}")# 添加屏幕截图autoTest.getScreenShot()#测试3:不输入用户名和密码autoTest.clear(self.driver.find_element(By.CSS_SELECTOR, "#username"))autoTest.clear(self.driver.find_element(By.CSS_SELECTOR, "#password"))self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("")self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button").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}")# 添加屏幕截图autoTest.getScreenShot()#测试4:只输入用户名不输入密码autoTest.clear(self.driver.find_element(By.CSS_SELECTOR, "#username"))autoTest.clear(self.driver.find_element(By.CSS_SELECTOR, "#password"))self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangsan")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("")self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button").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}")# 添加屏幕截图autoTest.getScreenShot()# login=loginTest()
# login.loginSuccess()
# login.loginFail()# autoTest.driver.quit()
homeTest.py
首页测试
import time
from selenium.webdriver.common.by import By
from webdriver_manager.core import driver
from common.common import autoTestclass homeTest:url=""driver=""def __init__(self):#需要先登录才能进主页面self.url="http://8.155.1.153:8081/user/login"self.driver=autoTest.driverself.driver.get(self.url)self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangsan")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").click()# 测试1:验证便捷操作中的”创建问卷“和”创建考试“是否可用def convenientOperation(self):# 先进入”创建问卷“并截图,退出后在进入”创建考试“并截图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)").click()time.sleep(3)autoTest.getScreenShot()self.driver.back()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)").click()time.sleep(3)autoTest.getScreenShot()#测试2:验证首页上的按钮是否可用def btn_is_available(self):#点击”问卷记录“并截图 采用模糊匹配self.driver.find_element(By.CSS_SELECTOR, 'div[id*="tab-surveyHistory"].ant-tabs-tab-btn') .click()time.sleep(1)autoTest.getScreenShot()#测试3:能否进入”官方文档“def officalDocument(self):self.driver.find_element(By.CSS_SELECTOR,"#sk-layout > div > div > section > div.ant-pro-layout-container > header.ant-layout-header.ant-pro-layout-header.ant-pro-layout-header-fixed-header.ant-pro-layout-header-mix.ant-pro-layout-header-header > div > div.ant-pro-global-header-right-content > div > div > div > div:nth-child(1) > span > svg").click()time.sleep(7)#因为是一个新窗口,所以要判断窗口curHandle=self.driver.current_window_handleallHandles=self.driver.window_handlesfor handle in allHandles:if handle != curHandle:self.driver.switch_to.window(handle)autoTest.getScreenShot()#测试4:点击“设置”按钮并退出登录def setting(self):#先点击设置按钮self.driver.find_element(By.CSS_SELECTOR,"#sk-layout > div > div > section > div.ant-pro-layout-container > header.ant-layout-header.ant-pro-layout-header.ant-pro-layout-header-fixed-header.ant-pro-layout-header-mix.ant-pro-layout-header-header > div > div.ant-pro-global-header-right-content > div > div > div > div:nth-child(2) > span > svg").click()time.sleep(1)#再点击“退出登录”按钮,采用模糊匹配self.driver.find_element(By.XPATH, "//span[contains(@class, 'ant-dropdown-menu-title-content') and contains(text(), '退出登录')]").click()time.sleep(1)autoTest.getScreenShot()# home=homeTest()
# home.convenientOperation()
# home.btn_is_available()
# home.officalDocument()
# home.setting()# autoTest.driver.quit()
myprojectTest.py
我的项目测试
import time
from selenium.webdriver.common.by import By
from common.common import autoTestclass myprojectTest:url=""driver=""def __init__(self):self.url="http://8.155.1.153:8081/user/login"self.driver=autoTest.driverself.driver.get(self.url)#需要先从登录界面登录self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangsan")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").click()#测试1:是否能进入“我的项目”页面def in_myproject(self):time.sleep(1)self.driver.find_element(By.XPATH, '//li[contains(@title, "项目")]').click()#测试2:搜索框测试def search(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-content > div > div > div > div > div > div > div > span > span > input").send_keys("测试1")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").click()time.sleep(1)autoTest.getScreenShot()#测试3:点击项目卡片def item_clicked(self):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:nth-child(1) > div > div > div > div").click()time.sleep(2)autoTest.getScreenShot()#测试4:“新建问卷”按钮def new_add(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()time.sleep(2)autoTest.getScreenShot()# myproject=myprojectTest()# myproject.in_myproject()
# myproject.search()
# myproject.item_clicked()
# myproject.new_add()# autoTest.driver.quit()
mypracticeTest.py
我的练习测试
import time
from selenium.webdriver.common.by import By
from common.common import autoTestclass mypracticeTest:url=""driver=""def __init__(self):self.url = "http://8.155.1.153:8081/user/login"self.driver = autoTest.driverself.driver.get(self.url)# 需要先从登录界面登录self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangsan")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").click()#切换到“我的练习”页面self.driver.find_element(By.XPATH, '//li[contains(@title, "练习")]').click()#测试1:"继续答题"按钮测试def continueCheck(self):self.driver.find_element( By.XPATH,"//div[contains(@class, 'ant-space-item')]//a[contains(text(), '继续答题')]").click()time.sleep(3)autoTest.getScreenShot()#测试2:“二维码”按钮测试def codeCheck(self):self.driver.find_element(By.XPATH,"//div[contains(@class, 'ant-space-item')]//a[contains(text(), '二维码')]").click()time.sleep(2)autoTest.getScreenShot()#测试3:“设置”按钮测试def setCheck(self):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.ant-pro-table > 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 > div > div:nth-child(3)").click()time.sleep(2)autoTest.getScreenShot()# mypractice=mypracticeTest()
# mypractice.continueCheck()
# mypractice.codeCheck()
# mypractice.setCheck()
#
# autoTest.driver.quit()
qbcenterTest.py
题库中心测试
import time
from selenium.webdriver.common.by import By
from common.common import autoTestclass qbcenterTest:url=""driver=""def __init__(self):self.url = "http://8.155.1.153:8081/user/login"self.driver = autoTest.driverself.driver.get(self.url)# 需要先从登录界面登录self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangsan")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").click()time.sleep(2)self.driver.get("http://8.155.1.153:8081/repo/index")#测试1:是否能进入“我的题库”def myqb(self):time.sleep(2)self.driver.get("http://8.155.1.153:8081/repo/index")time.sleep(1)autoTest.getScreenShot()#测试2:验证名称搜索是否可用def name_search(self):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)autoTest.getScreenShot()#测试3:”新建“按钮测试def new_add(self):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()time.sleep(1)autoTest.getScreenShot()#测试4:”文本导入“、”模板导入“和”试题管理“测试def operation(self):#"文本导入"测试self.driver.find_element(By.XPATH,"//div[contains(@class, 'ant-space-item')]//a[contains(text(), '文本导入')]").click()time.sleep(3)autoTest.getScreenShot()self.driver.get("http://8.155.1.153:8081/repo/index")# "模板导入"测试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(5) > td:nth-child(9) > div > div:nth-child(2)").click()time.sleep(3)autoTest.getScreenShot()self.driver.get("http://8.155.1.153:8081/repo/index")# "试题管理"测试self.driver.find_element(By.XPATH,"//div[contains(@class, 'ant-space-item')]//a[contains(text(), '试题管理')]").click()time.sleep(3)autoTest.getScreenShot()# qbcenter=qbcenterTest()
# qbcenter.myqb()
# qbcenter.name_search()
# qbcenter.new_add()
# qbcenter.operation()
#
# autoTest.driver.quit()
mouldplazaTest.py
模板广场测试
import time
from selenium.webdriver.common.by import By
from common.common import autoTestclass mouldplazaTest:url=""driver = ""def __init__(self):self.url = "http://8.155.1.153:8081/user/login"self.driver = autoTest.driverself.driver.get(self.url)# 需要先从登录界面登录self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangsan")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").click()#进入模板广场界面time.sleep(1)self.driver.get("http://8.155.1.153:8081/template")#测试1:"添加模板"按钮测试def add_mould(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(2)autoTest.getScreenShot()#内容测试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)autoTest.getScreenShot()# 输入新增模板名称self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("测试")autoTest.getScreenShot()# 分类输入二号self.driver.find_element(By.CSS_SELECTOR, "#category").send_keys("二号")autoTest.getScreenShot()# 选择添加到公有库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()autoTest.getScreenShot()# 点击保存按钮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)autoTest.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.ant-btn-dangerous").click()time.sleep(1)autoTest.getScreenShot()#测试2:分类筛选def classifed(self):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.content___1TohL > div > div > div > div > div > div > span.ant-tag.ant-tag-checkable.ant-tag-checkable-checked").click()time.sleep(1)autoTest.getScreenShot()# mouldplaza=mouldplazaTest()
# mouldplaza.add_mould()
# mouldplaza.classifed()# autoTest.driver.quit()
systemmangeTest.py
系统管理测试
import time
from selenium.webdriver.common.by import By
from common.common import autoTestclass systemManageTest:url=""driver=""def __init__(self):self.url = "http://8.155.1.153:8081/user/login"self.driver = autoTest.driverself.driver.get(self.url)# 需要先从登录界面登录self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangsan")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").click()# 进入个人设置页面time.sleep(1)self.driver.get("http://8.155.1.153:8081/system/setting")#测试1:基本设置def basicSetting(self):self.driver.find_element(By.CSS_SELECTOR,"#name").send_keys("宇智波佐助")self.driver.find_element(By.CSS_SELECTOR,"#phone").send_keys("12312312312")self.driver.find_element(By.CSS_SELECTOR,"#email").send_keys("1111111111@qq.com")self.driver.find_element(By.CSS_SELECTOR,"#profile").send_keys("更改测试简介")time.sleep(1)autoTest.getScreenShot()#点击提交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").clear()autoTest.getScreenShot()#测试2:安全设置,设置正确的密码def secureSeeting(self):self.driver.find_element(By.CSS_SELECTOR,"#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.leftMenu___179-W > ul > li:nth-child(2) > span").click()time.sleep(1)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.ant-list.ant-list-split > div > div > ul > li > ul > li > a").click()time.sleep(2)self.driver.find_element(By.CSS_SELECTOR,"#oldPassword").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("654321")self.driver.find_element(By.CSS_SELECTOR,"#confirmPassword").send_keys("654321")time.sleep(1)autoTest.getScreenShot()# systemManageTest=systemManageTest()
# systemManageTest.basicSetting()
# systemManageTest.secureSeeting()
#
# autoTest.driver.quit()
3.3.3 自动化测试结果分析
- 测试用例:30
- 测试通过率:100%
3.4 性能测试
3.4.1 性能测试覆盖范围
- 登录测试
3.4.2 性能测试展示
登录测试
使用jmeter和postman对登录接口进行性能测试
聚合报告:
通过聚合报告显示:接口的异常率为0%,响应时间较为稳定
梯度测压线程组:使用梯度压测线程组进行测试,该图表示每 30 秒新增 100个线程,且这 100个线程会在 5 秒内逐步启动,实现负载逐步增加.
响应时间监听器:横坐标通常代表运行时间,而纵坐标则代表响应时间(单位是毫秒)。测试人员可以根据图形中的趋势线来判断响应时间的稳定性以及是否存在大的波动。如果响应时间在某个时间点突然增加,这可能意味着系统在该时间点遇到了性能问题。
TPS监听器:是一个用于分析系统吞吐量的重要工具。TPS,即每秒事务数,表示一个客户机向服务器发送请求后服务器做出反应的过程。这个指标反映了系统在同一时间内处理业务的最大能力。TPS值越高,说明系统的处理能力越强。
4 测试分析与总结
4.1 风险遗留
因为测试时间紧张,优先保证系统主功能,性能测试只涉及到登录测试,可能会出现其他方面的性能问题
4.2 测试分析
- 界面测试:界面排版合理,便于用户查看和使用
- 功能测试:主要功能能正常运行,存在少数功能无法使用的情况,可在后续更新中进行补充和添加缺失的功能
- 自动化测试:自动化测试通过,没有错误率
- 性能测试:由于只测试了登录接口的性能测试,无法保证性能测试的准确性
4.3 测试总结
该系统可正常上线,上线后需要及时更新缺少的功能