朋友们、伙计们,我们又见面了,本期来给大家带来关于问卷考试系统的测试报告,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!
C 语 言 专 栏:C语言:从入门到精通
数据结构专栏:数据结构
个 人 主 页 :stackY、
C + + 专 栏 :C++
Linux 专 栏 :Linux
目录
8.3 吞吐量(Transactions per Second)
8.4 响应时间(Response Times Over Time)
8.5 随时间变化的活跃线程状态(Active Threads Over Time)
1. 问卷考试系统项目
项目背景:
该项目(问卷考试系统)是一款基于Web的在线测评平台,主要可以用于:创建以及管理不同类别的问卷及考试、发布在线问卷考试和练习最后进行数据收集、分析调查和数据汇总;另外还可以管理题库和试题资源。
该系统面向教育机构、企业培训部门和市场调研机构,提供从问卷/考试创建、发布、答题到结果分析的全流程解决方案。
系统包含以下核心模块:
用户管理:注册、登录、组织机构分配给用户
项目管理:创建问卷及考试,发布并进行数据统计以及汇总
题库管理:题库的创建、导入导出,题目的创建、错题本以及笔记
练习系统:已有的题目点击练习、查看结果、查看进度
模板管理:对问卷、考试已有模板的使用以及新建模板
系统设置:角色、组织、岗位、字典各种功能的设置以及个人信息的修改和安全设置
测试环境:
- 操作系统:Windows 11 / Windows10 64位
- 浏览器: Chrome--138.0.7204.184(正式版本)(64 位)
- Edge--138.0.3351.121 (正式版本) (64 位)
- 测试工具:Pycharm、selenium、JMeter、postman
2. 测试计划
① 根据不同的场景设计对应的测试用例
② 根据测试用例执行测试
③ 编写自动化测试脚本
3. 测试工具
Pycharm、selenium、chrome-driver(本地)、Chrome、Edge、JMeter、postman
4. 设计测试用例
测试测试用例一般从下面6个方面出发:
功能测试、界面测试、性能测试、易用性测试、兼容性测试、安全测试;
接下来我根据不同的使用场景设计对应的测试用例,其中有一些测试用例可以进行复用我们直接复用;
4.1 注册页面测试用例
4.2 登录页面测试用例
4.3 问卷考试系统测试用例
对整个系统设置的测试用例更多的注重于系统的功能测试:
5. 手动测试
分别对注册页面、登录页面、整个系统进行功能测试:
5.1 注册页面
预期结果:姓名、账号、密码、确认密码、角色选择都是必填的,全部填写完成才能成功注册账号;
只输入一个或者是有一个没有输入都是会有提示的,不能注册成功;
接下来注册的账号也用于后面的测试中,另外还有一键清除、密码的显示都进行测试:
点击注册之后会跳转到登录页面,并提示“注册成功”:
当我们在注册页面时,打开大小写时,是没有提示的;
另外,在注册时可以注册登录账号为空格的用户;
5.2 登录页面
预期结果:用户名和密码都必须填写,并且得输入正确的用户名和正确的密码;
当用户名和密码填写正确时,点击登录就会进入系统并提示“登录成功”:
但是在登录这里发现当用户名为空格时没有进行特殊处理;
5.3 问卷考试系统
整个系统的核心功能有:首页、我的项目、我的练习、题库中心、模板广场、用户设置;
分别对这些核心功能进行功能测试:
5.3.1 首页
因为是新注册的账号,所以没有考试和问卷记录,那么首先就来验证创建考试和创建文件的这两个功能;
创建问卷预期结果:在点击创建问卷之后,跳转到创建问卷的页面,然后将问卷题型模板拖入,根据所需进行修改,并点击保存,在提示“成功创建”之后可以在我的问卷页面看到新创建的问卷:
问卷可以创建成功,但是问卷创建成功之后保存在了我的项目里面,在个人首页的我的问卷是没有的,另外个人主页的问卷数也是可以增加的;
创建考试预期结果:在点击创建考试之后,跳转到创建考试的页面,然后将题型模板拖入,根据所需进行修改,并点击保存,在提示“创建成功”之后可以在我的考试页面看到新创建的考试:
但是实际情况同创建问卷一样,并没有在我的考试中显示出来;
问卷记录和考试记录:当我们填写了问卷或者是进行了考试之后,都会在这两栏进行显示具体的信息:
其中,这些记录也有刷新,密度、列设置这些功能都可以使用,不同的密度展示的记录紧凑程度不同,列设置如果不勾选,则不会出现:
5.3.2 我的项目
我的项目这个页面中首先测试新建项目;
预期结果:点击“新建项目”选择要创建的项目类型,选择之后跳转到对应的创建页面,选择对应的题型模板然后进行修改,点击保存之后就可以在我的项目页面找到新创建的项目:
项目展示这里的平铺展示和列表展示;
预期结果:每个展示的方式对于其对应:
在搜索输入关键字搜索项目;
预期结果:再输入关键字之后可以搜到带关键字的所有的项目:
对于项目的删除;
预期结果:在项目的右下角的“三个小点”点击之后有删除,点击删除之后在我的项目里面移除对应的项目:
项目设置;
点击项目下面的“小齿轮”可以进入到项目的具体设置页面:
5.3.3 我的练习
由于是新注册的账号,所以没有对应的练习,所以可以先在数学题库中测试一道题;
点击数学或者语文就可以看到对应的题库:
点击开始练习之后会跳转到选择“顺序练习”、“随机练习”、“错题练习”,点击“顺序练习”之后直接跳转到了答题页面:
答题结束之后就可以在我的练习页面查看到所做过的题可以通过状态的选择进行筛选,也可以看到完成的进度,没有完成的题也可以继续答题,完成的题可以查看结果,也可以对题目进行删除:
删除练习;
预期结果:点击最右面的“删除”,提示是否删除,点击OK,即可以删除练习:
5.3.4 题库中心
题库中心有三个模块:我的题库、问题管理、我的笔记;
依次对这三个模块进行功能测试:
题库中心:
搜索功能预期结果:名称栏输入题库名称,类型选择是问卷还是考试,然后点击查询即可以找到对应的题库:
并且点击重置之后我们之前输入的查询关键字都会被清空:
新建题库预期结果:点击新建之后跳转到新增题库的页面,其中可以创建新的题库,输入好题库信息之后点击确定便可以创建好题库了:
试题管理预期结果:点击试题管理之后会跳转到试题管理的页面,我们可以通过添加试题来为我们新创建的题库增添题目,另外也可以对我们添加好的试题进行再次编辑:
删除题库预期结果:点击题库最右边的“三个点”可以弹出编辑和删除,我们点击删除之后会有一个再次确认的弹窗,点击删除之后就可以将对应的题库从中删除掉:
问题管理:
问题管理模块是对我们创建的题库中新添加的题目的管理;
我们可以对这些题目进行编辑一些一些查询:
我的笔记:
在答题的时候,题目下面有一个笔的小标志,点击一下就可以进行笔记的记录,记录完成之后就会在我的笔记页面进行展示:
笔记的删除预期结果:我们点击删除操作之后,会有提示弹窗,点击OK之后就可以删除该条笔记:
5.3.5 模板广场
模板广场添加模板功能验证;
预期结果:点击“添加模版”之后跳转至添加模板的页面,然后选择题型进行修改,点击保存时会弹出一个设置模板的页面,其中可以填写模板的名称,分类以及标签,还可以勾选“添加到公共库”,点击保存,就可以看到我们新建的模板了:
搜索模板功能验证;
预期结果:输入关键字并点击“搜模板”即可以查找到对应的模板:
在搜索模板这里是有功能bug的,不能根据输入的关键字来查找对应的模板;
模板筛选功能验证:
预期结果:通过对模板分类的选择,筛选出对应分类的模板:
私有库的验证:
在创建模板时,我们不勾选“添加到公共库”然后点击保存之后,就可以在私有库中看到我们说创建的模板了:
5.3.6 系统管理
系统管理分为以下几个模块:用户管理、角色管理、组织机构、岗位设置、字典管理、个人设置;
接下来分别对这些模块进行功能验证:
用户管理
组织机构筛选验证:
可以根据选择对应的组织机构筛选出隶属于这个组织机构的用户:
输入查询功能验证:
通过输入姓名,点击查询之后可以筛选出对应姓名的用户:
用户编辑功能以及重置密码、删除用户验证:
点击“编辑”之后可以看到用户的各种信息,可以对这些信息进行修改,另外,点击“更多”之后会出现“重置密码”和“删除用户”的选项,可以点击达到对应的效果;
新建用户功能验证:
点击“新建”之后跳转到填写用户信息的页面,填写完成之后点击“确定”就可以完成对新用户的创建:
角色管理
搜索角色功能验证:
输入对应的关键字并点击查询就可以筛选出对应的角色信息:
新建角色功能验证:
点击“新建”跳转到角色信息填写页面,填写完对应的信息之后点击“确定”就可以新建新的角色:
编辑以及分配用户功能测试:
点击“编辑”就可以跳转到对应的角色信息,可以对角色信息进行修改,并点击确定进行保存,点击“三个点”会有一个“分配用户”的选择,点击之后可以对用户进行角色的分配:
组织机构
新建组织机构功能测试:
点击“新建”之后跳转到信息填写页面,填写完成之后点击“确定”即可以创建新的机构:
删除机构功能测试:
点击“删除”会跳出弹窗提示是否删除,点击“确定”即可以删除对应的机构:
岗位设置
搜索功能验证:
输入对应的关键字,并点击“查询”可以筛选出对应的岗位:
新建岗位功能验证:
点击“新建”跳转到信息填写页面,填写完成之后点击“确定”既可以完成新建:
删除岗位功能验证:
点击“删除”之后会有二次确认,点击“确定”既可以删除对应的岗位:
字典管理
查询字典功能验证:
输入对应的关键字,并点击“查询”就可以筛选出对应的字典:
新建字典功能验证:
点击“新建”然后跳转到填写字典信息页面,填写完对应的信息之后点击“确定”可以完成对字典的新建:
删除字典功能验证:
点击“三个小点”出现的删除,点击“删除”进行二次确认即可完成删除字典:
个人设置
基本设置:
可以修改姓名、手机号、邮箱、个人简介以及更换头像:
安全设置:
修改账户密码:
6. 自动化测试用例设计
6.1 设计自动化测试代码
自动化这里我们用的到工具是Pycharm以及selenium库;
在自动化测试这里我们分文件编写脚本代码,根据页面的不同,分为注册页面、登录页面、首页、我的项目、我的练习、题库中心、模板广场、系统管理这几个页面,我们根据不同的页面来针对性的设计自动化测试代码:
代码框架:
一个分为三个模块:
- common模块是对公共方法的编写
- images模块是对屏幕截图的保存
- QES_test模块是对核心功能的自动化测试
6.2 common模块
在这个文件里面,主要实现驱动的创建、屏幕截图、清空输入框、设计单例:
其中博主用的是本地驱动,只需要将本地驱动的路径更改为自己的即可;
Utils.py:
# 本文件用于驱动的创建 # 添加等待 # 屏幕截图 # 清空输入框 # 设计单例模式 import datetime import os import sys from selenium import webdriver from selenium.webdriver import ActionChains, Keys from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service class Driver: driver = "" # 驱动对象 def __init__(self): # 本地驱动所在路径 chrome_driver_path = "E:\\Python\\chromedriver-win64\\chromedriver.exe" options = Options() options.add_argument("--remote-allow-origins=*") # 创建驱动 self.driver = webdriver.Chrome(service=Service(chrome_driver_path), options=options) # 添加隐式等待 self.driver.implicitly_wait(2) # 屏幕截图功能 # ../images/当前日期/调用函数名-当前具体日期.png def GetScreenShot(self): # 文件夹名称(以日期为划分) dirname = datetime.datetime.now().strftime("%Y-%m-%d") # 判断该文件名是否存在 # 不存在就创建 if not os.path.exists("../images/" + dirname): os.mkdir("../images/" + dirname) # 截图文件名前面跟上调用方法的名称(不同的调用方法对应的不同的截图) # 文件名 filename = 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) # 清空指定输入框的内容 def ClearInput(self, element): actions = ActionChains(self.driver) actions.click(element) # 点击元素 actions.key_down(Keys.CONTROL).send_keys("a").key_up(Keys.CONTROL) # Ctrl+A actions.send_keys(Keys.DELETE) # 删除 actions.perform() # 执行所有动作 # 创建单例 QESDriver = Driver()屏幕截图是根据调用屏幕截图的函数以及调用时间进行命名,根据日期进行分类;
6.3 QES_test模块
在该模块中对问卷考试系统的主要功能进行自动化脚本的设计,为了更加直观,将每个页面都按文件分别编写:
- 首页:HomePage.py
- 注册页面:RegistrationPage.py
- 登录页面:LoginPage.py
- 我的项目:MyProjectPage.py
- 我的练习:MyPracticePage.py
- 题库中心:QuestionBankCenterPage.py
- 模板广场:TemplateSquarePage.py
- 系统管理:SystemManagementPage.py
- 运行模块:RunTest.py
6.3.1 注册
RegistrationPage.py:
import time from selenium.webdriver.common.by import By from common.Untils import QESDriver # 注册页面 class RegPage: url = "" driver = "" def __init__(self): self.url = "http://8.155.1.153:8081/user/login" self.driver = QESDriver.driver self.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.XPATH,'//*[@id="root"]/div/div[2]/div[2]/div/form/button').click() time.sleep(0.5) QESDriver.GetScreenShot() ######################################################################################################## # 查找姓名输入框并输入 self.driver.find_element(By.XPATH, '//*[@id="name"]').send_keys("小王") # 查找登录账号输入框并输入 self.driver.find_element(By.XPATH,'//*[@id="username"]').send_keys("xiaowang") # 查找密码输入框并输入 self.driver.find_element(By.XPATH,'//*[@id="password"]').send_keys("123456") # 查找密码确认输入框并输入 self.driver.find_element(By.XPATH,'//*[@id="rePassword"]').send_keys("123456") # 点击注册 self.driver.find_element(By.XPATH,'//*[@id="root"]/div/div[2]/div[2]/div/form/button').click() time.sleep(0.5)
6.3.2 登录
验证正确密码、错误密码的登录效果;
LoginPage.py:
import time from selenium.webdriver.common.by import By from common.Untils import QESDriver # 登录页面 class LoginPage: url = "" driver = "" def __init__(self): self.url = "http://8.155.1.153:8081/user/login" self.driver = QESDriver.driver self.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(0.5) QESDriver.GetScreenShot() ################################################################################################ # 查找用户名输入栏并输入“xiaowang” self.driver.find_element(By.XPATH,'//*[@id="username"]').send_keys("xiaowang") # 查找密码输入栏并输入错误密码“654321” self.driver.find_element(By.XPATH,'//*[@id="password"]').send_keys("654321") # 使用错误密码并点击登录然后截图展示 self.driver.find_element(By.XPATH,'//*[@id="root"]/div/div[2]/div[2]/div/form/button').click() time.sleep(0.5) QESDriver.GetScreenShot() ######################################################################################################### # 使用正确密码登录并截图查看 # 先清空,再输入正确密码 QESDriver.ClearInput(self.driver.find_element(By.XPATH,'//*[@id="password"]')) 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').click() time.sleep(0.5) QESDriver.GetScreenShot()
6.3.3 首页
在首页我们对首页的元素进行查找,然后点击创建问卷或者点击创建考试并截图:
HomePage.py:
import time from selenium.webdriver.common.by import By from common.Untils import QESDriver class HomePage: url = "" driver = "" def __init__(self): self.url = "http://8.155.1.153:8081/home" # 首页对应的url self.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]/div[1]/div/span').text # 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').text assert 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(0.5) 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(0.5) QESDriver.GetScreenShot() self.driver.back()
6.3.4 我的项目
MyProjectPage.py:
import time from selenium.webdriver.common.by import By from common.Untils import QESDriver class MyProject: url = "" driver = "" def __init__(self): self.url = "http://8.155.1.153:8081/project" self.driver = QESDriver.driver self.driver.get(self.url) def GetMyProject(self): # 列展示 self.driver.find_element(


























































最低0.47元/天 解锁文章
396

被折叠的 条评论
为什么被折叠?



