【測試】基于博客系統的測試報告

前言

本篇博客對簡易的博客系統做的測試總結一份測試報告,包含功能測試,自動化測試,性能測試

💓 個人主頁:zkf

? 文章專欄:測試

若有問題 評論區見📝

🎉歡迎大家點贊👍收藏?文章

目錄

項目背景

項目概述

已實現的功能

未實現的功能

博客項目系統的功能概括

登錄功能

博客列表頁

博客詳情頁

博客編輯頁

測試計劃

測試用例

測試分類

功能測試

自動化測試

編寫自動化測試用例

自動化測試所需工具

自動化測試流程

性能測試

性能測試工具

性能測試流程

性能測試報告

測試總結


項目背景

現如今越來越多的博客平臺不斷出現,發布博客已成為技術交流與知識分享的重要途徑,我在日常寫作和交流中也深刻體會到一個高效、便捷、安全的博客系統對于個人成長和技術傳播的重要性,所以我認為一個博客系統的開發與測試至關重要。

項目概述

本博客系統項目是一個基于前后端分離架構的系統項目,運用數據庫,將博客系統的賬戶與博客數據存儲在云服務器上,前端實現主要由四個頁面組成,分別是:登錄頁、博客列表頁、博客詳情頁和博客編輯頁,后端是對應實現的細節操作的接口,從而構成一個簡易的博客系統的組成

已實現的功能

用戶登錄與注銷

博客的發布與刪除

博客列表與詳情查看

用戶登錄錯誤的警告彈窗

未實現的功能

沒有注冊功能,需提前寫進數據庫

沒有統計博客數和用戶數

頭像只能為靜態

刪除博客功能未在頁面上實現

博客未編寫完成時不能保存

博客項目系統的功能概括

登錄功能

登錄頁面有對應的用戶名和密碼輸入框還有對應的提交按鈕,輸入已存在數據庫的用戶數據,點擊提交,跳轉到博客列表頁,若未登錄下點擊右上角主頁或寫博客,將強制跳轉到登錄頁

博客列表頁

該頁面展示登錄用戶的頭像與地址,文章個數與分類數,并且展示每篇博客的簡要信息(標題,簡要內容,發布時間等),右上角注銷按鈕,退出登錄,返回登錄頁面,主頁返回博客列表頁,寫博客跳轉至博客編輯頁

博客詳情頁

點擊列表頁中的查看詳情按鈕進入詳情頁,顯示該博客標題,時間,詳細內容,右上角三個按鈕,效果跟上面一樣

博客編輯頁

在登錄狀態下,點擊右上方寫博客按鈕跳轉至博客編輯頁進行寫博客,用戶可輸入標題與正文內容,點擊發布博客按鈕后,博客被保存并發布,隨后跳至博客列表頁


測試計劃

功能前端開發后端開發提測日期測試測試日期測試結果
登錄zkfzkf8.16zkf8.17通過
主頁zkfzkf8.16zkf8.17通過
詳情頁zkfzkf8.17zkf8.18通過
編輯頁zkfzkf8.17zkf8.18通過
回歸測試zkf8.20通過

測試用例


測試分類

功能測試

一個博客系統的功能測試

功能測試結果:測試用例 100%通過

自動化測試

編寫自動化測試用例

自動化測試所需工具

Python集成開發環境:Pycharm

python運行環境:Python 3.9

安裝所需要的相關庫:selenium,webdriver-manager

自動化測試流程

搭建目錄以及相關軟件

首先,創建BlogAutoTest測試項目,然后創建兩個文件包一個是common,另一個是tests,tests里面存放每個頁面的測試文件,common里創建個Utils用于構建瀏覽器對象,以及用到的截圖工具功能,再創建一個images文件存放截到的圖片

Utils.py文件

