个人博客系统主要功能自动化测试

项目介绍

项目简介

测试个人博客系统的主要功能。目的是为了对个人博客系统的主要功能:登录页面、列表页面、详情页面、编辑页面相关功能进行自动化测试。旨在提高测试效率与质量。

测试地址

http://8.137.19.140:9090/blog_login.html

项目设计

1.python编程语言设计测试脚本
2.webdriver驱动浏览器并操作页面元素
3.二次封装webdriver 操作方法
4.通过第三方插件pytest-html生成测试报告

设计测试用例

在这里插入图片描述

环境准备与使用工具

工具:

1、windows系统
2、Chrome浏览器(版本:128.0.6613.138)
3、PyCharm

环境:

1、Python 3.11
2、配置安装:Selenium 4.24.0 (pip install selenium)
3、配置安装:Pytest 8.3.3 (pip install pytest)
4、配置安装:Pytest-html 4.1.1 (pip install pytest-html)
5、配置安装:webdriver-manager (pip install webdriver-manager)

目录结构

NewAutoBlogTest
-common
--head.py
--_init_.py
-tests
--BlogLogin_test.py
--BlogList_test.py
--BlogDetail_test.py
--BlogEdit_test.py
--_init_.py

代码实现

common包下的创建Chrome浏览器web驱动对象并进行封装

from webbrowser import Chrome

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager


class Driver:
    driver=""
    def __init__(self):
        self.driver=webdriver.Chrome(service=Service(ChromeDriverManager().install()))

WebDriver=Driver()

tests包下的页面功能测试

登录页面

账号密码都正确
from time import sleep
import pytest
from selenium.webdriver.common.by import By

from common.head import Driver, WebDriver


class TestBlogLogin:
    driver=""
    url=""

    @classmethod
    def setup_class(cls):
        cls.driver = WebDriver.driver
        cls.url="http://8.137.19.140:9090/blog_login.html"
        cls.driver.get(cls.url)


    # 账号密码都正确
    def test_LoginSuc(self):
        self.driver.maximize_window()
        self.driver.find_element(By.CSS_SELECTOR,"#username").clear()
        self.driver.find_element(By.CSS_SELECTOR,"#password").clear()
        sleep(2)
        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()
        sleep(2)
        assert self.driver.current_url=="http://8.137.19.140:9090/blog_list.html"
账号正确,密码不正确
    def test_LoginDef01(self):
        self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(6)").click()
        self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
        self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
        sleep(2)
        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()
        sleep(3)
        alert = self.driver.switch_to.alert
        # print(alert.text)
        assert alert.text=="密码错误"
        alert.accept()
        sleep(3)
账号不正确,密码正确
    def test_LoginDef02(self):
        self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
        self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
        sleep(2)
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangn")
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
        self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
        sleep(2)
        alert=self.driver.switch_to.alert
        # print(alert.text)
        assert alert.text == "用户不存在"
        alert.accept()
        sleep(2)
账号不正确,密码不正确
    def test_LoginDef03(self):
        self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
        self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
        sleep(2)
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangn")
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("13465")
        self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
        sleep(2)
        alert = self.driver.switch_to.alert
        # print(alert.text)
        assert alert.text == "用户不存在"
        alert.accept()
        sleep(2)
账号密码都为空
 def test_LoginDef04(self):
        self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
        self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
        sleep(2)
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("")
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("")
        self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
        sleep(2)
        alert = self.driver.switch_to.alert
        # print(alert.text)
        assert alert.text=="账号或密码不能为空"
        alert.accept()
        sleep(2)

列表页功能

登录状态查找信息
from time import sleep
import pytest
from selenium.common import NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait

# 导入类
from tests.BlogLogin_test import TestBlogLogin
from common.head import Driver, WebDriver


