1.博客系统项目介绍
该博客系统有四个部分组成,分别是登录页面,博客详情页,博客首页和博客编辑页。本次测试将分为手动测试和自动化测试两个部分。
2.博客系统测试用例的设计
在正式进行测试之前,我们首先就是要设计测试用例,搞清楚测试到底测什么?测哪些功能?
我将通过思维导图的方式将我设计的测试用例体现出来

3.手动测试
3.1博客登录页面
正常登录就是输入正确的账号和密码,成功登录博客系统,首先进入登录界面:
然后输入正确的账号和密码,将会跳转到博客首页, 如图所示,正常登录的功能正常:

什么情况下将会发生异常登录呢?输入正确的账号和错误的密码,输入错误的账号和正确的密码,输入错误的账号和错误的密码,这些情况都会造成异常登录,我们来测试看看这个功能能不能正常进行。
如图所示,假如输入错误的信息,将会发生异常登录,所以这个功能测试是正常的。
3.2博客首页显示功能
博客首页界面也分为登录状态下和未登录状态下,这两种状态下的显示功能应当也不一样。我们测试看看。
首先,在登录状态下,我们需要看到哪些信息才能证明首页功能是正常的呢?

如图所示,在登录状态下,我们应当看见的是用户的头像,用户的昵称,博客分类和博客文章。在博客列表这边也要看到的是博客文章名称,博客日期,博客正文和查看全文按钮,这些是需要正常显示的,我们正常登录看看,是否正常显示
如上图所示,我们可以正常看到上述描述的那些功能,所以博客首页显示功能是正常的,完成测试。
而在未登录的情况下,我们必须要看到的是哪些东西呢?在未登录状态下,博客系统应当将该用户拦在登录界面,先登录才能正常查看用户信息,我们测试看看,将登录页面的url复制,粘贴到另一个浏览器,然后查看页面。
如上图所示,确实是将用户拦在登录界面了,所以该功能是正常的,测试完成!
3.3博客详情页
博客详情页的查看也要分为登录状态下和未登录状态下,在登录状态下,我们应当测试的是文章的标题,文章的发布日期,文章的内容,这些都应该正常显示。我们测试看看吧:
如上图所示,我们测试的功能都能完成,并且左侧还显示出了用户的信息,这些功能也是正常的。测试完成。
那我们在未登录状态下测试一下吧。
如上图所示,达到我们的预期,该未登录用户成功被拦在了登录界面,需要登录才能查看博客内容。
3.4博客编辑页
在博客编辑页界面,我们需要测试哪些功能呢?首先我们正常发布博客和异常发布博客的表现是不一样的。正常发布博客,需要我们输入博客标题,博客内容以及点击发布博客的按钮,这三个都必须完成才能正常发布博客,这三个少一个都会导致异常发布。
我们先测试正常发布博客功能
如图所示,博客正常发布之后,博客系统将会正常发布博客,并且跳转到博客首页,博客首页将会显示博客标题,发布时间,博客内容和查看全文按钮。这些都是正常的,所以该功能正常,测试成功!
下面将测试异常发布,这里以不写标题为例:
如图所示,不写标题就点击发布按钮就会触动弹窗警告。符合用户需求,所以测试成功!
4.博客系统的自动化测试
我们使用Selenium工具,惊醒web自动化测试,Python语言。
想要完成这个测试我们需要下载两个工具,一个是
selenium库和webdriver-manager驱动。
这两个工具下载完成后可以检查一下
在设置里面的Python解释器里面看看有没有就可以了。
4.1工程项目列表
下一步,我们要创建工程,我们看看项目列表,来分析一下我们这次自动化测试项目需要测试的功能吧。

如上图所示,我们在工程目录下创建了两个包,一个是common,一个是tests,common包里面存放的是我们每个测试文件需要共同用到的对象。
另一个tests包就是存放的我们的测试代码。可以看到测试代码Python文件有测试登录界面,博客详情页,博客首页和博客编辑页。至于RunTest这个Python文件则将整个测试项目连接起来的运行入口。
4.2Utils文件
毫无疑问的是,我们的每个测试文件都需要一个浏览器驱动,于是就写了一个类,创建出一个类对象,供每个测试文件使用,在使用时引入这个包就可以了。具体看代码,
python
# 创建一个浏览器对象
import os
import sys
from datetime import datetime
from time import sleep
from requests import options
from selenium import webdriver
from selenium.webdriver.ie.service import Service
class Driver:
driver = ""
def __init__(self):
options = webdriver.ChromeOptions()
self.driver = webdriver.Chrome(service = Service("D:\\driver\\chromedriver-win64\\chromedriver.exe"), 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)
#创建一个类对象
BlogDriver = Driver()
1)需要注意的是在我们的driver类里面有一个getScreenShot函数,这个函数的功能就是在测试的时候可以截图,做到一个锦上添花的作用,帮助测试人员进行测试,并且还会以日期来命名,达到不会覆盖历史截图的效果。
2)在初始化函数内,还有一个implicitly_wait函数,这是一个智能等待函数,由于代码执行速度较快,页面内容较多,渲染加载需要时间,所以这个就会等待所有元素加载成功再去测试,很好地帮我们规避掉了这样的困难。
4.3自动化测试博客登录页面
测试博客登录页面分为两个部分:正常登录和异常登录,首先我们先创建一个类,写初始化函数:
python
class BlogLogin:
url = ""
driver = ""
def __init__(self):
self.url = "http://47.108.157.13:8090/blog_login.html"
self.driver = BlogDriver.driver
self.driver.get(self.url)
初始化将URL设置为登录页面的URL,将浏览器驱动设置为utils文件中创建的类对象,并且设置驱动为目标URL。
下一步,测试正常登录:
python
# 成功登录的测试用例
def LoginSucTest(self):
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.find_element(By.CSS_SELECTOR, "body > div.container > div.left > div > h3")
self.driver.back()
设置一个成员函数,然后找到这个页面的用户名、密码和登录按钮的选择器,填入正确的账号和密码,找到选择器,如图所示:右键copy selector即可
成功登录后找到博客首页的用户名等信息,如果存在,则会返回0。证明正常登录功能正常,测试成功!