import datetime
import os.path
import sysfrom selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManagerclass Driver:driver=""def __init__(self):options=webdriver.ChromeOptions()self.driver=webdriver.Chrome(service=Service(ChromeDriverManager().install()),options=options)self.driver.implicitly_wait(2)def screePhoto(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()

創建一個Driver瀏覽器對象,初始化函數中通過selenium庫里對應的webdriver創建Chrome瀏覽器對象,所需要的服務用到對應的Chrome驅動,對應驅動在webdriver-manager庫里,options配置選擇默認配置就行,再配置個隱式等待。在類里在創建個截圖功能函數,函數里首先通過對應的年月日創建目錄名稱,在該目錄下再用年月日時分秒與對應測試的功能名稱創建對應截圖文件名,這樣子可以防止文件命名沖突并且可以快速查找什么時候哪個功能測試結果圖。最后在創建個該類的全局變量,讓其他測試文件用一個用例就行


BlogLoginTest.py

import timefrom selenium.webdriver.common.by import By
from common.Utils import BlogDriverclass BlogLogin:url=""driver=""def __init__(self):self.url="http://8.137.19.140:9090/blog_login.html"self.driver=BlogDriver.driverself.driver.get(self.url)#成功登錄的出測試用例def LoginSucTest(self):time.sleep(3)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.find_element(By.CSS_SELECTOR, "body > div.container > div.left > div > h3")BlogDriver.screePhoto()self.driver.back()#異常登錄的測試用例def LoginFauTest(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("zhang")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("1234")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(2)alert=self.driver.switch_to.alerttime.sleep(2)alert.accept()self.driver.find_element(By.CSS_SELECTOR, "#username").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()BlogDriver.screePhoto()
login=BlogLogin()

點擊“檢查”

選擇要檢查的對應目標

選擇以選擇器方式拷貝對應元素

在編寫代碼時,在find_element函數里粘貼,來查找對應元素目標,通過send_keys或click進行寫入對應元素文本框或點擊對應元素

在異場登錄彈出的警告框不屬于頁面內容,需要用switch_to.alert跳轉到對應警告框,accept表示接收警告框信息,成功登錄與異常登錄結果分別截圖


BlogListTest.py

from common.Utils import BlogDriver
from selenium.webdriver.common.by import Byclass Bloglist:url=""driver=""def __init__(self):self.driver=BlogDriver.driverself.url="http://8.137.19.140:9090/blog_list.html"self.driver.get(self.url)def testBlogList(self):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.right > div:nth-child(1) > div.date")self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > div.title")BlogDriver.screePhoto()
list=Bloglist()

根據測試用例,查找登錄狀態下的主頁里昵稱,地址,等元素,查找列表里博客標題,時間,簡要內容等元素,以及檢查相關功能等,測試結果截圖保存


BlogDetailTest.py

from common.Utils import BlogDriver
from selenium.webdriver.common.by import Byclass Detail:url=""driver=""def __init__(self):self.url="http://8.137.19.140:9090/blog_detail.html?blogId=166703"self.driver=BlogDriver.driverself.driver.get(self.url)def DetailTest(self):self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div > div.title")BlogDriver.screePhoto()
detail=Detail()

根據測試用例,檢查登錄狀態下的相關的列表詳情頁元素,測試結果截圖保存


BlogEidtTest.py

from common.Utils import BlogDriver
from selenium.webdriver.common.by import Byclass Eidt:url=""deriver=""def __init__(self):self.url = "http://8.137.19.140:9090/blog_edit.html"self.driver = BlogDriver.driverself.driver.get(self.url)def EditTest(self):BlogDriver.screePhoto()self.driver.find_element(By.CSS_SELECTOR,"#title").send_keys("4444")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()BlogDriver.screePhoto()
eidt=Eidt()

根據測試用例,檢查登錄狀態下的編輯頁里的元素,檢查是否能編寫博客并發布,測試結果截圖保存


最后在回歸測試下所有接口

from tests import BlogLoginTest
from tests import BlogListTest
from tests import BlogDetailTest
from tests import BlogEidtTest
from common.Utils import BlogDriverif __name__ == "__main__":BlogLoginTest.BlogLogin().LoginFauTest()BlogLoginTest.BlogLogin().LoginSucTest()# #登陸成功之后就可以調用博客首頁測試首頁的用例(登陸狀態)BlogListTest.Bloglist().testBlogList()# #測試登錄狀態下的博客詳情頁# BlogDetailTest.Detail().DetailTest()#博客編輯頁面BlogEidtTest.Eidt().EditTest()#指定瀏覽器的退出BlogDriver.driver.quit()

自動化測試結果:通過


性能測試

性能測試工具

jmeter測試工具

用到的兩個jmeter插件:Page Data Extractor和Custom?Thread Groups

性能測試流程

創建一個測試系統性能的線程組

以20個線程為例做一個簡單的性能測試,每5個線程在1s內執行,每間隔3s執行一次


創建http默認請求值

這個包含了所有請求哪一項不填,用到的是默認值在該頁中,我們的id和端口號可以放在這里


