大眾博客系統測試報告【改】

?一、項目背景


大眾博客系統采用前后端分離的方法來實現,同時使用了數據庫來存儲相關的數據,同時將其部署到云服務器上。前端主要有四個頁面構成:登錄頁、列表頁、詳情頁以及編輯頁,以上模擬實現了最簡單的大眾博客系統。其結合后端實現了以下的主要功能:登錄、編輯博客、注銷、刪除博客、以及強制登錄等功能。
但是該項目沒有設計用戶注冊功能,只能提前在數據庫中存儲用戶信息后經過校驗登錄;并且用戶頭像不能自己設定,在進行前端頁面的書寫過程中已經將頭像的圖片寫為靜態了;而用戶信息中的文章數以及分類數也沒有在后端中具體實現,直接在前端頁面中寫為了靜態的。
該個人博客系統可以實現個人用戶簡單的博客記錄,時間、標題、內容以及發布者等都可以進行詳細地查看。


二、項目功能

一功能介紹


該大眾博客系統主要實現了以下幾個功能:登錄,寫博客以及用戶管理等功能。

登錄功能:用戶名以及密碼已經在后端寫入了數據庫,沒有實現賬戶注冊功能,即:用戶名以及密碼是已經存在的。登錄成功后就會跳轉到列表頁面。在右上角存在主頁和寫博客兩個按鈕,但是在未登錄情況下按下均只會跳轉到登錄頁面。
列表頁面:可以在列表頁查看有限數量的博客簡介,其包括博客標題、發布時間以及內容概要。在左側可以看到登錄的用戶以及文章數、分類數等的模塊。在右上角有主頁、寫博客和注銷三個功能:主頁即列表頁,寫博客即博客編輯頁,注銷即注銷用戶,回到登錄頁面。
詳情頁面:在列表頁面點擊“查看全文”按鈕就會跳轉到詳情頁,此時就可以看到該篇博客的完整內容。在右上角同樣有主頁、寫博客、刪除和注銷四個功能:刪除即刪除該篇博客,刪除之后就會跳轉到列表頁面,該篇博客就被成功刪除。
寫博客:在登錄之后的任意界面點擊“寫博客”之后就會進入博客編輯頁面,此時就可以進行博客的編寫,點擊“發布文章”后就可以成功發布文章,此時就會跳轉到列表頁。

二相關源碼

 @Order(3)@Testvoid EditBlog() throws InterruptedException {EdgeOptions options = new EdgeOptions();options.addArguments("--remote-allow-origins=*");EdgeDriver driver = new EdgeDriver(options);driver.get("http://62.234.43.231:7551/blog_add.html");driver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);driver.findElement(By.xpath(" body > div.nav > a:nth-child(5)")).click();//輸入框輸入標題((JavascriptExecutor)driver).executeScript("document.getElementById(\"title\").value=\"自動化測試\"");sleep(3000);driver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click();sleep(3000);//獲取urlString cur_url = driver.getCurrentUrl();Assertions.assertEquals("http://62.234.43.231:7551/blog_list.html",cur_url);


三、測試計劃操作


一功能測試


1測試用例:

實際執行測試的部分操作步驟/截圖
1正常登錄:

2寫博客測試

3發布成功并查看詳情頁

4博客用戶管理進行查詢

5博客用戶管理進行添加

6博客用戶管理進行刪除

6博客用戶管理進行修改

二?自動化測試

代碼編寫
根據腦圖進行測試用例的編寫:每個頁面一個測試類,然后再各個測試類中進行測試用例的編寫。
注意公共屬性需要單獨放一個類,方便進行代碼復用。
使用測試套件便于運行以及修改。
創建啟動以及現場截圖就是會頻繁進行復用,所以單獨創建一個類進行存儲。
注意添加隱式等待,為了確保頁面正確加載顯示。
1. 添加相關依賴pom.xml

<dependencies>
<!-- ? ? ? ?添加selenium依賴--><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.0.0</version></dependency><!-- ? ? ? ?保存屏幕截圖需要用到的包--><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency><!-- ? ? ? ?添加junit5依賴--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.8.2</version><scope>test</scope></dependency><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite</artifactId><version>1.8.2</version><scope>test</scope></dependency></dependencies>29


