项目背景
随着互联网的快速发展,信息共享和社交互动已成为人们日常生活中不可或缺的一部分。论坛作为一种传统的在线交流平台,仍然在特定领域和社区中发挥着重要作用。用户个人和小型团队需要一个轻量级、易定制的在线交流平台。现有论坛系统难以满足个性化需求。因此,用户需求开发一个轻量级、易于定制、注重隐私和安全的个人论坛系统。该项目旨在为用户提供简洁、高效、安全的交流平台,满足知识分享、话题讨论和协作需求。
项目简介
为“论坛系统”项目设计并实施自动化测试,自动化测试是通过Selenium编写的自动化脚本,覆盖了用户登录、用户注册、系统首页、编辑页面和私信等核心功能模块,为确保该项目各个模块功能的稳定,使用户有流畅的论坛浏览和使用体验。
对该系统分为从功能、性能、安全、界面、兼容性和易用性开始测试,使用selenium编写自动化脚本进行测试。
功能测试
测试用例
执行测试用例
1.创建驱动类
请求URL访问对应的页面,进入到对应的页面之后,执行一系列的测试用例。浏览器对象是每个页面都会调用的,所以把创建浏览器对象单独拿出来放到一个文件中,用来生成测试文件中需要用到的配置内容。有时候我们想要知道每次运行结束前的界面是什么情况,就可以使用屏幕截图来保存当时的情况。
import datetime
import os
import sys
from selenium import webdriver
#创建浏览器对象
class Driver:
driver = ""
def __init__(self):
path = 'C:\\Users\\31970\\.wdm\\drivers\\edgedriver\\win64\\134.0.3124.51\\msedgedriver.exe'
options = webdriver.EdgeOptions()
# 添加页面加载策略
# options.page_load_strategy = 'eager'
# service=EdgeService(EdgeChromiumDriverManager().install()
self.driver = webdriver.Edge(executable_path=path, options=options)
#self.driver.implicitly_wait(2)
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)
ForumDriver = Driver()
2.登录测试
登录测试分为成功登录和三种失败登录
import time
from selenium.webdriver.common.by import By
from common.Utils import ForumDriver
#测试登录页面
class ForumLogin:
url = ""
driver = ""
def __init__(self):
self.url = "http://127.0.0.1:9580/sign-in.html"
self.driver = ForumDriver.driver
self.driver.get(self.url)
def LoginSucTest(self):
time.sleep(2)
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("xiaoxiao")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("111")
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
time.sleep(2)
self.driver.maximize_window()
self.driver.find_element(By.CSS_SELECTOR, "#index_nav_nickname")
ForumDriver.getScreenShot()
def LoginFailTest1(self):
time.sleep(2)
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhang")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("1234")
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
time.sleep(2)
self.driver.maximize_window()
ForumDriver.getScreenShot()
alert = self.driver.find_element(By.CSS_SELECTOR, "body > div.jq-toast-wrap.bottom-right > div > h2").text
assert alert == "警告"
def LoginFailTest2(self):
# time.sleep(2)
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangsan")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("12345")
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
# time.sleep(2)
self.driver.maximize_window()
ForumDriver.getScreenShot()
alert = self.driver.find_element(By.CSS_SELECTOR, "body > div.jq-toast-wrap.bottom-right > div > h2").text
assert alert == "警告"
def LoginFailTest3(self):
# time.sleep(2)
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhang")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("12345")
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
# time.sleep(2)
self.driver.maximize_window()
ForumDriver.getScreenShot()
alert = self.driver.find_element(By.CSS_SELECTOR, "body > div.jq-toast-wrap.bottom-right > div > h2").text
assert alert == "警告"
3.注册测试
注册测试分为成功注册和四种失败注册
import time
from selenium.webdriver.common.by import By
from common.Utils import ForumDriver
# 注册页面的测试
class ForumRegister:
url = ""
driver = ""
def __init__(self):
self.url = "http://127.0.0.1:9580/sign-up.html"
self.driver = ForumDriver.driver
self.driver.get(self.url)
# 正常注册
def RegisterSucTest(self):
# 寻找输入框并清除内容
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#nickname").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
self.driver.find_element(By.CSS_SELECTOR, "#passwordRepeat").clear()
# 进行输入
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("testxiaoxiao2")
self.driver.find_element(By.CSS_SELECTOR, "#nickname").send_keys("测试员")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123")
self.driver.find_element(By.CSS_SELECTOR, "#passwordRepeat").send_keys("123")
# 同意条框点击注册
time.sleep(1)
self.driver.find_element(By.CSS_SELECTOR, "#policy").click()
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
self.driver.maximize_window()
time.sleep(1)
# 进行截图
ForumDriver.getScreenShot()
# 验证登录成功后是否跳转到登录页面
self.driver.find_element(By.CSS_SELECTOR,"body > div > div > div > div:nth-child(1) > div > div.card.card-md > div > h2")
# 异常注册
def RegisterFailTest1(self):
# 测试用例一:不输入用户名,但输入昵称,密码,同意条款进行注册
# 寻找输入框并清除内容
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#nickname").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
self.driver.find_element(By.CSS_SELECTOR, "#passwordRepeat").clear()
# 进行输入
self.driver.find_element(By.CSS_SELECTOR, "#nickname").send_keys("测试员")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123")
self.driver.find_element(By.CSS_SELECTOR, "#passwordRepeat").send_keys("123")
self.driver.maximize_window()
# 同意条框点击注册
time.sleep(1)
self.driver.find_element(By.CSS_SELECTOR, "#policy").click()
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
time.sleep(1)
# 进行截图
ForumDriver.getScreenShot()
# 寻找用户名不能为空的提示内容验证测试结果
self.driver.find_element(By.CSS_SELECTOR, "#signUpForm > div > div:nth-child(2) > div")
def RegisterFailTest2(self):
####################################################################
# 测试用例二:输入用户名,但输入昵称,密码,不同意条款进行注册
# 寻找输入框并清除内容
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#nickname").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
self.driver.find_element(By.CSS_SELECTOR, "#passwordRepeat").clear()
# 进行输入
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("test222")
self.driver.find_element(By.CSS_SELECTOR, "#nickname").send_keys("测试员")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123")
self.driver.find_element(By.CSS_SELECTOR, "#passwordRepeat").send_keys("123")
self.driver.maximize_window()
time.sleep(1)
checkbox = self.driver.find_element(By.CSS_SELECTOR, "#policy")
if checkbox.is_selected():
checkbox.click()
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
time.sleep(1)
# 进行截图
ForumDriver.getScreenShot()
# 检查是否还停用户注册界面来验证
self.driver.find_element(By.CSS_SELECTOR, "#signUpForm > div > h2")
def RegisterFailTest3(self):
#####################################################################
# 测试用例三:不输入昵称,输入用户名,密码,同意条款进行注册
# 寻找输入框并清除内容
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#nickname").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
self.driver.find_element(By.CSS_SELECTOR, "#passwordRepeat").clear()
# 进行输入
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("test222")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123")
self.driver.find_element(By.CSS_SELECTOR, "#passwordRepeat").send_keys("123")
time.sleep(1)
self.driver.find_element(By.CSS_SELECTOR, "#policy").click()
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
self.driver.maximize_window()
# 进行截图
ForumDriver.getScreenShot()
# 寻找昵称不能为空的提示内容验证测试结果
self.driver.find_element(By.CSS_SELECTOR, "#signUpForm > div > div:nth-child(3) > div")
def RegisterFailTest4(self):
#####################################################################
# 测试用例四:不输入密码,输入昵称,密码,同意条款进行注册
# 寻找输入框并清除内容
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#nickname").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
self.driver.find_element(By.CSS_SELECTOR, "#passwordRepeat").clear()
# 进行输入
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("test222")
self.driver.find_element(By.CSS_SELECTOR, "#nickname").send_keys("测试员")
self.driver.find_element(By.CSS_SELECTOR, "#passwordRepeat").send_keys("123")
self.driver.maximize_window()
# 同意条框点击注册
time.sleep(1)
self.driver.find_element(By.CSS_SELECTOR, "#policy").click()
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
# 进行截图
ForumDriver.getscreenshot()
# 寻找提示框验证登录
self.driver.find_element(By.CSS_SELECTOR, "#signUpForm > div > div:nth-child(4) > div > div")
4.论坛首页测试
import time
from selenium.webdriver.common.by import By
from common.Utils import ForumDriver
# 论坛首页测试
class ForumList:
# url = ""
driver = ""
def __init__(self):
# self.url = "http://127.0.0.1:9580/index.html"
self.driver = ForumDriver.driver
# self.driver.get(self.url)
def ForumListTest(self):
time.sleep(1)
# 进行元素查找
self.driver.find_element(By.CSS_SELECTOR,
"#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong")
self.driver.find_element(By.CSS_SELECTOR, "#index_nav_nickname")
self.driver.find_element(By.CSS_SELECTOR, "#topBoardList > li:nth-child(2) > a")
self.driver.find_element(By.CSS_SELECTOR,
"#bit-forum-content > div.page-header.d-print-none > div > div > div.col-auto.ms-auto.d-print-none > div > a.btn.btn-primary.d-none.d-sm-inline-block.article_post")
self.driver.find_element(By.CSS_SELECTOR,
"body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div.nav-item.d-none.d-md-flex.me-3 > div > form > div > input")
# 进行截图
ForumDriver.getScreenShot()
5.帖子详情页
import time
from selenium.webdriver.common.by import By
from common.Utils import ForumDriver
# 帖子详情页面的测试
class ForumDetail:
url = ""
driver = ""
def __init__(self):
self.url = "http://127.0.0.1:9580/index.html"
self.driver = ForumDriver.driver
self.driver.get(self.url)
# 检查页面元素
def ForumDetailTest(self):
time.sleep(2)
self.driver.find_element(By.CSS_SELECTOR,"#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong").click()
# 帖子详情页面的元素进行查找
time.sleep(2)
# 发布人
self.driver.find_element(By.CSS_SELECTOR, "#article_details_author_name")
# 发布时间
self.driver.find_element(By.CSS_SELECTOR, "#details_article_createTime")
# 帖子的标题
self.driver.find_element(By.CSS_SELECTOR, "#details_article_title")
# 最新回复
self.driver.find_element(By.CSS_SELECTOR, "#bit-forum-content > div.page-body > div > div > div:nth-child(2) > h3")
# 评论输入框
self.driver.find_element(By.CSS_SELECTOR,"#article_details_reply > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div.CodeMirror-activeline > pre")
# 评论发布按钮
self.driver.find_element(By.CSS_SELECTOR, "#details_btn_article_reply")
# 点赞按钮
self.driver.find_element(By.CSS_SELECTOR, "#details_btn_like_count")
6.帖子编辑页
import time
from selenium.webdriver.common.by import By
from common.Utils import ForumDriver
# 发布新帖页面的测试
class ForumEdit:
driver = ""
def __init__(self):
self.driver = ForumDriver.driver
# 元素检查
def ForumEditCheck(self):
# 返回首页
time.sleep(1)
self.driver.find_element(By.CSS_SELECTOR, "#nav_board_index > a").click()
time.sleep(1)
# 点击发布帖子按钮
self.driver.find_element(By.CSS_SELECTOR, "#bit-forum-content > div.page-header.d-print-none > div > div > div.col-auto.ms-auto.d-print-none > div > a.btn.btn-primary.d-none.d-sm-inline-block.article_post").click()
# 查找板块选择元素
self.driver.find_element(By.CSS_SELECTOR, "#article_post_borad")
# 查找标题输入框
self.driver.find_element(By.CSS_SELECTOR, "#article_post_title")
# 查找内容编辑框
#self.driver.find_element(By.CSS_SELECTOR, "#edit-article > div.CodeMirror.cm-s-default.CodeMirror-wrap.CodeMirror-empty > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div > pre")
# 寻找发布按钮
self.driver.find_element(By.CSS_SELECTOR, "#article_post_submit")
ForumDriver.getScreenShot()
# 功能测试
# def ForumFuncTest(self):
# # 默认发布Java板块
# # 找到标题输入框和内容编辑框进行编辑然后点击发布
# # 无法编辑内容,无法自动化测试
# time.sleep(2)
# self.driver.find_element(By.CSS_SELECTOR,"#article_post_title").send_keys("测试帖子1")
# self.driver.find_element(By.CSS_SELECTOR,"#edit-article > div.CodeMirror.cm-s-default.CodeMirror-wrap.CodeMirror-empty > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div > pre").send_keys("自动化测试中")
# self.driver.find_element(By.CSS_SELECTOR,"#article_post_submit").click()
# ForumDriver.getScreenShot()
7.私信页
import time
from selenium.webdriver.common.by import By
from common.Utils import ForumDriver
# 私信功能的测试
class ForumMessage:
url = ""
driver = ""
def __init__(self):
self.url = "http://127.0.0.1:9580/index.html"
self.driver = ForumDriver.driver
self.driver.get(self.url)
# 进行私信发发送测试
def ForumMesTest(self):
# 任意点击一个帖子给帖子的作者发私信
self.driver.find_element(By.CSS_SELECTOR,"#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a").click()
self.driver.find_element(By.CSS_SELECTOR, "#btn_details_send_message").click()
time.sleep(2)
# 输入信息
self.driver.find_element(By.CSS_SELECTOR, "#index_message_receive_content").send_keys("111111111")
time.sleep(1)
# 点击发送
self.driver.find_element(By.CSS_SELECTOR, "#btn_index_send_message").click()
8.启动文件
from common.Utils import ForumDriver
from tests import ForumLogin
from tests import ForumRegister
from tests import ForumList
from tests import ForumDetail
from tests import ForumMessage
from tests import ForumEdit
if __name__ == "__main__":
# 注册测试
#ForumRegister.ForumRegister().RegisterFailTest1()
#ForumRegister.ForumRegister().RegisterFailTest2()
ForumRegister.ForumRegister().RegisterSucTest()
# 登录测试
#ForumLogin.ForumLogin().LoginFailTest1()
ForumLogin.ForumLogin().LoginSucTest()
#首页测试
ForumList.ForumList().ForumListTest()
# 编辑页
ForumEdit.ForumEdit().ForumEditCheck()
# ForumEdit.ForumEdit().eFuncTest()
#详情页
ForumDetail.ForumDetail().ForumDetailTest()
#私信页
ForumMessage.ForumMessage().ForumMesTest()
ForumDriver.driver.quit()
项目bug描述
以下bug均出现在windows11,edge浏览器134.0.3124.51 (正式版本) (64 位)中
1.首页部分模块显示失效
但在帖子编辑页面正常显示
2.首页搜索框搜索功能无效
在输入内容和enter之后,界面刷新,但是在刷新之后没有出现应有的与关键词相近的帖子,而是显示首页内容,并且关键词会被刷新消失
下图是搜索时的截图
下图是输入test点击enter之前的界面
在点击enter搜索之后
与登录进入时一致,并没有实现搜索功能
3.个人中心修改密码bug
3.1原密码与新密码一致修改成功
在使用以下代码登录成功后
import time
from selenium.webdriver.common.by import By
from common.Utils import ForumDriver
#测试登录页面
class ForumLogin:
url = ""
driver = ""
def __init__(self):
self.url = "http://127.0.0.1:9580/sign-in.html"
self.driver = ForumDriver.driver
self.driver.get(self.url)
def LoginSucTest(self):
time.sleep(2)
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("xiaoxiao")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("111")
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
time.sleep(2)
self.driver.maximize_window()
self.driver.find_element(By.CSS_SELECTOR, "#index_nav_nickname")
ForumDriver.getScreenShot()
登录成功跳转到首页
之后更改密码,如下代码
import time
from selenium.webdriver.common.by import By
from common.Utils import ForumDriver
# 个人中心修改密码
class PasswordModify:
#url = ""
driver = ""
def __init__(self):
#self.url = "http://127.0.0.1:9580/index.html#"
self.driver = ForumDriver.driver
#self.driver.get(self.url)
def PasswordModifyTest(self):
time.sleep(1)
self.driver.find_element(By.CSS_SELECTOR, "#index_nav_avatar").click()
time.sleep(1)
self.driver.find_element(By.CSS_SELECTOR, "#index_user_settings").click()
time.sleep(2)
# 输入重复密码进行修改
self.driver.find_element(By.CSS_SELECTOR, "#settings_input_oldPassword").clear()
self.driver.find_element(By.CSS_SELECTOR, "#settings_input_newPassword").clear()
self.driver.find_element(By.CSS_SELECTOR, "#settings_input_passwordRepeat").clear()
self.driver.find_element(By.CSS_SELECTOR, "#settings_input_oldPassword").send_keys("111")
self.driver.find_element(By.CSS_SELECTOR, "#settings_input_newPassword").send_keys("111")
self.driver.find_element(By.CSS_SELECTOR, "#settings_input_passwordRepeat").send_keys("111")
ForumDriver.getScreenShot()
self.driver.find_element(By.CSS_SELECTOR, "#settings_submit_password").click()
time.sleep(2)
# 如果成功检查到登录界面的”用户登录“则是修改成功
self.driver.find_element(By.CSS_SELECTOR, "body > div > div > div > div:nth-child(1) > div > div.card.card-md > div > h2")
ForumDriver.getScreenShot()
截图捕捉如下
回到了首页即密码修改成功了,但这与修改密码的初心违背了。
3.2两个显示密码按钮
三个密码输入框均出现在清空的情况下会额外弹出一个显示密码按钮,新出现的显示密码能正常使用,但是原先的按钮点击会使界面弹至最上面,无法正常显示密码。
3.3额外的密码显示按钮bug
在未清空输入框的情况下,点击输入框以外之后,重新点击输入框补充输入密码的情况下,不会出现额外的显示密码按钮,导致无法显示密码。
4.无法在正确输入账号密码之后按enter登录
在键盘上敲击好账号密码最快捷的方式时敲击enter直接登录,但是在敲击后无响应,在易用性上不利于用户便捷登录。
测试结论
本次测试对登录、注册、编辑新帖、修改密码等核心功能进行测试并用selenium编写自动化测试脚本。需要完善搜索功能,确保修改密码时新密码不能与原密码一致和两个显示密码按钮,完善首页的各模块分类,以及快捷登录以便用户浏览,提高用户的使用体验。