1、項目背景與測試目標
-
系統定位
論壇系統作為典型的高并發Web應用,需支持用戶注冊、登錄、發帖、評論、私信及個人中心管理等核心功能,是用戶公開交流與信息共享的核心平臺。其穩定性與響應效率直接影響用戶體驗及平臺活躍度。 -
測試必要性
- 功能可靠性:用戶高頻操作(如發帖、回復)需保證流程完整性與數據一致性,避免因功能缺陷導致信息丟失或操作中斷。
- 性能瓶頸:高并發場景下(如熱門板塊訪問),系統需維持低延遲響應(平均<2秒),并確保資源利用率合理(CPU/內存無溢出)。
- 用戶體驗:界面易用性、跨瀏覽器兼容性及錯誤處理機制是用戶留存的關鍵因素。
2、技術架構與測試挑戰
-
系統架構特點
- 后端:Spring Boot + MyBatis + MySQL集群(主從復制+讀寫分離)。
- 前端:Bootstrap響應式設計,依賴多瀏覽器兼容。
- 部署:Nginx負載均衡分發請求至多臺應用服務器。
-
測試核心挑戰
- 場景復雜度:需覆蓋用戶從注冊到互動的完整路徑(正向/逆向操作)。
- 環境依賴:真實模擬高并發(>1000用戶)及多終端(Chrome/Edge/Firefox)場景。
- 缺陷隱蔽性:界面邏輯錯誤(如未提示注冊成功)及性能瓶頸(搜索功能無響應)需深度遍歷才能暴露。
3、核心功能模塊與質量要求
模塊 | 功能場景 | 質量風險 |
---|---|---|
用戶注冊 | 信息校驗、協議勾選、重復賬號檢測 | 用戶信息入庫失敗、錯誤提示缺失 |
用戶登錄 | 憑證驗證、空輸入處理、錯誤反饋 | 安全漏洞(暴力破解)、跳轉邏輯錯誤 |
帖子交互 | 發帖/回復/私信、內容持久化 | 數據丟失、頁面加載超時、權限控制失效 |
個人中心 | 信息修改、歷史記錄查看 | 數據更新延遲、頁面元素加載不全 |
4、測試目標與質量指標
- 功能覆蓋:
- 自動化腳本覆蓋核心鏈路(注冊→登錄→發帖→退出)通過率100%。
- 缺陷修復率100%(含界面提示缺失、功能無響應等)。
- 兼容性要求:
- 支持Chrome 134+、Edge 131+、Firefox 131+等主流瀏覽器。
5、測試內容
登陸界面
,
注冊界面
6、測試代碼
6.1 自動化測試腳本詳解
import os.path
from datetime import datetimeimport webdriver_manager.drivers.chrome
from requests import options
from selenium import webdriver
from selenium.webdriver.ie.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.maximize_window()#屏幕截圖def getscreenshot(self):diam = datetime.now().strftime("%Y-%m-%d")if not os.path.exists("../images/"+diam):os.mkdir("../images/"+diam)#設置圖片的名稱格式fliename = datetime.now().strftime("%Y-%m-%d-%H%M%S")+".png"self.driver.save_screenshot("../images/"+diam+"/"+fliename)forum = Driver()
核心功能
-
初始化瀏覽器
- 通過
webdriver_manager
自動下載并管理最新版Chrome驅動(無需手動安裝驅動)。 - 啟動瀏覽器時自動最大化窗口(
maximize_window()
)。 - 示例:
forum = Driver()
會立刻打開一個全屏Chrome窗口。
- 通過
-
智能截圖保存
- 調用
getscreenshot()
時,會按日期生成文件夾(如../images/2025-06-13/
)。 - 截圖文件名包含精確時間(如
2025-06-13-143022.png
),避免重復。 - 示例:
forum.getscreenshot()
會保存當前瀏覽器頁面到指定路徑。
- 調用
代碼關鍵點
# 自動安裝Chrome驅動并啟動瀏覽器
self.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), # 自動管理驅動options=options
)
# 按日期分類保存截圖
diam = datetime.now().strftime("%Y-%m-%d") # 當前日期作為文件夾名
fliename = datetime.now().strftime("%Y-%m-%d-%H%M%S") + ".png" # 時間戳作為文件名
self.driver.save_screenshot("../images/"+diam+"/"+fliename)
設計意圖
- 復用瀏覽器對象:通過
Driver
類封裝初始化邏輯,避免重復創建瀏覽器實例。 - 自動化文件管理:日期文件夾 + 時間戳文件名,確保截圖有序存儲。
- 簡化依賴:
webdriver_manager
自動處理驅動下載,提升代碼可移植性。
實際應用場景
- 自動化測試:在測試用例執行失敗時自動截圖存檔。
- 網頁監控:定時對特定頁面截圖,用于內容變更追蹤。
- 爬蟲調試:在數據抓取過程中保存頁面快照,便于排查問題。
? 總結:這段代碼是瀏覽器自動化+智能截圖工具,適合需要反復操作瀏覽器并記錄結果的場景(如測試、爬蟲)。通過封裝常用操作,大幅簡化了代碼復雜度。
6.2 登錄功能自動化測試腳本詳解
這個代碼是一個自動化測試腳本,用于測試一個論壇的登錄功能。我來用簡單易懂的方式解釋一下它的工作原理和設計思路:
核心功能概述
這是一個登錄頁面的自動化測試工具:
- 可以模擬用戶輸入不同組合的用戶名和密碼
- 測試登錄功能的正常情況和各種異常情況
- 自動截屏記錄每次測試的結果
- 自動驗證系統反饋信息是否正確
代碼結構解析
1. 初始化設置 (__init__
方法)
def __init__(self):self.url = "http://127.0.0.1:9580/sign-in.html" # 登錄頁面地址self.driver = forum.driver # 使用共享的瀏覽器實例self.driver.get(self.url) # 打開登錄頁面
2. 正常登錄測試 (normalTest
方法)
def normalTest(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("Test1")self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("1234")# 點擊登錄按鈕self.driver.find_element(By.CSS_SELECTOR,"#submit").click()time.sleep(2)# 驗證登錄成功(檢查用戶名顯示區域)self.driver.find_element(By.CSS_SELECTOR, "header中的用戶名字段選擇器")# 截屏保存self.driver.maximize_window()forum.getscreenshot()
3. 異常登錄測試 (abnormalTest
方法)
這個測試方法模擬了5種不同的錯誤登錄情況:
-
錯誤用戶名 + 錯誤密碼
# 輸入錯誤憑據 self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("Test11") self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123") # 點擊登錄 # 驗證警告信息:assert adim == "警告"
-
錯誤用戶名 + 正確密碼
# 輸入錯誤用戶名 self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("Test11") self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("1234") # 點擊登錄 # 驗證警告信息:assert adim == "警告"
-
正確用戶名 + 錯誤密碼
# 輸入錯誤密碼 self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("Test1") self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123") # 點擊登錄 # 驗證警告信息:assert adim == "警告"
-
只輸入密碼,不輸入用戶名
# 只輸入密碼 self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123") # 點擊登錄 # 驗證提示信息:assert adim == "用戶名不能為空"
-
只輸入用戶名,不輸入密碼
# 只輸入用戶名 self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("Test1") # 點擊登錄 # 驗證提示信息:assert adim == "密碼不能為空"
每個測試步驟都會進行頁面截屏保存
如何使用
# 創建測試對象
login = forumlogin()# 運行正常登錄測試
login.normalTest()# 運行異常登錄測試(當前被注釋)
# login.abnormalTest()
6.3 注冊功能自動化測試腳本詳解
測試腳本核心功能
-
注冊頁面測試
- 測試正常注冊流程(用戶名、昵稱、密碼輸入正確)
- 測試4種異常注冊場景(關鍵字段缺失或協議未同意)
-
自動化操作
- 自動填充表單字段
- 自動點擊注冊按鈕
- 智能驗證操作結果
- 自動截屏保存測試證據
代碼結構解析
class signUp: # 注冊測試主類def __init__(self): # 初始化self.url = "http://127.0.0.1:9580/sign-up.html" # 注冊頁面地址self.driver = forum.driver # 復用瀏覽器實例self.driver.get(self.url) # 打開注冊頁面
1. 正常注冊測試 (snormal
)
def snormal(self):# 清空輸入框 → 填寫完整信息 → 勾選協議 → 點擊注冊# 驗證是否跳轉到登錄頁(通過檢測登錄頁元素)# 自動截屏保存結果
2. 異常注冊測試 (failsign
)
測試了4種錯誤情況:
- 用戶名缺失
# 不填用戶名 → 驗證提示"用戶名不能為空"
- 協議未勾選
# 填寫信息但取消勾選 → 驗證停留在注冊頁
- 昵稱缺失
# 不填昵稱 → 驗證提示"昵稱不能為空"
- 密碼缺失
# 不填密碼 → 驗證錯誤提示
驗證機制亮點
-
元素定位驗證
使用CSS選擇器精確檢測頁面元素:self.driver.find_element(By.CSS_SELECTOR,"#signUpForm > div > h2")
-
智能截屏
調用forum.getscreenshot()
自動按日期分類保存截圖:# 示例路徑:../images/2025-06-13/2025-06-13-143022.png
-
狀態檢測
對復選框進行智能判斷:if checkbox.is_selected(): # 檢測是否已勾選checkbox.click() # 取消勾選
執行方式
signUP = signUp() # 創建測試對象
# signUP.snormal() # 執行正常測試(當前被注釋)
signUP.failsign() # 執行異常測試
6.4 論壇首頁自動化測試腳本詳解
代碼功能解析
- 基礎結構
class fpega:driver = ""def __init__(self):self.driver = forum.driver
這段代碼創建了一個論壇首頁測試類,復用了之前初始化的瀏覽器對象,符合自動化測試的資源復用原則。
- 元素驗證方法
def fcheckelement(self):time.sleep(1) # 固定等待# 定位多個關鍵頁面元素self.driver.find_element(By.CSS_SELECTOR,"#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong")self.driver.find_element(By.CSS_SELECTOR,"#index_nav_nickname")... # 其他元素定位forum.getscreenshot() # 執行截圖
該方法實現了:
- 驗證首頁關鍵元素是否存在(文章標題、用戶昵稱、導航菜單等)
- 執行頁面截圖保存測試證據
測試執行流程
6.5 發布自動化此時腳本詳解
核心功能設計
-
頁面元素檢查 (
eCheck
方法)- 導航流程:首頁 → 點擊發帖按鈕 → 進入發帖頁面
- 驗證關鍵元素存在性:
- 板塊選擇下拉框(
#article_post_borad
) - 標題輸入框(
#article_post_title
) - 富文本編輯器(復雜 CSS 選擇器定位 CodeMirror 組件)
- 發布按鈕(
#article_post_submit
)
- 板塊選擇下拉框(
- 使用
time.sleep()
強制等待頁面加載(需優化)
-
功能測試 (
eFuncTest
方法)- 測試用例 1:正常發帖(當前被注釋)
# self.driver.find_element(By.CSS_SELECTOR,"#article_post_title").send_keys("測試帖子1") # ...(內容編輯被注釋因技術難點)
- 測試用例 2:標題為空提交
ActionChains(self.driver).move_to_element(element).click().perform() # 無標題點擊發布 text1 = self.driver.find_element(...).text # 捕獲錯誤提示 forum.getscreenshot() # 截圖存檔
- 測試用例 3:內容為空提交
self.driver.find_element(...).send_keys("測試帖子1") # 輸入標題 ActionChains(...).click().perform() # 提交 text2 = self.driver.find_element(...).text # 捕獲錯誤
- 測試用例 1:正常發帖(當前被注釋)
關鍵問題與優化建議
-
等待機制缺陷
- 現狀:全使用
time.sleep()
強制等待time.sleep(1) # 無條件等待1秒
- 風險:頁面加載快則浪費時間,加載慢則元素定位失敗
- 優化方案(三選一):
# 方案1:顯式等待(推薦) from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as ECWebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "article_post_submit")) ).click()# 方案2:隱式等待(全局設置) driver.implicitly_wait(5) # 在__init__中設置一次# 方案3:Fluent等待(復雜場景) wait = WebDriverWait(driver, 10, poll_frequency=1, ignored_exceptions=[TimeoutException]) wait.until(lambda d: d.find_element(By.ID, "article_post_submit"))
- 現狀:全使用
-
富文本編輯器交互問題
- 難點:CodeMirror 編輯器非標準 input 元素
# 當前無法操作: # edit-article > div.CodeMirror... > div > pre
- 解決方案:
# 通過JavaScript注入內容 js_script = "document.querySelector('div.CodeMirror').CodeMirror.setValue('自動化測試內容')" driver.execute_script(js_script)
- 難點:CodeMirror 編輯器非標準 input 元素
-
驗證機制強化
- 現狀:僅打印提示文本
print(text1) # 未做斷言驗證
- 優化方向:
assert "標題不能為空" in text1 # 添加斷言 assert "內容不能為空" in text2
- 現狀:僅打印提示文本
執行流程優化
graph TDA[初始化瀏覽器] --> B[eCheck 元素檢查]B --> C[導航至發帖頁]C --> D[驗證關鍵元素]D --> E[eFuncTest 功能測試]E --> F[用例1:正常發帖]E --> G[用例2:空標題提交]E --> H[用例3:空內容提交]H --> I[返回首頁]
測試用例擴展建議
- 邊界值測試:
# 超長標題測試(>255字符) long_title = "A"*256 driver.find_element(By.CSS_SELECTOR, "#article_post_title").send_keys(long_title)
- 特殊字符測試:
special_chars = "!@#$%^&*()_+" driver.find_element(...).send_keys(special_chars)
- 敏感詞過濾驗證:
driver.find_element(...).send_keys("違禁詞測試") assert "包含敏感詞" in error_text
最佳實踐總結
- 等待策略:優先使用 顯式等待 > 隱式等待 > 強制等待
- 元素定位:簡化 CSS 選擇器,優先用 ID/ClassName
- 異常處理:增加
try/except
捕獲NoSuchElementException
- 截圖管理:保留
forum.getscreenshot()
便于故障回溯 - 動作封裝:將
ActionChains
操作封裝為獨立方法
通過優化等待機制和增加斷言驗證,該腳本可顯著提升測試穩定性和驗證嚴謹性。建議優先解決富文本編輯器交互問題以解鎖完整功能測試能力。
6.6 啟動文件
from Test import entryTest
from Test import firstPega
from Test import postContent
from Test import editPage
from Test import privates
if __name__ =="main":#首先測試登錄失敗entryTest.forumlogin().abnormalTest()#然后登錄成功entryTest.forumlogin().normalTest()#進入首頁進行測試firstPega.fpega().fcheckelement()#進入博客詳情頁測試postContent.pContent().pCheck()postContent.pContent().pFunTest()#進入博客編輯頁面editPage.epega().eCheck()editPage.epega().eFuncTest()