class TestBlogList:
    driver=""
    url=""
    @classmethod
    def setup_class(cls):
        cls.driver=WebDriver.driver
        cls.url="http://8.137.19.140:9090/blog_login.html"
        cls.driver.get(cls.url)

    def test_LoginSuc(self):
        self.driver.maximize_window()
        self.driver.find_element(By.CSS_SELECTOR,"#username").clear()
        self.driver.find_element(By.CSS_SELECTOR,"#password").clear()
        sleep(2)
        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()
        sleep(2)
        # BlogDriver.cutpicture()
        assert self.driver.current_url=="http://8.137.19.140:9090/blog_list.html"


    def test_LoginSucList(self):
        self.driver.maximize_window()
        # 查找昵称
        self.driver.implicitly_wait(3)
        self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > h3")

        txt=self.driver.find_element(By.XPATH,"//a[text()='GitHub 地址']").text
        print(txt)

        # 查找博客题名为1的文章
        self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > div.title")
        assert self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > span").text=="我的博客系统"
        # 查找注销
        self.driver.find_element(By.CSS_SELECTOR," body > div.nav > a:nth-child(6)")
未登录状态
    def test_LoginDefList(self):
        self.driver.get("http://8.137.19.140:9090/blog_list.html")
        wait=WebDriverWait(self.driver,10)
        wait.until(expected_conditions.alert_is_present())

登录状态详情页展示

查找个人信息、文章标题等
from time import sleep

from selenium.common import NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

from common.head import WebDriver, WebDriver


class TestBlogDetail:
    driver=""
    url=""
    @classmethod
    def setup_class(cls):
        cls.driver=WebDriver.driver
        cls.url="http://8.137.19.140:9090/blog_login.html"
        cls.driver.get(cls.url)

    def test_LoginSuc(self):
        self.driver.maximize_window()
        self.driver.find_element(By.CSS_SELECTOR,"#username").clear()
        self.driver.find_element(By.CSS_SELECTOR,"#password").clear()
        sleep(2)
        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()
        sleep(2)
        assert self.driver.current_url=="http://8.137.19.140:9090/blog_list.html"

    #
    def test_LoginSucDetail(self):
        # 以标题为博客系统自动化测试的文章为例
        # 博客系统自动化测试的文章名
        self.driver.get("http://8.137.19.140:9090/blog_detail.html?blogId=3995")
        wait=WebDriverWait(self.driver,10)
        txt1=wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR,"body > div.container > div.right > div > div.title"))).text

        print(txt1)
        # 文章发表时间
        sleep(3)
        txt2=self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div > div.date").text
        print(txt2)

        sleep(3)
        txt3=self.driver.find_element(By.CSS_SELECTOR,"#detail").text
        print(txt3)
        sleep(2)
未登录状态
    def test_LoginDefDetail(self):
        self.driver.get("http://8.137.19.140:9090/blog_detail.html?blogId=3995")
        wait = WebDriverWait(self.driver, 10)
        wait.until(EC.alert_is_present())

编辑页功能

登陆状态写博客–从链接打开编辑页面
from time import sleep

from selenium.common import NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait

from common.head import WebDriver

class TestBlogEdit:
    driver=""
    url=""
    @classmethod
    def setup_class(cls):
        cls.driver = WebDriver.driver
        cls.url = "http://8.137.19.140:9090/blog_login.html"
        cls.driver.get(cls.url)


    def test_LoginSuc(self):
        self.driver.maximize_window()
        self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
        self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
        sleep(2)
        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()
        sleep(2)
        assert self.driver.current_url == "http://8.137.19.140:9090/blog_list.html"

    # 登录状态--从链接打开编辑页面   问题:标题相同的依旧可以发布
    def test_LoginSucEdit01(self):
        # self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(5)").click()
        self.driver.get("http://8.137.19.140:9090/blog_edit.html")
        self.driver.find_element(By.CSS_SELECTOR,"#title").send_keys("陕西西安")
        sleep(5)
        self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
        sleep(2)
登录状态–从例表页打开编辑页面
 def test_LoginSucEdit02(self):
        self.driver.get("http://8.137.19.140:9090/blog_list.html")
        self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(5)").click()
        sleep(1)
        self.driver.find_element(By.CSS_SELECTOR,"#title").send_keys("南昌")
        self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
        sleep(3)