2. 新建包并在包下創建測試類以及公共類
以下是所建立的是common公共包和Tests測試包:


1)公共類AutoTestUtils
創建驅動、保存現場截圖
注意:在保存現場截圖的時候命名是按時間來進行文件夾的劃分,然后圖片的名稱要體現出測試類的類名,方便進行問題的追溯。
注意文件名的動態獲取,注意時間格式的設置。
注意:可以在創建驅動的時候修改默認的有頭模式or無頭模式
2)登錄頁面測試BlogLoginTest
① 創建驅動,并打開頁面
② 測試頁面是否正常打開
③ 測試正常登錄:多參數測試
④ 測試異常登錄:用戶名/密碼錯誤的情況(此處不測null)
⑤ 注意測試的順序,使用Order注解指定,否則可能會因為執行順序不對導致測試失敗
⑥ 注意清空內容后才能再次輸入用戶名以及密碼

3)列表頁測試BlogListTest
① 測試博客列表頁是否可以正常打開
② 測試列表頁的“查看全文”按鈕是否可以正常跳轉
③ 測試未登錄的直接鏈接是否會跳轉到登錄頁面,順便測試了“注銷”按鈕
④ 同樣注意執行順序

4)編輯頁測試BlogEditTest
① 測試編輯頁是否可以正確打開
② 測試博客是否可以正常發布:元素齊全 or 部分元素
③ 測試“寫博客”按鈕是否可以正常使用
④ 執行順序

5)詳情頁測試BlogDetailTest
① 測試詳情頁的正確打開:有blogId和沒有blogId兩種情況
② 測試“刪除”按鈕是否可用,注意比較的是時間,因為標題可能會存在為空的情況
③ 執行順序
④ 一定要注意導航回到列表頁的操作

6)驅動釋放DriverQuiteTest
因為驅動的測試是要在最后一個測試類完成之后進行釋放的,如果是使用@AfterAll注解,那么每次修改測試類的時候都會需要挪動驅動釋放的位置,所以直接新建一個類作為驅動釋放,此時只需要在測試套件中放到最后就行。

7)測試套件runSuite
測試套件的運行,使用的是以測試類作為執行順序的方式

三 性能測試

使用loadrunner進行簡單性能測試:針對登錄、編寫并發布博客以及刪除博客、注銷等功能進行簡單的性能測試。
然后在實現的過程中,插入集合點以及事務等,并通過設置來實現用戶的并發操作。

錄制腳本

登錄測試

通過開發者工具查看請求發送的格式,以此來進行性能測試腳本的編寫。發現:用戶名以及密碼是使用form表單的形式來進行發送的。因為用戶名以及密碼可以有多個,所以可以進行參數化。

添加事務以及集合點、檢查點:注意檢查點一般放在請求之前。

設置迭代次數:為了能夠更好地遍歷到所有的參數,一定要進行保存。

參數化

檢查點:一定注意函數只放在要檢查的URL前面,不要隨便再往前面放置。(即:只放在需求之前)相關源碼

