目录
- 一、项目背景
- 二、论坛系统测试用例思维导图
- 三、论坛系统测试
- 3.1界面测试
- 3.2登陆测试
- 3.3主页测试
- 3.4个人中心测试
- 四、自动化测试脚本
- 4.1配置驱动
- 4.2创建浏览器类
- 4.3功能测试
- 4.3.1登陆测试
- 4.3.2注册测试
- 4.3.3主页测试
- 4.3.4帖子编辑
- 4.3.5运行主代码
- 五、BUG分析
- 六、测试总结
一、项目背景
论坛系统致力于打造一个多元交流社区,吸引各领域专业人士、爱好者及普通用户汇聚一堂。用户可在开放的环境中充分交流。伴随互联网用户群体持续壮大,尤其是年轻一代网民对在线交流和知识获取的需求不断攀升,论坛作为经典且有效的互动平台,蕴藏着巨大发展潜力。通过论坛系统建设,期望满足不同用户的多样化需求,提升信息交流效率与质量,为用户创造更多价值,助力互联网内容生态的健康、持续发展。
二、论坛系统测试用例思维导图
对于论坛系统简单可以分为六类方面进行测试:界面测试、安全测试、易用性测试、兼容性测试、功能测试。
三、论坛系统测试
3.1界面测试
- 用户登陆框虽然没有在屏幕正中央,好在用白色和背景板颜色区分更加显眼,并标有黑体“用户登陆”。
- 用户名及密码输入框大小合适,让用户容易输入。
- 登陆按钮用蓝色框格包围使得用户能加轻松登陆。
- “点击注册”字样用蓝色标识,时用户容易找到。
- 密码框内“小眼睛”有显示密码功能。
3.2登陆测试
- 用户名及密码为空时输入框下显示红色“用户名不能为空”或“密码不能为空”字样。
(用户名:zhangsan 密码:12345 为例)
- 输入正确用户名及错误密码,提示用户名或密码错误.
- 输入错误用户名及正确密码.
- 输入正确用户名及正确密码
进入论坛主页
3.3主页测试
- 1.点击发帖子
- 2.选择板块
- 3.输入标题及内容
- 4.点击发布
- 5.发布成功!!!
- 6.点击输入框输入论坛测试
测试发现点击搜索框内的放大镜无法搜索。
- 7.点击帖子标题
显示进入帖子
- 8.点击发私信
- 9.发布成功
测试显示没有查找私信功能
- 10.点击回复
回复成功!!!
3.4个人中心测试
- 点击主页头像
- 进入个人中心
- 点击修改昵称/邮箱地址/电话号码
测试结果发现无法修改
- 点击修改密码
- 修改成功
四、自动化测试脚本
4.1配置驱动
Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera,Edge等。
WebDriverManager 是一个开源的 Java 库,用于自动管理 Selenium WebDriver 所需的驱动程序(如 ChromeDriver、GeckoDriver、EdgeDriver 等)。它可以自动下载、设置和维护这些驱动程序,从而简化了 Selenium 测试的配置过程
在pycharm软件的设置中观察是否安装这两个软件包,如果没有可能无法正常驱动打开本地浏览器
4.2创建浏览器类
- 每个功能都需要pycharm驱动浏览,若每个功能都有一份浏览器驱动,功能过多可能导致软件崩溃,将驱动器类放入一个common文件,功能测试则放入test文件,image用于保存截屏图片
。
- 驱动器类
Lunta实例化出Driver类,每次测试功能时调用类对象driver,防止每个功能模块都创建一个新的驱动器。
import datetime
import os
import sys
import time
from selenium import webdriver
from selenium.webdriver.edge.service import Service
from webdriver_manager.microsoft import EdgeChromiumDriverManager
class Driver:
driver=""
def __init__(self):
#打开edge驱动管理
EdsIns=EdgeChromiumDriverManager().install()
options=webdriver.EdgeOptions()
#创建edge浏览器对象
self.driver=webdriver.Edge(service=Service(EdsIns),options=options)
# 截屏功能
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(f'../images/{dirname}/' + filename)
Lunta=Driver()
4.3功能测试
4.3.1登陆测试
- 函数find_element()分别找出用户名及密码输入框
- send_keys输入内容
- click模拟用户点击登陆按钮
- find_element找出主页信息判断是否登陆成功
import time
from selenium.webdriver.common.by import By
from common.untils import Lunta
class LunTaLgoin:
url=""
driver=""
def __init__(self):
self.url="http://127.0.0.1:9580/sign-in.html"
self.driver=Lunta.driver
self.driver.get(self.url)
#成功登陆
def LTLoginTest(self):
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("1234")
self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
time.sleep(2)
#查找头像是否登陆成功
self.driver.find_element(By.CSS_SELECTOR,"#index_nav_avatar")
#截屏登陆成功页面
Lunta.getScreenShot()
# self.driver.find_element(By.CSS_SELECTOR,"#index_nav_avatar").click()
# self.driver.find_element(By.CSS_SELECTOR,"#index_user_logout").click()
# Lunta.getScreenShot()
#登陆失败
def LTFailTest(self):
#密码错误
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(1)
Lunta.getScreenShot()
#检测是否出现密码错误弹窗
self.driver.find_element(By.CSS_SELECTOR,"body > div.jq-toast-wrap.bottom-right > div")
#清空内容
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(1)
Lunta.getScreenShot()
# 检测是否出现密码错误弹窗
self.driver.find_element(By.CSS_SELECTOR, "body > div.jq-toast-wrap.bottom-right > div")
# 清空内容
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("")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("12345")
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
time.sleep(1)
Lunta.getScreenShot()
# 检测是否出现用户名不能为空提示
text=self.driver.find_element(By.CSS_SELECTOR, "#signInForm > div.mb-3 > div").text
assert text=="用户名不能为空"
# 清空内容
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("")
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
time.sleep(1)
Lunta.getScreenShot()
# 检测是否出现用户名不能为空提示
text = self.driver.find_element(By.CSS_SELECTOR, "#signInForm > div.mb-2 > div > div").text
assert text == "密码不能为空"
4.3.2注册测试
- click模拟点击注册按钮
- find_element找出用户名,昵称,密码及确认密码输入框
- send_keys输入内容
- 注册失败是否有弹窗提示
- 注册成功返回登陆界面是否能登陆
import time
from selenium.webdriver.common.by import By
from common.untils import Lunta
class LunTareg:
driver=""
url=""
def __init__(self):
self.url = "http://127.0.0.1:9580/sign-in.html"
self.driver = Lunta.driver
self.driver.get(self.url)
def LTreg(self):
time.sleep(2)
self.driver.implicitly_wait(2)
self.driver.find_element(By.CSS_SELECTOR,"body > div > div > div > div:nth-child(1) > div > div.text-center.text-muted.mt-3 > a").click()
#注册成功
self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("zhangs")
self.driver.find_element(By.CSS_SELECTOR,"#nickname").send_keys("zhangs")
self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("1234")
self.driver.find_element(By.CSS_SELECTOR, "#passwordRepeat").send_keys("1234")
self.driver.find_element(By.CSS_SELECTOR, "#policy").click()
self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
time.sleep(2)
Lunta.getScreenShot()
self.driver.back()
#登陆
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangs")
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.find_element(By.CSS_SELECTOR, "#index_nav_avatar")
# 截屏登陆成功页面
Lunta.getScreenShot()
time.sleep(2)
self.driver.back()
def LTrefaii(self):
time.sleep(2)
self.driver.implicitly_wait(2)
#点击注册
self.driver.find_element(By.CSS_SELECTOR,"body > div > div > div > div:nth-child(1) > div > div.text-center.text-muted.mt-3 > a").click()
# 注册失败(用户已存在)
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangs")
self.driver.find_element(By.CSS_SELECTOR, "#nickname").send_keys("zhangs")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("1234")
self.driver.find_element(By.CSS_SELECTOR, "#passwordRepeat").send_keys("1234")
self.driver.find_element(By.CSS_SELECTOR, "#policy").click()
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
#是否弹窗提示
self.driver.find_element(By.CSS_SELECTOR,"body > div.jq-toast-wrap.bottom-right > div")
Lunta.getScreenShot()
# 注册失败(用户名为空)
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
# 是否提示
text=self.driver.find_element(By.CSS_SELECTOR, "#signUpForm > div > div:nth-child(2) > div").text
assert text=="用户名不能为空"
Lunta.getScreenShot()
# 注册失败(昵称为空)
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangs")
self.driver.find_element(By.CSS_SELECTOR, "#nickname").clear()
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
# 是否提示
text = self.driver.find_element(By.CSS_SELECTOR, "#signUpForm > div > div:nth-child(3) > div").text
assert text == "昵称不能为空"
Lunta.getScreenShot()
# 注册失败(密码为空)
self.driver.find_element(By.CSS_SELECTOR, "#nickname").send_keys("zhangs")
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
time.sleep(2)
# 是否提示
text = self.driver.find_element(By.CSS_SELECTOR, "#signUpForm > div > div:nth-child(4) > div").text
assert text == "密码不能为空"
Lunta.getScreenShot()
# 注册失败(确认密码错误)
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("1234")
self.driver.find_element(By.CSS_SELECTOR, "#passwordRepeat").send_keys("12345")
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
text=self.driver.find_element(By.CSS_SELECTOR,"#signUpForm > div > div:nth-child(5) > div > div").text
assert text=="请检查确认密码"
#未点击同意
self.driver.find_element(By.CSS_SELECTOR, "#policy").click()
# 是否弹窗提示
self.driver.find_element(By.CSS_SELECTOR, "body > div.jq-toast-wrap.bottom-right > div")
Lunta.getScreenShot()
self.driver.back()
4.3.3主页测试
1.click点击发帖子内容
2.send_keys输入标题
3.send_keys输入内容(编辑框外置无法完成交互)
4.Action链模拟点击(click无法点击)
import time
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from common.untils import Lunta
class LunTahome():
driver=""
url=""
def __init__(self):
# 登陆状态url
self.driver=Lunta.driver
self.url="http://127.0.0.1:9580/index.html"
self.driver.get(self.url)
def LTPuTest(self):
self.driver.implicitly_wait(5)
#点击发布帖子
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").click()
#编辑框外置无法完成交互
# 输入标题,若能交互则完成以下命令
# self.driver.find_element(By.CSS_SELECTOR, "#article_post_title").send_keys("如何年薪百万")
#self.driver.find_element(By.CSS_SELECTOR,"article_post_submit").click()
# # Action链模拟点击
# element = self.driver.find_element(By.XPATH, '//*[@id="article_post_submit"]')
# ActionChains(self.driver).move_to_element(element).click().perform()
# # 提示帖子内容不能为空
# self.driver.find_element(By.CSS_SELECTOR, "body > div.jq-toast-wrap.bottom-right > div")
# Lunta.getScreenShot()
#输入标题
self.driver.find_element(By.CSS_SELECTOR,"#article_post_title").send_keys("如何年薪百万")
#Action链模拟点击
element=self.driver.find_element(By.XPATH,'//*[@id="article_post_submit"]')
ActionChains(self.driver).move_to_element(element).click().perform()
#提示帖子内容不能为空
self.driver.find_element(By.CSS_SELECTOR,"body > div.jq-toast-wrap.bottom-right > div")
Lunta.getScreenShot()
# 不输入标题
self.driver.find_element(By.CSS_SELECTOR,"#article_post_title").clear()
# Action链模拟点击
element = self.driver.find_element(By.XPATH, '//*[@id="article_post_submit"]')
ActionChains(self.driver).move_to_element(element).click().perform()
# 提示输入标题不能为空
self.driver.find_element(By.CSS_SELECTOR, "body > div.jq-toast-wrap.bottom-right > div")
Lunta.getScreenShot()
self.driver.back()
4.3.4帖子编辑
- click点击发帖子>私信>send_keys输入内容>click点击回复>find_element搜索"回复成功弹窗">click点击回复>send_keys输入内容>click点击回复>find_element搜索“回复成功弹窗”>click点击点赞
import time
from selenium.webdriver.common.by import By
from common.untils import Lunta
class LunTaser:
driver=""
url=""
def __init__(self):
self.url="http://127.0.0.1:9580/index.html"
self.driver=Lunta.driver
self.driver.get(self.url)
#搜索
def LTaser(self):
self.driver.implicitly_wait(5)
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").send_keys("1234")
#点击搜索
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").click()
#搜索第一篇文章
time.sleep(3)
text=self.driver.find_element(By.CSS_SELECTOR,"#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong").text
Lunta.getScreenShot()
#断言是否搜索成功
#assert text=="1234"
#私信
def LTiss(self):
self.driver.implicitly_wait(5)
Lunta.getScreenShot()
self.driver.find_element(By.CSS_SELECTOR,"#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong").click()
self.driver.find_element(By.CSS_SELECTOR,"#btn_details_send_message").click()
self.driver.find_element(By.CSS_SELECTOR,"#index_message_receive_content").send_keys("上转转回收了吧")
self.driver.find_element(By.CSS_SELECTOR,"#btn_index_send_message").click()
Lunta.getScreenShot()
#是否发布成功弹窗
self.driver.find_element(By.CSS_SELECTOR,"body > div.jq-toast-wrap.bottom-right > div")
Lunta.getScreenShot()
#回复
def LTreply(self):
self.driver.implicitly_wait(5)
time.sleep(5)
self.driver.find_element(By.CSS_SELECTOR,"#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong").click()
self.driver.find_element(By.CSS_SELECTOR,"#article_details_reply > div.CodeMirror.cm-s-default.CodeMirror-wrap.CodeMirror-empty > div.CodeMirror-scroll").send_keys("哇哈哈")
self.driver.find_element(By.CSS_SELECTOR,"#details_btn_article_reply > span").click()
#内容为空无法发送
Lunta.getScreenShot()
#提示请输入内容
self.driver.find_element(By.CSS_SELECTOR,"body > div.jq-toast-wrap.bottom-right > div")
#点赞
def LTlike(self):
self.driver.implicitly_wait(5)
self.driver.find_element(By.CSS_SELECTOR,
"#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong").click()
self.driver.find_element(By.CSS_SELECTOR,"#details_btn_like_count").click()
#提示点赞成功
self.driver.find_element(By.CSS_SELECTOR,"body > div.jq-toast-wrap.bottom-right > div > h2")
time.sleep(1)
Lunta.getScreenShot()
4.3.5运行主代码
from test import LunTaLgoin
from test import LunTahome
from test import LunTareg
from test import LunTaser
if __name__ == '__main__':
# 注册失败
LunTareg.LunTareg().LTrefaii()
# 注册成功
LunTareg.LunTareg().LTreg()
#登陆失败
LunTaLgoin.LunTaLgoin().LTFailTest()
#登陆成功
LunTaLgoin.LunTaLgoin().LTLoginTest()
#主页测试
LunTahome.LunTahome().LTPuTest()
# 帖子测试
LunTaser.LunTaser().LTaser()
LunTaser.LunTaser().LTiss()
LunTaser.LunTaser().LTreply()
LunTaser.LunTaser().LTlike()
五、BUG分析
- 搜索框输入内容无法点击搜索
- 主页板块内容显示不完全
- 昵称、邮箱地址、电话号码、个人简介无法修改
六、测试总结
本次论坛系统测试旨在全面验证系统功能的完整性、稳定性及用户体验,确保系统能够满足用户在信息交流、内容发布等方面的需求。测试范围涵盖了前台用户操作功能以及后台管理功能,采用了多种测试方法,包括功能测试、性能测试、兼容性测试等。