1.项目背景
基于SSM框架实现的个人博客系统,现有登录注销页面,博客列表页,博客内容页,博客编辑页面。登录即可查看自己曾经发表的博客,通过使用Selenium定位web元素、对获取到的元素进行操作等,对博客系统进行测试,测试的内容有:登录页面的成功与失败登录,博客列表页的内容包括用户信息,博客内容详情页面的元素是否齐全,博客编辑页的交互功能是否能成功发布博客等重要功能。该博客系统可以实现发布个人博客,记录博客发布日期、时间、标题、博客发布者等信息。
2.测试内容
2.1功能测试
2.1.1 编写Web测试用例
设计测试用例方法一般从以下几个方面设计:
功能测试、界面测试、性能测试、易用性测试、安全性测试、兼容性测试等六个方面进行设计,但是个人博客系统是一个web网站,主要是针对核心功能进行测试,测试功能点如下:
2.2.2 执行测试用例
1.登录测试
(1)简介
用户名与密码已存储在数据库中,登录成功即可跳转到列表页;点击”退出“按钮,自动跳转到登录页。
(2)测试用例展示
(a)界面
(b)输入正确的账号和密码(以账号:zhangsan,密码:123456)
预期结果:跳转到博客列表页
实际结果展示
(c)输出错误的账号或密码
预期结果:显示弹窗,并提示用户名不存在或者密码错误
实际结果如下图
2.博客列表页
(1)简介
登录成功将跳转到博客列表页、当前用户的头像、用户名(是否与登录账号相同)、查看已发布博客的信息(包括标题、时间、相关内容)等信息。
(2)测试用例展示
(a)列表页展示
3.博客详情页面
(1) 简介
在博客列表页面点击查看全文,即可跳转到博客详情页,这时即可看到博客的全部内容,并且在文章的最后有编辑按钮(点击编辑按钮则可以跳转到博客编辑页),删除按钮(点击即可删除该博客)
(2) 测试效果展示
(a)博客详情页展示
4.博客编辑页面
(1) 简介
进入到博客列表页,点击右上角的写博客,即可进入博客的编辑页面,也可进行发布博客
(2) 实际效果展示
(a)登录之后会先来到博客列表页
(b) 点击右上角的写博客按钮即可进入博客编辑页面
(c) 输入正确的标题和内容,点击发布文章按钮即可成功发布博客
(d) 点击“发布文章”按钮后,即可返回到博客列表页面查看新发布的博客
5.删除博客用例
(1) 简介
进入到博客详情页面后,点击删除按钮,即可删除该篇博客
(a) 实际效果展示
(b) 点击确定后即可删除该文章
6.退出
(1) 简介
在列表页面,点击右上角的注销按钮,即可退出当前账号,随后可进行重新登陆
(a) 实际效果展示
(b) 点击右上角的注销按钮
2.2 使用Selenium进行Web自动化测试(Python)
2.2.1 安装WebDriverManager驱动管理程序和selenium 类库
WebDriverManager是一个用于管理Web驱动程序的工具,主要用于自动化测试领域。在进行 Selenium 测试时,需要一个与浏览器相匹配的 Web 驱动程序,以便控制和操作浏览器。WebDriverManager能够自动下载和管理浏览器驱动程序,会自动检测本地系统中安装的浏览器,并下载对应的浏览器驱动程序(如ChromeDriver、FirefoxDriver等)。这避免了手动下载和配置驱动程序的繁琐过程,提高了自动化测试的效率和稳定性,以便在自动化测试中使用这些浏览器。
2.2.2 新建项目
在项目中点击File->Settings进入界面,查看“Project:当前项目名”中是否存在selenium和webdriver-manager两个包。
2.2.3 参照测试用例,编写自动化测试脚本
1.创建浏览器对象
为了之后可以避免冗余的代码,并且可以节省空间以及时间,所以要将调用的浏览器对象放到一个单独的文件中,这里定义一个Utils.py文件,用来写测试中需要的配置文件(屏幕截图、隐式等待)
有时候我们想要知道每次运行结束前的界面是什么情况,就可以使用屏幕截图来保存当时的情况。
①首先我们定义一个driver类
②定义俩个我们所需要的构造函数
# 总配置文件
import datetime
import os
import sys
from selenium import webdriver
#创建一个浏览器对象
class Driver:driver = ""def __init__(self):self.driver = webdriver.Edge()self.driver.implicitly_wait(20)def getScreen(self):# 创建屏幕截图dirname = datetime.datetime.now().strftime("%Y-%m-%d")filename = sys._getframe().f_back.f_code.co_name + "-" + datetime.datetime.now().strftime('%Y-%m-%d-%H%M%S') + ".png"# 判断是否有该文件夹os.makedirs(f"../images/{dirname}", exist_ok=True)self.driver.save_screenshot(f'../images/{dirname}/{filename}')MyBlogDriver = Driver()
2.创建一个总入口文件,为了方便统一调用各个自动化测试接口(RunTest.py)
# 总运行入口文件
if __name__ == '__main__':
3.进行博客“登录”自动化测试用例
① 新建一个博客登录测试文件,命名为:BlogLogin.py
② 引入Utils.py文件(获取到创建的浏览器对象)和其他需要的配置文件
③ 创建一个类对象,我们在这里命名为与文件同名(BlogLogin)
④ 引入一些需要用到的第三方库
⑤ 构造一个成功登录博客的函数(loginSuc)与一个失败登录博客的构造函数(loginfail)
⑥ 注意清空输入框的内容后才能再次输入用户名及密码进行登录
⑦ 测试内容包括:输入正确的账号密码进行登录,以及账号错误与密码正确,账号正确密码错误
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from 博客系统测试.common.Utils import MyBlogDriver
class BlogDriver:driver = ""url = ""def __init__(self):self.url = "http://8.137.19.140:9090/blog_login.html"self.driver = MyBlogDriver.driverself.driver.get(self.url)#成功登录的测试用例def loginSuc(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("123456")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()# self.driver.back()# 失败登录用例def loginfail(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, "#username").send_keys("zhangsa")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")# time.sleep(2)self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(2)alert = self.driver.switch_to.alerttext = alert.text# assert alert == "密码错误"assert text == "用户不存在"alert.accept()
测试结果如下:
4.”博客列表页“自动化测试
① 新建一个博客列表页测试文件,命名为:BlogList.py
② 引入Utils.py文件(获取到创建的浏览器对象)和其他需要的配置文件
③ 创建一个类对象,我们在这里命名为与文件同名(BlogList)
④ 引入一些需要用到的第三方库
⑤ 构造一个成功登录博客的函数(Blist)(由于未登录的情况下会直接返回到登录页面 所以未进行测试未登录状态下的博客列表页)
⑥ 测试内容包括:博客标题、博客内容、按钮等是否存在,以及"用户名称是否与登录的账号一致”
# 博客列表页测试
import time
from selenium.webdriver.common.by import By
from 博客系统测试.common.Utils import MyBlogDriver
class BlogList:driver = ""url = ""def __init__(self):self.url = "http://8.137.19.140:9090/blog_list.html"self.driver = MyBlogDriver.driverself.driver.get(self.url)def Blist(self):# time.sleep(2)# 检查有没有博客标题self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > div.title")# 检查有没有用户名称self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > h3")# 检查有没有查看全文按钮self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > a")
# 博客列表登录失败用例 由于未登录情况会直接跳转到登录页面 所以未进行测试
from 博客系统测试.TestCase import BlogLogin, BlogList, BlogDetail, BlogEdit, BlogDel
from 博客系统测试.common.Utils import MyBlogDriver
# 总运行入口文件
if __name__ == '__main__':# 失败登录测试用例BlogLogin.BlogDriver().loginfail()# 成功登录测试用例BlogLogin.BlogDriver().loginSuc()# # 博客列表页测试用例BlogList.BlogList().Blist()MyBlogDriver.driver.quit()
测试结果如下:
5.”博客详情页(点击“查看全文”按钮)“自动化测试
① 新建一个博客详情页测试文件,命名为:BlogDetail.py
② 引入Utils.py文件(获取到创建的浏览器对象)和其他需要的配置文件
③ 创建一个类对象,我们在这里命名为与文件同名(BlogDetail)
④ 引入一些需要用到的第三方库
⑤ 构造一个成功登录博客的函数(detail)(由于未登录的情况下会直接返回到登录页面 所以未进行测试未登录状态下的博客详情页)
⑥ 测试内容包括:博客标题、博客内容、编辑按钮,删除按钮等是否存在,以及"用户名称是否与登录的账号一致”
# 博客详情页测试
import time
from selenium.webdriver.common.by import By
from 博客系统测试.common.Utils import MyBlogDriver
class BlogDetail:url = ""driver = ""def __init__(self):self.url = "http://8.137.19.140:9090/blog_detail.html?blogId=35401"self.driver = MyBlogDriver.driverself.driver.get(self.url)# 验证博客详情页面的用例def detail(self):# time.sleep(2)# 验证时间self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div > div.title")# 验证标题self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div > div.date")# 验证博客内容self.driver.find_element(By.CSS_SELECTOR,"#detail > p")
RunTest.py
from 博客系统测试.TestCase import BlogLogin, BlogList, BlogDetail, BlogEdit, BlogDel
from 博客系统测试.common.Utils import MyBlogDriver
# 总运行入口文件
if __name__ == '__main__':# 失败登录测试用例BlogLogin.BlogDriver().loginfail()# 成功登录测试用例BlogLogin.BlogDriver().loginSuc()# # 博客列表页测试用例BlogList.BlogList().Blist()# # 博客详情页测试用例BlogDetail.BlogDetail().detail()MyBlogDriver.driver.quit()
测试效果如下:
6.“删除博客”自动化测试
①在博客详情页测试文件中,构造一个函数编写删除博客自动化脚本
②在这个界面中主要是点击“删除”按钮之后,自动跳转到列表页,获取第一篇博客标题是否是给定标题,来判断是否删除成功。
③在RuntTest.py中指定各个函数的执行顺序
# 博客详情页测试
import time
from selenium.webdriver.common.by import By
from 博客系统测试.common.Utils import MyBlogDriver
class BlogDetail:url = ""driver = ""def __init__(self):self.url = "http://8.137.19.140:9090/blog_detail.html?blogId=35401"self.driver = MyBlogDriver.driverself.driver.get(self.url)# 验证博客详情页面的用例def detail(self):# time.sleep(2)# 验证时间self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div > div.title")# 验证标题self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div > div.date")# 验证博客内容self.driver.find_element(By.CSS_SELECTOR,"#detail > p")# 删除博客用例def SucDel(self):# 查找标题是否存在self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.right > div > div.title")# 查找删除按钮self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div > div.operating > button:nth-child(2)").click()# 获取弹窗元素alert = self.driver.switch_to.alert# 获取到弹窗上的内容text = alert.text# 断言进行判断assert text == "确定删除?"alert.accept()
RunTest.py
from 博客系统测试.TestCase import BlogLogin, BlogList, BlogDetail, BlogEdit, BlogDel
from 博客系统测试.common.Utils import MyBlogDriver
# 总运行入口文件
if __name__ == '__main__':# 失败登录测试用例BlogLogin.BlogDriver().loginfail()# 成功登录测试用例BlogLogin.BlogDriver().loginSuc()# # 博客列表页测试用例BlogList.BlogList().Blist()# # 博客详情页测试用例BlogDetail.BlogDetail().detail()BlogDetail.BlogDetail().SucDel()MyBlogDriver.driver.quit()
测试效果如下:
6.”博客的编辑与发布“自动化测试
① 新建一个博客详情页测试文件,命名为:BlogEdit.py
② 引入Utils.py文件(获取到创建的浏览器对象)和其他需要的配置文件
③ 创建一个类对象,我们在这里命名为与文件同名(BlogEdit)
④ 引入一些需要用到的第三方库
⑤ 构造一个成功发布博客的函数(SucEdit)和一个失败发布博客函数(FailEdit)
⑥ 测试内容包括:博客标题、博客内容、发布博客按钮等是否存在,以及不写标题写内容能发发布博客,写标题写内容不点击发布博客按钮是否能发布博客,写标题不写内容能否发布博客用例
#写博客页面测试
import time
from selenium.webdriver import Keys
from selenium.webdriver.common.by import By
from 博客系统测试.common.Utils import MyBlogDriver
class BlogEdit:url = ""driver = ""def __init__(self):self.url = "http://8.137.19.140:9090/blog_edit.html"self.driver = MyBlogDriver.driverself.driver.get(self.url)# 成功发布博客def SucEdit(self):# time.sleep(5)# 判断能否找到菜单栏的内容 并点击self.driver.find_element(By.CSS_SELECTOR,"#editor > div.editormd-toolbar > div > ul > li:nth-child(12) > a > i").click()# 找到标题框并写入self.driver.find_element(By.CSS_SELECTOR,"#title").send_keys("测试内容1")# 找到输入内容的区域 因为输入内容的区域为第三方插件 是不可交互的 所以我们要找菜单栏可交互的按钮# self.driver.find_element(By.CSS_SELECTOR,"#editor > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div > pre > span > span").clear()# self.driver.find_element(By.CSS_SELECTOR,"#editor > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div > pre > span").send_keys("今天是测试的第一天")# 找到发布文章按钮 并发布self.driver.find_element(By.CSS_SELECTOR,"#submit").click()self.driver.back()#返回博客列表页面 判断是否有该标题text = self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(19) > div.title").textassert text == "测试内容1"# 错误发布博客def FailEdit(self):time.sleep(5)# 判断能否找到菜单栏的内容 并点击self.driver.find_element(By.CSS_SELECTOR,"#editor > div.editormd-toolbar > div > ul > li:nth-child(12) > a > i").click()#不写标题内容#点击发布博客按钮self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(2)alert = self.driver.switch_to.alerttext = alert.textassert text == ""alert.accept()# 由于输入框内容为第三方插件未不可交互 即无法测试
RunTest.py
from 博客系统测试.TestCase import BlogLogin, BlogList, BlogDetail, BlogEdit, BlogDel
from 博客系统测试.common.Utils import MyBlogDriver
# 总运行入口文件
if __name__ == '__main__':# 失败登录测试用例BlogLogin.BlogDriver().loginfail()# 成功登录测试用例BlogLogin.BlogDriver().loginSuc()# # 博客列表页测试用例BlogList.BlogList().Blist()# # 写博客页面测试用例BlogEdit.BlogEdit().SucEdit()BlogEdit.BlogEdit().FailEdit()# # 博客详情页测试用例BlogDetail.BlogDetail().detail()BlogDetail.BlogDetail().SucDel()MyBlogDriver.driver.quit()
测试结果如下:
3.自动化测试的特点与亮点
自动化测试的特点和优点包括:
- 自动化测试可以提高测试效率和准确性,比手动测试更快速和稳定。
- 可以重复执行测试用例,确保每次测试的一致性和可靠性。
- 自动化测试可以更好地覆盖各种测试情况,包括大规模的数据和不同的测试场景。
- 可以节省人力资源和时间成本,减少人工干预的可能性。
- 可以更早地发现和修复软件缺陷,提高软件质量和稳定性。
- 可以提供更详尽的测试报告和数据分析,帮助决策者做出更准确的决策。
总的来说,自动化测试能够成为软件开发过程中的重要辅助工具,提高测试效率、减少人为错误,为软件质量的提升和项目的成功交付提供有力支持。
4.完整测试代码连接
仓库存放测试相关用例和代码 (gitee.com)