Action()
{web_custom_request("crx_game_2.html", "URL=http://browser.360.cn/se/config/crx_game_2.html", "Method=GET", "Resource=0", "RecContentType=text/html", "Referer=", "Snapshot=t4.inf", "Mode=HTML", EXTRARES, "Url=http://62.234.43.231:7551/css/conmmon.css", "Referer=http://62.234.43.231:7551/login.html", ENDITEM, "Url=http://62.234.43.231:7551/css/login.css", "Referer=http://62.234.43.231:7551/login.html", ENDITEM, "Url=http://62.234.43.231:7551/js/jquery.min.js", "Referer=http://62.234.43.231:7551/login.html", ENDITEM, "Url=http://62.234.43.231:7551/img/logo2.jpg", "Referer=http://62.234.43.231:7551/login.html", ENDITEM, "Url=http://62.234.43.231:7551/img/cat.jpg", "Referer=http://62.234.43.231:7551/css/conmmon.css", ENDITEM, "Url=http://62.234.43.231:7551/login.html", "Referer=http://62.234.43.231:7551/login.html", ENDITEM, "Url=http://cseupdate.360safe.com/safe/safe.cab", "Referer=", ENDITEM, "Url=http://cseupdate.360safe.com/formal/360chrome.cab?ver=13.5.2044.0&mid=4f3c60c60fbd8d385ef600e811f8f6f5&guid=4f3c60c60fbd8d385ef600e811f8f6f5&pid=360CE&db=1&sbox=0&ceip=1&usei=0&usei9=0&usew=0&skin=&safe=0&setc=&to=4", "Referer=", ENDITEM, LAST);//集合點lr_rendezvous("Rendezvous");//事務lr_start_transaction("login_transaction");lr_think_time(9);web_submit_data("info", "Action=http://cloud.browser.360.cn/site/info", "Method=POST", "EncType=multipart/form-data", "RecContentType=text/plain", "Referer=", "Snapshot=t5.inf", "Mode=HTML", ITEMDATA, "Name=rn", "Value=814537", ENDITEM, "Name=sitedata", "Value=631302071d050b051a0100190a02050f0b020b081b176e", ENDITEM, LAST);//檢查點
web_reg_find("Text=admin",LAST);web_submit_data("login", "Action=http://62.234.43.231:7551/user/login", "Method=POST", "RecContentType=application/json", "Referer=http://62.234.43.231:7551/login.html", "Snapshot=t6.inf", "Mode=HTML", ITEMDATA, "Name=username", "Value={username}", ENDITEM, "Name=password", "Value={password}", ENDITEM, LAST);web_submit_data("info_2", "Action=http://cloud.browser.360.cn/site/info", "Method=POST", "EncType=multipart/form-data", "RecContentType=text/plain", "Referer=", "Snapshot=t7.inf", "Mode=HTML", ITEMDATA, "Name=rn", "Value=680672", ENDITEM, "Name=sitedata", "Value=6d1a0104001c061600180608070808061865535a645942404517126b", ENDITEM, LAST);web_url("myblog_list.html", "URL=http://62.234.43.231:7551/myblog_list.html", "Resource=0", "RecContentType=text/html", "Referer=http://62.234.43.231:7551/login.html", "Snapshot=t8.inf", "Mode=HTML", LAST);web_submit_data("info_3", "Action=http://cloud.browser.360.cn/site/info", "Method=POST", "EncType=multipart/form-data", "RecContentType=text/plain", "Referer=", "Snapshot=t9.inf", "Mode=HTML", ITEMDATA, "Name=rn", "Value=501298", ENDITEM, "Name=sitedata", "Value=6e12000b0b160406091c0c0e1b010b030900051f46575b4c5a4543411b65", ENDITEM, LAST);web_submit_data("info_4", "Action=http://cloud.browser.360.cn/site/info", "Method=POST", "EncType=multipart/form-data", "RecContentType=text/plain", "Referer=", "Snapshot=t10.inf", "Mode=HTML", ITEMDATA, "Name=rn", "Value=859621", ENDITEM, "Name=sitedata", "Value=6317080f001f090301180707160403070209081a5a515b1c5a5c571945545456565b571f48591b6b", ENDITEM, LAST);web_custom_request("mylist", "URL=http://62.234.43.231:7551/art/mylist", "Method=POST", "Resource=0", "RecContentType=application/json", "Referer=http://62.234.43.231:7551/myblog_list.html", "Snapshot=t11.inf", "Mode=HTML", "EncType=", LAST);web_custom_request("showinfo", "URL=http://62.234.43.231:7551/user/showinfo", "Method=POST", "Resource=0", "RecContentType=application/json", "Referer=http://62.234.43.231:7551/myblog_list.html", "Snapshot=t12.inf", "Mode=HTML", "EncType=", LAST);lr_end_transaction("login_transaction",LR_AUTO);return 0;
}

腳本測試通過

同時測試2個用戶并顯示日志

設置并發數量進行性能測試,并導出測試報告以及圖表
1)設置2個虛擬用戶,防止電腦崩潰

2)在Controller中設置場景

3)開始進行運行,性能測試開始(運行中+結束截圖)

4)在Analysis中查看性能報告以及報表
① 報告

② 點擊率和吞吐量分析圖

③ 事務響應量