异常登录测试
异常登录就是输入错误的账号错误的密码,正确的账号错误的密码,错误的账号正确的密码,就会异常登录。
python
# 异常登录的测试用例
def LoginFailTest(self):
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangsan")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123")
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
BlogDriver.getScreenShot()
我们最后一步截图,查看测试效果。
如图所示,达到用户需求,完成测试。
自动化测试博客登录页面测试完成,附上文件代码:
python# 测试博客登录页面 import time from selenium.webdriver.common import alert from selenium.webdriver.common.by import By from selenium.webdriver.support.expected_conditions import alert_is_present from common.Utils import BlogDriver class BlogLogin: url = "" driver = "" def __init__(self): self.url = "http://47.108.157.13:8090/blog_login.html" self.driver = BlogDriver.driver self.driver.get(self.url) # 成功登录的测试用例 def LoginSucTest(self): 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.find_element(By.CSS_SELECTOR, "body > div.container > div.left > div > h3") self.driver.back() # 异常登录的测试用例 def LoginFailTest(self): self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangsan") self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123") self.driver.find_element(By.CSS_SELECTOR, "#submit").click() BlogDriver.getScreenShot() login = BlogLogin() login.LoginSucTest() login.LoginFailTest()
4.4自动化测试博客首页
博客首页需要测试的内容就是博客标题,博客内容,博客发布时间以及查看全文按钮,其实也是照猫画虎,附上代码:
python
# 博客首页测试用例
from selenium.webdriver.common.by import By
from common.Utils import BlogDriver
class BlogList:
url = ""
driver = ""
def __init__(self):
self.url = "http://47.108.157.13:8090/blog_list.html"
self.driver = BlogDriver.driver
self.driver.get(self.url)
# 测试首页(登录情况下)
def ListTestByLogin(self):
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.right > div:nth-child(1) > div.desc")
self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.right > div:nth-child(1) > a")
self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.left > div > h3")
list = BlogList()
list.ListTestByLogin()
先初始化,然后设置成员函数,如果返回值为0,则测试成功!
4.5自动化测试博客详情页
博客详情页我们需要测试的是博客标题,博客发表时间以及博客内容。这三项非常重要。
python
# 测试博客详情页
from selenium.webdriver.common.by import By
from common.Utils import BlogDriver
class BlogDetail:
url = ""
driver = ""
def __init__(self):
self.url = "http://47.108.157.13:8090/blog_detail.html?blogId=68538"
self.driver = BlogDriver.driver
# 博客详情页测试
def DetailTestByLogin(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.date")
self.driver.find_element(By.CSS_SELECTOR, "#h2--")
BlogDriver.getScreenShot()
detail = BlogDetail()
detail.DetailTestByLogin()
也和之前的测试代码类似,创建一个成员函数,测试结果返回0,则测试成功!
4.6自动化测试博客编辑页
博客编辑页的流程是,先找到标题输入框,输入标题,然后找到内容输入框,输入内容。然后点击发布按钮,点击。最后检测页面顶部有没有标题为刚输入的标题的文章,如果有则发布成功!
python
# 博客编辑页面
import time
from selenium.webdriver.common.by import By
from common.Utils import BlogDriver
class BlogEdit:
url = ""
driver = ""
def __init__(self):
self.url = "http://47.108.157.13:8090/blog_edit.html"
self.driver = BlogDriver.driver
self.driver.get(self.url)
# 测试博客编辑页面,登录状态下
def EditSucTestByLogin(self):
self.driver.find_element(By.CSS_SELECTOR, "#title").send_keys("自动化测试")
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
actual = self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.right > div:nth-child(1) > div.title").text
assert actual == "111"
BlogDriver.getScreenShot()
time.sleep(3)
edit = BlogEdit()
edit.EditSucTestByLogin()
4.7自动化测试执行入口RunTest.py
上面我们分别编写了每个模块的自动化测试代码,下面我们将这几个测试连接在一块,回归测试。
python
from tests.BlogLogin import BlogLogin
from tests.BlogList import BlogList
from common.Utils import BlogDriver
from tests.BlogDetail import BlogDetail
if __name__ == "__name__":
BlogLogin.BlogLogin().LoginFailTest()
BlogLogin.BlogLogin().LoginSucTest()
BlogList.BlogList().ListTestByLogin()
BlogDetail.BlogDetail().DetailTestByLogin()
BlogDriver.driver.quit()
可以看到我们将每个测试模块的类都生成了,然后执行测试函数,最后关闭浏览器。这就是一个完整的测试过程。
由此可见,测试工作的流程主要就是设计测试用例->手动测试->编写自动化测试脚本->完成测试。
5.自动化测试的意义
自动化测试脚本是需要测试人员编写的,在测试每个项目的新版本时,测试人员都需要将旧版本的代码测试一遍,看是否兼容,但是每个版本测试一遍的人工成本是巨大的,这就需要测试人员编写自动化测试的脚本,将旧版本的代码测试,这就节省了很多人力成本。所以说自动化测试是高效的,但是也不能完全替代测试人员的手动测试,这两者是绝对相辅相成的。