登录状态–从例表页打开编辑页面
    def test_LoginSucEdit03(self):
        self.driver.get("http://8.137.19.140:9090/blog_detail.html?blogId=3995")
        #点击-写博客
        self.driver.find_element(By.CSS_SELECTOR, "body > div.nav > a:nth-child(5)").click()
        sleep(1)
        self.driver.find_element(By.CSS_SELECTOR, "#title").send_keys("江西南昌")
        self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
        sleep(3)
登录状态–从链接打开编辑页面–不写标题
    def test_LoginSucEdit04(self):
        self.driver.get("http://8.137.19.140:9090/blog_edit.html")
        self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
        sleep(2)
        alert=self.driver.switch_to.alert
        alert.accept()
        sleep(3)
未登录状态
    def test_LoginDefEdit(self):
        self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(6)").click()
        # 点击写博客
        # 是否出现弹窗
        wait=WebDriverWait(self.driver,5)
        wait.until(expected_conditions.alert_is_present())

测试输出报告

自动生成html格式报告,其中报告里面附带用例执行日志明细
通过pytest --html=report.html自动生成测试报告
在这里插入图片描述
共有三个执行用例未通过,查看得知,问题是均未出现弹窗而引发错误。
在这里插入图片描述
此外,还发现发布文章时,文章标题相同的依旧可以发布。
在这里插入图片描述

可联系开发人员添加对应功能和修改。

博易的功能特性】 新一代的博客 博易集众多博客的新功能于一体,是一款名副其实的新一代博客的典型范例!无刷新的日历、评论、回访功能无不体现了AJAX在博客中的娴熟运用! 成熟的系统架构 专业的团队用专业的框架开发出的产品。基于微软的.Net 2.0,作者对OOP具有着深入的理解,并对.Net特性有着透彻的研究。博易的系统架构和编码风格不能不说是OOP的设计典范! 方便的内容导入导出 博易后台提供了内容的导入和导出功能,生成一个XML文件。便利地解决了博客搬家的麻烦! 先进的评论体系 评论是博客极为重要的组成部分,博易用AJAX技术提供了一组先进的评论体系!该评论体系支持国别选择、发表评论支持实时预览、个性头像、聚合式评论……所有的这些都可以由管理员在后台做便捷的编辑调整! 无须数据库且支持多种数据库 默认采用基于 XML 的数据存储方式,此种方式提供几乎与静态网页相当的访问效率(避免了数据库并发查询的瓶颈)。同时也可以扩展支持SQL Server、Access等多种数据库存储方式。 独立页面发布功能 除了标准的博客日志,博易还支持在线发布静态页面!这些页面是独立的,对发布各种信息尤为有用! 多用户支持 博易对多用户共同创作、维护博客提供了全面的支持,博易允许多个用户维护同一个博客。访问者可以订阅任意一个博客用户的RSS feed、仅关注他们感兴趣的某个博客用户的日志! 多语言支持 博易支持多语言,您可以在全球任意地区的服务器上运行博易,而不用担心服务器时间和本地时间存在时差的问题。 Trackback 和 Pingback 特性 博易可以对所有链出的链接进行Track回溯和Ping回溯,您的博客链接将自动出现在您引用的博客的评论列表之中!提高您博客的链入指数、在无形之中推广了您的博客!每当创建一个新的日志,博易就会自动完成PingTechnorati、Feedburner、Ping-o-Matic等操作! 灵活易用的插件机制 博易采用了灵活强大的C#开发,架构十分先进成熟,她的插件机制也是如此。系统开放了事件定义,利用订阅事件能够使所开发的插件强大得如同系统程序本身一样! 酷炫主题支持 博易为快速开发主题(模板、风格)提供了支持,用户只需要稍稍懂得HTML和CSS便可进行主题的制作!博易的模板机制是基于.Net2.0的MasterPage的,这样,开发一套新的主题模板只需要修改3~5个文件即可完成!与此同时,博易有专业的设计师为您免费提供更多的个性主题!此外,博易还支持识别移动设备(如手机等)。能分别制定在用这些设备访问和用PC机访问时所用的主题模板! 符合 XHTML 博易所用的控件全部符合XHTML 1.0标准。所有的日志都会在您发表时自动转换成符合标准的格式!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值