分別創建登錄,列表頁,用戶信息,詳情頁,添加博客對應請求,并通過結果樹驗證是否通過

注意

登錄憑證在沒有Cookie的情況下,需要添加到用到登錄憑證的請求頭中,否則連接失敗,所以登錄響應中的data需要提取出來到一個臨時變量再添加到HTTP頭管理器

詳情頁里訪問的博客id可以指定成你在列表頁中提取出來的id

在添加博客請求時,若訪問失敗,是content-type內容不同,需要在請求頭里添加


查看響應時間圖與吞吐量圖

我們可以得知響應時間越高吞吐量越低是符合在性能測試下的預期,但我們發現最后線程退出時相應時間不短升高

我們再根據線程圖觀察到最后一個線程并沒有退出來,我們再看下聚合報告,哪個頁面響應時間長

分析原因

有聚合報告得知列表頁響應時間過長,說明列表頁存在問題,或許列表頁響應數據太多,我們可以添加分頁,來限制每頁最大博客數,就可以減少響應時間


性能測試報告

生成測試報告命令:

結合生成的測試報告我們可以得知一共902個請求,全部通過,沒有錯誤,說明該系統在高并發環境下可以運行

測試報告給出的響應時間也符合我們的猜測,列表頁響應時間長


測試總結

本次測試,按照功能測試,自動化測試,性能測試方面對博客系統進行了測試,全部通過


結束語

博客系統測試報告結束

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/94256.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/94256.shtml
英文地址,請注明出處:http://en.pswp.cn/web/94256.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Oracle:配置讓插入語句時id自動輸入