5)分析系統資源
① 剩余的物理內存近80%,即使用了近40%的內存,對于簡單的登錄功能來說還是較高的內存使用,還有內存優化的空間。
② 當點擊率較大時CPU使用也是達到了一個較高的點,CPU利用率較高。
③ 總之,該性能還有優化的空間。

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

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

相關文章

Tars-GO 開發

默認環境是安裝好的 創建服務: tarsgo make App Server Servant GoModuleName Tars 實例的名稱&#xff0c;有三個層級&#xff0c;分別是 App&#xff08;應用&#xff09;、Server&#xff08;服務&#xff09;、Servant&#xff08;服務者&#xff0c;有時也稱 Object&am…

LeetCode Hot100 74.搜索二維矩陣

題目&#xff1a; 給你一個滿足下述兩條屬性的 m x n 整數矩陣&#xff1a; 每行中的整數從左到右按非嚴格遞增順序排列。每行的第一個整數大于前一行的最后一個整數。 給你一個整數 target &#xff0c;如果 target 在矩陣中&#xff0c;返回 true &#xff1b;否則&#x…

數據結構——堆的實現

堆的實現-----C語言版 目錄&#xff1a;一、堆的實現1.1堆的定義1.2堆的實現1.2.1堆的各個接口1.2.2堆的向上調整1.2.3堆的向下調整1.2.4堆的定義聲明和初始化1.2.5堆的數據處理1.2.6堆的判空和堆的數據個數以及堆銷毀1.2.7堆的代碼實現 二、TOP—K問題 目錄&#xff1a; 一、…

C++ 文件和流、異常處理、動態內存、預處理器

一、C文件和流&#xff1a; 在C中進行文件處理&#xff0c;需要包含頭文件<iostream>和<fstream>。fstream標準庫定義的三個新的數據類型&#xff1a; 數據類型 描述 ofstream 該數據類型表示輸出文件流&#xff0c;用于創建文件并向文件寫入信息。 ifstream …

vscode項目推送到git

1、打開項目文件 打開文件后點擊vs code左側工具欄中第三個源代碼管理圖標&#xff0c;點擊初始化倉庫&#xff0c;此時會創建一個本地倉庫會檢查該項目中的文件變更 2、創建遠程倉庫 點擊克隆/下載&#xff0c;復制HTTPS地址 3、添加遠程地址 1&#xff09;圖形化操作 2…

Leetcode刷題之用隊列實現棧(C語言版)

Leetcode刷題之用隊列實現棧&#xff08;C語言版&#xff09; 一、題目描述二、題目要求三、題目示例四、題目解析Ⅰ、MyStack* myStackCreateⅡ、void myStackPush(MyStack* obj, int x)Ⅲ、int myStackPop(MyStack* obj)Ⅳ、int myStackTop(MyStack* obj)Ⅴ、bool myStackEmp…

文件夾重命名:徹底擺脫數字困擾,批量修改文件夾名去除數字

在日常生活和工作中&#xff0c;經常會遇到需要修改文件夾名稱的情況。有時候是因為文件夾名稱中包含了數字&#xff0c;有時候是因為文件夾名稱不符合規范。無論出于什么原因&#xff0c;修改文件夾名稱都是一件非常繁瑣的事情。尤其是需要修改大量文件夾名稱時&#xff0c;手…

Jenkins 整合 Docker 自動化部署

Docker 安裝 Jenkins 配置自動化部署 1. Docker 安裝 Jenkins 1.1 拉取鏡像文件 docker pull jenkins/jenkins1.2 創建掛載文件目錄 mkdir -p $HOME/jenkins_home1.3 啟動容器 docker run -d -p 8080:8080 -v $HOME/jenkins_home:/var/jenkins_home --name jenkins jenkin…

CentOS rpm安裝Nginx和配置

CentOS rpm安裝Nginx和配置 官方下載地址: http://nginx.org/en/download.html 介紹 Nginx(“engine x”)是一款由俄羅斯的程序設計師Igor Sysoev所開發高性能的 Web和 反向代理 服務器&#xff0c;也是一個 IMAP/POP3/SMTP 代理服務器。 rpm包安裝 #安裝nginx&#xff0c…

k8s部署的java服務查看連接nacos緩存的配置文件

