石家庄网站建设seo优化营销,wordpress自定义目录,wordpress微商城主题,网上免费发布信息一、项目背景
1. 本项目是一个在线刷题系统#xff0c;灵感来源于力扣和牛客等刷题平台#xff0c;旨在锻炼自己的代码能力和剖析系统整体结构与各模块之间关系的能力。系统支持用户注册与登录#xff0c;查看题目列表与题目详情#xff0c;在线提交代码并提供反馈。 2. 该…一、项目背景
1. 本项目是一个在线刷题系统灵感来源于力扣和牛客等刷题平台旨在锻炼自己的代码能力和剖析系统整体结构与各模块之间关系的能力。系统支持用户注册与登录查看题目列表与题目详情在线提交代码并提供反馈。 2. 该系统采用前后端分离的方法来实现同时使用了数据库来存储相关的数据如题目数据以及用户的相关信息。整个服务将被部署到 Linux 云服务器上。前端主要由六个页面构成首页、注册页面、登录页面、题目列表页、题目详情页以及未完成模块的告知页面以上就模拟实现了一个简单的在线刷题系统。 3. 该系统没有实现诸如竞赛、论坛这些功能只提供了最基础的刷题以及判题服务并且登录用户也无法自定义自己的头像。 二、项目功能
1. 注册功能用户通过表单提交要注册的用户名以及密码后端会构建 SQL 语句在 MySQL 中进行数据插入操作根据语句执行的成功与否来判断用户要注册的用户名是否存在冲突。注册成功后会有弹窗提示用户点击后将跳转到登录页面方便用户进行登录。注册失败则会弹窗提示用户名已经被使用。 2. 登录功能用户通过表单提交要登录的用户名以及密码后端会构建 SQL 语句在 MySQL 中进行数据查询操作首先判断有没有对应的用户信息然后将用户提交的密码进行哈希并与MySQL 中存储的密码哈希值进行比对如果相同则登录成功成功登录后同样会有弹窗提示用户点击后会跳转到首页。登录失败则会弹窗提升用户名或密码错误。在登录状态下用户访问的每个页面都会发生变化右上角不再显示注册于登录按钮取而代之的是用户头像以及注销按钮。 3. 题目列表用户可以在题目列表页面查看当前系统提供的所有题目每道题目都有它的标号、标题以及难度用户可以点击具体的一道题目然后会跳转到这道题目的详情页。 4. 题目详情该页面会显示题目的具体描述、要求、示例、提示信息以及代码编辑框用户可以在该页面进行代码的编写编写完毕后可以点击右下角的提交代码按钮就会将代码提交给后端服务器进行编译并运行并将结果在下方的输出框中显示。 三、项目测试
一功能测试 1. 首先通过 Xmind 软件来编写功能测试用例 2. 打开浏览器在网址栏中输入在线刷题服务的 url手动进行上述测试。 1正常登录。 2异常登录。 3正常注册。 4异常注册。 5正常注销。 6查看题目列表页并测试点击具体题目后能否跳转到题目详情。 7不编写代码直接提交。 8编写语法错误代码并提交。 9编写语法正确但解题错误的代码提交。 10编写语法正确解题也正确的代码提交。 二自动化测试 1. 编写自动化测试用例。 2. 使用 Python 编写自动化测试脚本。 1通用模块的编写
import datetime
import os.path
import sysfrom selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.wait import WebDriverWait
from webdriver_manager.chrome import ChromeDriverManagerclass Driver:driver def __init__(self):options webdriver.ChromeOptions()self.driver webdriver.Chrome(serviceService(ChromeDriverManager().install()), optionsoptions)def screenShot(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(%H%M%S) .pngself.driver.save_screenshot(../images/ dirName / filename)ojDriver Driver()
wait WebDriverWait(ojDriver.driver, 2)
因为所有页面的测试都需要用到 driver 对象因此先提前创建好让所有测试模块共用同一个 driver 对象。 并且有时候需要屏幕截图来判断当前页面是否存在什么问题因此添加一个屏幕截图方法采用调用该方法时的日期来充当图片文件所在的目录而图片文件的名字则由调用屏幕截图时所在的方法名以及当时的时间构成。 最后再创建一个 wait 对象用于显示等待。 2注销功能的测试用例编写
from common.Utils import wait
from common.Utils import ojDriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ECclass Logout:url http://121.37.30.235:8888/driver ojDriver.driverLOGOUT_BUTTON_SELECTOR body div.navbar div.profile-section aWELCOME_MESSAGE_SELECTOR body div.content h1def __init__(self):self.driver.get(self.url)def logout(self, check False):wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, self.LOGOUT_BUTTON_SELECTOR))).click()if check:text wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, self.WELCOME_MESSAGE_SELECTOR))).textassert text 欢迎来到我的在线编程平台ojDriver.screenShot()
先访问网站首页然后尝试定位页面上的注销按钮这个过程添加了显示等待防止因为页面还没完全加载而导致元素定位失败而报错毕竟代码执行的速度太快了。 定位到之后就点击注销此时页面会跳转到首页并且首页中心的文字也会发生改变此时根据参数来决定是否要对该功能进行检查因为后续登录测试要频繁用到注销功能因此不是每一次调用都需要去生成截图文件。 3登录页面的测试用例编写
from common.Utils import wait
from common.Utils import ojDriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ECclass Login:url http://121.37.30.235:8888/login.htmldriver ojDriver.driverUSERNAME_INPUT_SELECTOR body div div form input[typetext]:nth-child(1)PASSWORD_INPUT_SELECTOR body div div form input[typepassword]:nth-child(2)LOGIN_BUTTON_SELECTOR body div div form input[typesubmit]:nth-child(3)WELCOME_MESSAGE_SELECTOR body div.content h1def __init__(self):self.driver.get(self.url)def loginSuccess(self, username, password, check False):ele1 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, self.USERNAME_INPUT_SELECTOR)))ele2 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, self.PASSWORD_INPUT_SELECTOR)))ele1.clear()ele2.clear()ele1.send_keys(username)ele2.send_keys(password)wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, self.LOGIN_BUTTON_SELECTOR))).click()wait.until(EC.alert_is_present())alert self.driver.switch_to.alertassert alert.text 登录成功将跳转至首页alert.accept()if check:text wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, self.WELCOME_MESSAGE_SELECTOR))).textassert text f欢迎回来{username}ojDriver.screenShot()def loginFail(self, username, password, check False):ele1 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, self.USERNAME_INPUT_SELECTOR)))ele2 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, self.PASSWORD_INPUT_SELECTOR)))ele1.clear()ele2.clear()ele1.send_keys(username)ele2.send_keys(password)wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, self.LOGIN_BUTTON_SELECTOR))).click()# 当有弹窗出现时必须先处理该弹窗然后才能截图不然会报错wait.until(EC.alert_is_present())alert self.driver.switch_to.alertassert alert.text 登录失败请检查您的用户名和密码alert.accept()if check:assert self.driver.current_url http://121.37.30.235:8888/login.htmlojDriver.screenShot()
登录测试中需要分别测试正常登录与异常登录它们分别为两个方法。这里通过弹窗的文字来判断是否登陆成功处理了弹窗后会有页面的跳转如果要截图的话则可以在这时候截图。 4注册页面的测试用例编写
from common.Utils import wait
from common.Utils import ojDriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ECclass Register:url http://121.37.30.235:8888/register.htmldriver ojDriver.driverUSERNAME_INPUT_SELECTOR body div div form input[typetext]:nth-child(1)PASSWORD_INPUT_SELECTOR body div div form input[typepassword]:nth-child(2)CONFIRM_INPUT_SELECTOR body div div form input[typepassword]:nth-child(3)REGISTER_BUTTON_SELECTOR body div div form input[typesubmit]:nth-child(4)def __init__(self):self.driver.get(self.url)def registerSuccess(self, username, password, check False):ele1 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, self.USERNAME_INPUT_SELECTOR)))ele2 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, self.PASSWORD_INPUT_SELECTOR)))ele3 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, self.CONFIRM_INPUT_SELECTOR)))ele1.clear()ele2.clear()ele3.clear()ele1.send_keys(username)ele2.send_keys(password)ele3.send_keys(password)wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, self.REGISTER_BUTTON_SELECTOR))).click()wait.until(EC.alert_is_present())alert self.driver.switch_to.alertassert alert.text 注册成功将跳转至登录页面alert.accept()if check:assert self.driver.current_url http://121.37.30.235:8888/login.htmlojDriver.screenShot()def registerFail(self, username, password, check False):ele1 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, self.USERNAME_INPUT_SELECTOR)))ele2 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, self.PASSWORD_INPUT_SELECTOR)))ele3 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, self.CONFIRM_INPUT_SELECTOR)))ele1.clear()ele2.clear()ele3.clear()ele1.send_keys(username)ele2.send_keys(password)ele3.send_keys(password)wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, self.REGISTER_BUTTON_SELECTOR))).click()wait.until(EC.alert_is_present())alert self.driver.switch_to.alertassert alert.text 注册失败该用户名已存在alert.accept()if check:assert self.driver.current_url http://121.37.30.235:8888/register.htmlojDriver.screenShot()
跟登录页面的测试用例差不多只是注册时需要确认密码因此要多定位一个输入框。 5首页的测试用例编写
from common.Utils import wait
from common.Utils import ojDriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ECclass Index:url http://121.37.30.235:8888/driver ojDriver.driverLOGIN_BUTTON_SELECTOR body div.navbar div.auth-links a.loginREGISTER_BUTTON_SELECTOR body div.navbar div.auth-links a.registerPROFILE_PHOTO body div.navbar div.profile-section div imgLOGOUT_BUTTON_SELECTOR body div.navbar div.profile-section adef __init__(self):self.driver.get(self.url)def notLogin(self, check False):ele1 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, self.LOGIN_BUTTON_SELECTOR)))ele2 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, self.REGISTER_BUTTON_SELECTOR)))assert ele1.text 登录assert ele2.text 注册if check:ojDriver.screenShot()def alreadyLogin(self, check False):wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, self.PROFILE_PHOTO))).click()self.driver.back()if check:ojDriver.screenShot()ele1 wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, self.LOGOUT_BUTTON_SELECTOR)))assert ele1.text 注销ele1.click()
首页主要是针对登录状态与未登录状态的不同地方来进行测试顺便截张图看看整体的页面效果。 6题目列表页的测试用例编写
from common.Utils import wait
from common.Utils import ojDriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ECclass Questions:url http://121.37.30.235:8888/all_questionsdriver ojDriver.driverBIG_TITLE_SELECTOR body div.question_list h1ID_SELECTOR body div.question_list table tbody tr:nth-child(1) th:nth-child(1)SMALL_TITLE_SELECTOR body div.question_list table tbody tr:nth-child(1) th:nth-child(2)DIFFICULTY_SELECTOR body div.question_list table tbody tr:nth-child(1) th:nth-child(3)QUESTION_SELECTOR body div.question_list table tbody tr:nth-child(7) td:nth-child(2) adef __init__(self):self.driver.get(self.url)def showQuestions(self, check False):ele1 wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, self.BIG_TITLE_SELECTOR)))ele2 wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, self.ID_SELECTOR)))ele3 wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, self.SMALL_TITLE_SELECTOR)))ele4 wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, self.DIFFICULTY_SELECTOR)))assert ele1.text 题目列表assert ele2.text 编号assert ele3.text 标题assert ele4.text 难度if check:ojDriver.screenShot()ele5 wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, self.QUESTION_SELECTOR)))assert ele5.text 正则表达式匹配if check:ele5.click()wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, body div.part1 div.right_code button)))ojDriver.screenShot()
主要针对页面的元素进行定位查看一下它的文本信息。然后测试点击题目后能否跳转到具体的题目详情页面。这里如果要截图的话依旧要添加显示等待等到题目详情页加载好后再去截图否则截到的图会是没跳转之前的。 7题目详情页的测试用例编写
from common.Utils import wait
from common.Utils import ojDriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ECclass Question:url http://121.37.30.235:8888/question/1driver ojDriver.driverID_SELECTOR #idDIFFICULTY_SELECTOR body div.part1 div.left_desc h3 smallSUBMIT_SELECTOR body div.part1 div.right_code buttonOUTPUT_SELECTOR body div.part1 div.right_code div pdef __init__(self):self.driver.get(self.url)def showQuestion(self, check False):ele1 wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, self.ID_SELECTOR)))ele2 wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, self.DIFFICULTY_SELECTOR)))assert ele1.text 1assert ele2.text 难度: 简单ele3 wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, self.SUBMIT_SELECTOR)))assert ele3.text 提交代码ele3.click()ele3 wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, self.OUTPUT_SELECTOR)))assert ele3.text Segmentation faultif check:ojDriver.screenShot()
同样针对页面上的一些元素去进行定位查看它的文本信息显示的正不正常。然后点击提交按钮此时由于什么代码也没写输出框会报错Segmentation fault。点击提交后再截个图即可。 8将所有测试用例运行起来
from test import Login
from test import Logout
from test import Register
from test import Index
from test import Questions
from test import Question
from common.Utils import ojDriverif __name__ __main__:Login.Login().loginSuccess(admin, 123, True)Logout.Logout().logout(True)Login.Login().loginSuccess(张三, 123)Logout.Logout().logout()Login.Login().loginFail(admin, 123456, True)Login.Login().loginFail(李四, 123)Login.Login().loginFail(王五, 123456)Register.Register().registerSuccess(赵六, abc, True)Login.Login().loginSuccess(赵六, abc, True)Logout.Logout().logout(True)Register.Register().registerFail(admin, qwe, True)Login.Login().loginSuccess(admin, 123, True)Index.Index().alreadyLogin(True)Index.Index().notLogin(True)Questions.Questions().showQuestions(True)Question.Question().showQuestion(True)ojDriver.driver.quit() 四、项目总结
经过上述的测试后现在项目整体的功能没有出现大的问题在测试过程中发现的一些小 Bug也都修复完成。可见通过系统性测试可以更好的发现 Bug从而来完善我们的项目。