Oracle:配置讓插入語句時id自動輸入無需手動指定,核心是利用 序列(Sequence) 或 自增列(Identity Column) 來自動生成唯一值。以下是兩種常用方案:方案 1:使用序列(Sequence&#xf…

秒殺服務的回調方案

在秒殺場景中,用戶點擊“搶購”后,后端需要通過異步處理應對高并發(避免請求阻塞),同時需通過實時回調機制將最終結果(成功/失敗)推送給客戶端并展示。核心方案是:“前端發起請求→后…

php apache無法接收到Authorization header

Apache 默認不傳遞 Authorization頭到后端環境(如 PHP)。其表現是:print_r($_SERVER)時, 沒有 [Authorization] :Array ([Accept-Language] > zh,en;q0.9,zh-CN;q0.8,en-US;q0.7[Accept-Encoding] > gzip, defla…

當我們想用GPU(nlp模型篇)

在個人設備上“把 GPU 真正用起來”做 NLP,分五步:準備 → 安裝 → 驗證 → 訓練/推理 → 踩坑排查。下面每一步都給出可復制命令和常見錯誤。 ────────────────── 1. 硬件準備 ? 一張 NVIDIA GPU,算力 ≥ 6.1&#xff08…

CryptSIPVerifyIndirectData函數分析

可以使用此函數從SIP接口對應的文件中提取簽名信息 CryptSIPVerifyIndirectData:將當前文件的哈希結果做為“指紋”,并與從CryptSIPGetSignedDataMsg中提取的簽名信息進行比較。 如果哈希結果相同,則意味著當前文件與之前簽名的文件相同&…

20250823解決榮品RD-RK3588-MID開發板在充電的時候大概每10s屏幕會像水波紋閃爍一下

20250823解決榮品RD-RK3588-MID開發板在充電的時候大概每10s屏幕會像水波紋閃爍一下 2025/8/23 17:58【結論】:使用直流電源供電,給電池【快速】充電,但是直流電源的電壓穩定,電流抖動導致的!那個是2.4G 已經知道了我司…

CANN安裝

前提條件 請參考本文檔正確安裝和使用CANN軟件,不建議將CANN安裝在共享磁盤后,通過掛載的方式使用CANN,因為CANN對文件系統有文件鎖的依賴,部分共享存儲不支持文件鎖,可能導致任務拉起失敗。 root用戶和非root用戶安裝CANN軟件包的步驟一致,當前示例步驟以非root用戶為例…

docker的基礎配置

目錄 數據卷 數據卷容器 端口映射與容器互聯 互聯機制實現便捷互訪(基于容器搭建論壇) 數據卷 1.創建數據卷 [rootopenEuler-1 /]# docker volume create test test [rootopenEuler-1 /]# docker volume ls DRIVER VOLUME NAME local test [ro…

VSCode Import Cost:5 分鐘學會依賴瘦身

一句話作用:在代碼里 import 時,實時顯示包大小,幫你一眼揪出體積炸彈。1?? 30 秒安裝 & 啟動 打開 VSCode → 擴展商店搜索 Import Cost → 安裝重啟 VSCode,立即生效,零配置。2?? 使用方式(開箱即…

TCP/UDP詳解(一)

UDP報文源端口16bit 目的端口16bit校驗和checksum16bit 總長度16bit--------------------------------------------------------------------------------------------------------------------------源目端口用于標識應用層協議,分為知名端口&#x…

數據庫優化提速(一)之進銷存庫存管理—仙盟創夢IDE

從存儲過程到通用 SQL:進銷存系統的數據操作優化在進銷存系統的開發與維護中,數據庫查詢語句的編寫方式對系統的性能、兼容性和可維護性有著深遠影響。本文將圍繞給定的三段 SQL 代碼展開,深入探討將存儲過程轉換為通用 SQL 在進銷存場景下的…

Redis面試精講 Day 28:Redis云原生部署與Kubernetes集成

【Redis面試精講 Day 28】Redis云原生部署與Kubernetes集成 在當今微服務與容器化浪潮中,Redis作為高性能緩存和消息中間件,已從單機部署逐步演進為云原生環境下的核心組件。Day 28 聚焦“Redis云原生部署與Kubernetes集成”,深入解析如何在…

leetcode刷題記錄03——top100題里的6道簡單+1道中等題

leetcode刷題記錄03——top100題里的6道簡單1道中等題上一篇博客: leetcode刷題記錄01——top100題里的7道簡單題 leetcode刷題記錄02——top100題里的7道簡單題 有效的括號 看懂需要用棧了,但是不知道怎么去寫,看了題解mark下正確答案。 cla…

求單位球內滿足邊界條件 u = z3 的調和函數

問題 6:在區域 {x2y2z2≤1}\{x^{2}y^{2}z^{2}\leq 1\}{x2y2z2≤1} 內找到一個調和函數 uuu,使得在邊界 x2y2z21x^{2}y^{2}z^{2}1x2y2z21 上,uuu 等于 gz3gz^{3}gz3。 提示:根據第8.1節,解必須是一個三次調和多項式&…

AAA 服務器與 RADIUS 協議筆記

一、AAA 服務器概述1. 核心定義AAA 是認證(Authentication)、授權(Authorization)和計費(Accounting) 的簡稱,是網絡安全領域中實現訪問控制的核心安全管理機制,通過整合三種服務確保…

Vue3源碼reactivity響應式篇之數組代理的方法

概覽 vue3中對于普通的代理包含對象和數組兩類,對于數組的方法是重寫了許多方法,具體實現參見packages\reactivity\src\arrayInstrumentations.ts arrayInstrumentations實際上就是一個對象,對象的屬性就是數組的方法,屬性值就是重…

如何玩轉K8s:從入門到實戰

一、K8S介紹及部署 1 應用的部署方式演變 部署應用程序的方式上,主要經歷了三個階段: 傳統部署:互聯網早期,會直接將應用程序部署在物理機上 優點:簡單,不需要其它技術的參與 缺點:不能為應用…

綜合測驗:配置主dns,dhcp,虛擬主機,nfs文件共享等

綜合實驗(所有設備關閉防火墻和selinux)在appsrv上部署主dns,為example.com提供域名解析 安裝bind bind-chroot rootappsrv ~]# yum install bind bind-chroot -y編輯主配置文件,全局配置文件,正向解析文件 [rootappsrv ~]# vim /etc/named.c…

MySQL數據庫管理與索引優化全攻略

一、表管理1.建庫語法:create database if not exists 數據庫名;命名規則:僅可使用數字、字母、下劃線、不能純數字;區分字母大小寫;具有唯一性;不可使用MySQL命令或特殊字符。相關命令:show databases; …

基于大模型構建 Java 混淆的方式方法(從入門到精通 · 含開源實踐)

1. 目標與威脅模型:你到底想防什么? 把“混淆”當作成本疊加器:讓逆向者付出更多時間與技能,而不影響用戶體驗與可維護性。可用 Collberg 等提出的四指標來權衡:有效性/韌性/隱蔽性/成本(potency/resilience/stealth/cost)。近年的研究也在重審這些評估方法,建議結合可…