一、問題描述 k8s部署的java服務&#xff0c;使用nacos中的配置文件&#xff0c;需要在緩存中查看該服務具體是使用到了哪些配置文件 二、解決 參考文檔: https://nacos.io/zh-cn/docs/system-configurations.html 文檔描述如下: 進入java服務容器進入用戶目錄下的nacos&a…

4-Docker命令之docker version

1.docker version介紹 docker version命令是用于查看docker容器的版本信息 2.docker version用法 docker version [參數] [root@centos79 ~]# docker version --helpUsage: docker version [OPTIONS]Show the Docker version informationOptions:-f, --format string Fo…

Android 12.0 mt6771新增分區功能實現四

1.前言 在12.0的系統rom開發中,在對某些特殊模塊中關于數據的存儲方面等需要新增分區來保存, 所以就需要在系統分區新增分區,接下來就來實現這個功能,看第四部分的新增分區的實現過程 2.mt6771新增分區功能實現四的核心類 device/mediatek/mt6771/ueventd.mt6771.rcdevice…

Java枚舉詳解

一、什么是枚舉類型 枚舉類型是一種特殊的數據類型&#xff0c;用于定義一組固定的命名常量。枚舉類型提供了一種更強大、更安全和更易讀的方式來表示一組相關的常量。 在Java中&#xff0c;枚舉類型是通過使用enum關鍵字來定義的。枚舉類型可以包含一個或多個枚舉常量&#xf…

常見狀態碼總結

常見狀態碼總結 2xx 200 OK&#xff1a;表示服務器成功處理了客戶端的請求&#xff0c;并返回所請求的數據。這是最常見的狀態碼&#xff0c;表示一切正常。201 Created&#xff1a;表示服務器成功處理了客戶端的 POST 請求&#xff0c;并在服務器上創建了新的資源。204 No C…

vue005——vue組件入門(非單文件組件和單文件組件)

一、非單文件組件 1.1、單文件組件的使用 1.1.1、局部注冊 1、第一步&#xff1a;創建school組件 2、第二步&#xff1a;注冊組件&#xff08;局部注冊&#xff09; 3、第三步&#xff1a;使用組件&#xff08;編寫組件標簽&#xff09; <!DOCTYPE html> <html>…

設計模式—里氏替換原則

1.概念 里氏代換原則(Liskov Substitution Principle LSP)面向對象設計的基本原則之一。 里氏代換原則中說&#xff0c;任何基類可以出現的地方&#xff0c;子類一定可以出現。 LSP是繼承復用的基石&#xff0c;只有當衍生類可以替換掉基類&#xff0c;軟件單位的功能不受到影…

Spring注解方式整合第三方框架

目錄 Spring整合MyBatis 原有xml方式整合配置如下 注解方式&#xff1a; Import可以導入如下三種類 第三方框架是指由其他開發者或團隊開發的軟件模塊或庫&#xff0c;供開發者在自己的應用程序中使用。這些框架通常提供了一系列已經封裝好的功能或工具&#xff0c;可節省開…

使用flask返回json格式的數據

Flask Flask是一個使用Python編寫的輕量級Web框架&#xff0c;它的設計理念是保持簡單、靈活和易擴展。它的核心是Werkzeug和Jinja2&#xff0c;并且它本身只提供了非常基礎的Web框架功能&#xff0c;例如路由和請求處理等。 使用Flask可以快速創建一個Web應用程序&#xff0c;…

跳躍游戲Ⅱ[中等]

優質博文&#xff1a;IT-BLOG-CN 一、題目 給定一個長度為n的0索引整數數組nums。初始位置為nums[0]。每個元素nums[i]表示從索引i向前跳轉的最大長度。換句話說&#xff0c;如果你在nums[i]處&#xff0c;你可以跳轉到任意nums[i j]處: 0 < j < nums[i] i j < n …

【Python 訓練營】N_8 打印阿姆斯特朗數

題目 輸入一個數&#xff0c;判斷是否為阿姆斯特朗數&#xff0c;阿姆斯特朗數指一個n位正整數等于其各位數字的n次方之和。其中n為3時是水仙花數。 分析 利用循環&#xff0c;獲取數的長度&#xff0c;根據長度和定義&#xff0c;拆分出來運算 答案 while True:n int(in…