【萌筆趣棋】網頁五子棋項目測試報告

目錄

一.項目介紹?

(一)項目簡介

(二)功能介紹

(三)頁面展示

1.注冊頁面

2.登錄頁面

3.游戲大廳頁面

4.游戲房間頁面(對戰)

二.功能測試

(一)出現的bug

?(二)解決方法

三.自動化測試

(一)測試用例設計

(二)測試準備

(三)編寫測試腳本

1.工具類

2.注冊功能

3.登錄測試

3.“游戲大廳”測試

4.“游戲房間”測試

5.驅動退出和測試套件類

(四)測試結果

四.性能測試

例子

五.總結

?

一.項目介紹?

若需要【萌筆趣棋】項目源碼可后臺私信

(一)項目簡介

“新醬愛玩的五子棋” 是一款以《蠟筆小新》春日部角色為主題背景的五子棋游戲。該游戲基于網頁端開發,通過簡潔易懂的界面設計,為玩家提供經典五子棋的對戰體驗,融合了趣味性與競技性,目標用戶主要為喜愛五子棋和《蠟筆小新》動漫的人群。

(二)功能介紹

  1. 注冊頁面:玩家可在此頁面輸入自定義的用戶名和密碼進行賬號注冊。系統會對輸入信息進行驗證,確保用戶名的唯一性等,成功注冊后可獲得在游戲中進行對戰的資格。
  2. 登錄頁面:已注冊玩家輸入正確的用戶名和密碼登錄游戲。登錄成功后,可進入游戲大廳開始游戲相關操作;若輸入錯誤,系統會提示重新輸入。
  3. 游戲大廳:玩家登錄后進入游戲大廳,可查看自己的游戲信息,包括用戶名、當前分數、比賽場次和獲勝場次等。點擊 “開始匹配” 按鈕,系統會自動為玩家尋找對戰對手,在匹配過程中可點擊取消匹配。
  4. 游戲房間:匹配成功后進入游戲房間,玩家和對手在此進行五子棋對戰。游戲界面會顯示棋盤,玩家按規則輪流落子。當一方率先在棋盤的橫線、豎線或斜線上形成連續的五個棋子時,判定為獲勝方,系統會顯示勝負結果,并更新玩家在游戲大廳中的相關數據(如分數、比賽場次、獲勝場次等) 。

(三)頁面展示

1.注冊頁面

2.登錄頁面

3.游戲大廳頁面

信息展示/開始匹配?

4.游戲房間頁面(對戰)

落子/回合切換

?勝負判定

二.功能測試

在此就不展示進行功能測試的截圖了,具體可以跳轉到(三)頁面展示

(一)出現的bug

1.在進行注冊功能時候,出現了用戶名或者密碼輸入為空,但是仍然注冊成功的情況

?(二)解決方法

1.在注冊頁面的前端代碼中加入如下攔截請求代碼:

   // 驗證用戶名和密碼是否為空if (!username.trim()||!password.trim()) {alert('用戶名或者密碼不能為空');return; // 阻止表單提交}

三.自動化測試

源碼:gobangAutoTest: 網頁版五子棋對戰——Web自動化測試

(一)測試用例設計

(二)測試準備

1.工具選擇:

使用Selenium 并配合Junit單元測試框架

2.搭建和配置環境:

2.1 創建Maven項目——gobangAutoTest

2.2 在pom.xml中引入相關依賴

    <dependencies><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><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.0.0</version></dependency><dependency><groupId>io.github.bonigarcia</groupId><artifactId>webdrivermanager</artifactId><version>5.9.0</version></dependency></dependencies>

2.3 包的模塊化設計:

(三)編寫測試腳本

1.工具類

public class AutotestUtils {public static EdgeDriver driver;/*** 創建驅動對象*/public static EdgeDriver createDriver() {if (driver == null) {WebDriverManager.edgedriver().setup();EdgeOptions options = new EdgeOptions();options.addArguments("--remote-allow-origins=*");// options.addArguments("-headless");driver = new EdgeDriver(options);//創建隱式等待driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));}return driver;}/*** 獲取時間戳*/public List<String> getTime() {SimpleDateFormat sim1 = new SimpleDateFormat("yyyyMMdd-HHmmssSS");SimpleDateFormat sim2 = new SimpleDateFormat("yyyyMMdd");String filename = sim1.format(System.currentTimeMillis());String dirname = sim2.format(System.currentTimeMillis());List<String> list = new ArrayList();list.add(dirname);list.add(filename);return list;}/*** 獲取屏幕截圖*/public void getScreenShot(String str) throws IOException {List<String> list = this.getTime();String filename = "./src/test/java/com/gobangAutoTest/" + list.get(0) + "/" + str + "_" + list.get(1) + ".png";File srcfile = (File)driver.getScreenshotAs(OutputType.FILE);FileUtils.copyFile(srcfile, new File(filename));}}

2.注冊功能

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class RegisterPageTest extends AutotestUtils {//1.驅動對象public static EdgeDriver driver = createDriver();/**訪問注冊頁面的URL*/@BeforeAllstatic void baseControl() {driver.get("http://127.0.0.1:8080/register.html");}/*** 檢查注冊頁面是否正常打開* 檢查點:注冊框標題 是否存在*/@Test@Order(1)void registerPageLoadRight() throws IOException {driver.findElement(By.cssSelector("body > div.login-container > div > h3"));getScreenShot(getClass().getName());}/*** 檢查正常注冊的情況,會出現彈窗:注冊成功!*/@ParameterizedTest@CsvSource({"na_na,123"})@Order(3)void registerSuc(String name,String password) throws InterruptedException, IOException {String expected = "注冊成功!";driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#username")).sendKeys(name);driver.findElement(By.cssSelector("#password")).sendKeys(password);driver.findElement(By.cssSelector("#submit")).click();//處理彈窗WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(3));wait.until(ExpectedConditions.alertIsPresent());Alert alert = driver.switchTo().alert();String accept = alert.getText();alert.accept();getScreenShot(getClass().getName());Assertions.assertEquals(expected,accept);}/*** 檢查異常注冊的情況:用戶名或者密碼為空* 會出現彈窗提示*/@ParameterizedTest@CsvSource({"oppop"})@Order(3)void registerFail(String name) throws InterruptedException, IOException {driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();String expected = "用戶名或者密碼不能為空!";driver.findElement(By.cssSelector("#username")).sendKeys(name);driver.findElement(By.cssSelector("#submit")).click();//處理彈窗WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(3));wait.until(ExpectedConditions.alertIsPresent());Alert alert = driver.switchTo().alert();String accept = alert.getText();alert.accept();getScreenShot(getClass().getName());Assertions.assertEquals(expected,accept);}}

3.登錄測試

//一個類注解,表明測試方法將按照@Order注解 指定執行順序
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class LoginPageTest extends AutotestUtils {//1.驅動對象public static EdgeDriver driver = createDriver();//被BeforeAll修飾的方法必須為靜態的,而靜態的方法內不能存取非靜態變量和非靜態方法//在當前測試類中所有測試方法執行之前只執行一次@BeforeAll/**訪問登錄頁面的URL*/static void baseControl() {driver.get("http://127.0.0.1:8080/login.html");}/**檢查登錄頁面是否正常打開檢查點:登錄按鈕 登錄框標題 是否存在*/@Test@Order(1)void loginPageLoadRight() throws IOException {driver.findElement(By.cssSelector("#submit"));driver.findElement(By.cssSelector("body > div.login-container > div > h3"));getScreenShot(getClass().getName());}/**檢查正常登錄的情況*/@ParameterizedTest//為參數化測試提供Csv格式的數據@CsvSource({"wukong,123","w_o.ogason,123"})@Order(2)void loginSuc(String name, String passwd) throws InterruptedException, IOException {//這三步只是登錄的步驟,能不能保證登錄是成功的呢?//clear 先清空driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#username")).sendKeys(name);driver.findElement(By.cssSelector("#password")).sendKeys(passwd);driver.findElement(By.cssSelector("#submit")).click();//處理“登錄成功的彈窗”WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(3));wait.until(ExpectedConditions.alertIsPresent());Alert alert = driver.switchTo().alert();alert.accept();//對登錄結果進行檢驗——跳轉到游戲大廳頁面才算是登錄成功//檢查“個人信息框”元素是否存在//driver.findElement(By.cssSelector("#screen"));//檢查“開始匹配按鈕”元素是否存在driver.findElement(By.cssSelector("#match-button"));getScreenShot(getClass().getName());//頁面返回——防止執行第二個測試用例時候因為頁面跳轉而導致元素查找失敗driver.navigate().back();}/**檢查異常登錄的情況*/@ParameterizedTest@CsvSource({"wukong,12"})@Order(3)void loginFail(String name, String passwd) throws IOException {driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#username")).sendKeys(name);driver.findElement(By.cssSelector("#password")).sendKeys(passwd);driver.findElement(By.cssSelector("#submit")).click();//對登錄失敗的結果進行檢驗WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(3));wait.until(ExpectedConditions.alertIsPresent());Alert alert = driver.switchTo().alert();String res = alert.getText();alert.accept();getScreenShot(getClass().getName());// System.out.println(res);assert res.equals("登錄失敗! 用戶名密碼錯誤! 或者該賬號正在游戲中!");}}

3.“游戲大廳”測試

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class GameHallTest extends AutotestUtils {//1.驅動對象public static EdgeDriver driver = createDriver();/**訪問游戲大廳頁面的URL*/@BeforeAllstatic void baseControl() {driver.get("http://127.0.0.1:8080/game_hall.html");}/*** 檢查登錄狀態下的游戲大廳頁面是否正常打開* */@Test@Order(1)void gameHallLoadRight() throws IOException {//檢查“開始匹配按鈕”元素是否存在driver.findElement(By.cssSelector("#match-button"));getScreenShot(getClass().getName());}/*** 檢查正登錄狀態下:點擊“開始匹配”按鈕否會變化*/@Test@Order(2)void gameHallSuc() throws InterruptedException, IOException {String expected = "匹配中...(點擊取消)";WebElement matchButton = driver.findElement(By.cssSelector("#match-button"));matchButton.click();//強制等待,等按鈕文字改變Thread.sleep(3);String accept = driver.findElement(By.cssSelector("#match-button")).getText();getScreenShot(getClass().getName());Assertions.assertEquals(expected,accept);}}

4.“游戲房間”測試

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class GameRoomTest extends AutotestUtils {//1.驅動對象public static EdgeDriver driver = createDriver();/**訪問游戲大廳頁面的URL*/@BeforeAllstatic void baseControl() {driver.get("http://127.0.0.1:8080/game_room.html");}/*** 檢查登錄——未匹配用戶狀態下的的游戲房間是否有彈窗*/@Test@Order(1)void gameRoomFail() throws InterruptedException, IOException {String expected = "連接游戲失敗! reason: 用戶并未匹配成功! 不能開始游戲!";Thread.sleep(1000);Alert alert = driver.switchTo().alert();String accept = alert.getText();alert.accept();getScreenShot(getClass().getName());Assertions.assertEquals(expected,accept);}
}

5.驅動退出和測試套件類

public class driverQuitTest extends AutotestUtils {public static EdgeDriver driver = createDriver();@Testvoid driverQuit() {driver.quit();}
}
@Suite//創建測試套件
// 用于Suite的注解,指定要包含在測試套件中的測試類
@SelectClasses({RegisterPageTest.class, LoginPageTest.class,GameHallTest.class,GameRoomTest.class,driverQuitTest.class})
public class runSuite {}

(四)測試結果

運行結果

四.性能測試

總體測試框架

例子

1.設置線程組

模擬 100 個虛擬用戶同時進行登錄操作,在10秒內完成

用于測試五子棋游戲登錄功能在高并發場景下的性能和穩定性。

?2.添加http請求

3.結果分析

?總體而言,從這兩個報告看,該 HTTP 請求的響應時間短且穩定,無異常請求,系統在當前測試場景下性能表現良好,能較快速且穩定地處理請求 。

五.總結

功能測試保障軟件功能正常、無缺失和錯誤,讓用戶有預期體驗;性能測試確保軟件在不同負載下響應及時、不卡頓崩潰,評估承載能力;自動化測試提升效率、降成本、保準確一致,在開發流程中及時發現問題,穩定軟件質量。

?

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

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

相關文章

知識圖譜增強的大型語言模型編輯

https://arxiv.org/pdf/2402.13593 摘要 大型語言模型&#xff08;LLM&#xff09;是推進自然語言處理&#xff08;NLP&#xff09;任務的關鍵&#xff0c;但其效率受到不準確和過時知識的阻礙。模型編輯是解決這些挑戰的一個有前途的解決方案。然而&#xff0c;現有的編輯方法…

數據庫,Spring Boot,數據源

您是對的&#xff0c;我之前的回答解釋了Spring Boot在操作MySQL時不一定需要顯式配置指定的數據源類型&#xff0c;因為它有自動配置機制&#xff0c;但沒有直接點明在自動配置情況下“數據源是什么”。 在Spring Boot自動配置機制下&#xff0c;這個“數據源”指的是一個連接…

數據結構測試模擬題(3)

1、兩個有序鏈表序列的合并 #include<bits/stdc.h> using namespace std;struct node{int num;node* next; };// 創建鏈表 node* CreatList(){int x;node *head new node(); // 創建頭節點head->next NULL;node *tail head; // 尾指針初始指向頭節點while…

LabVIEW Val (Sgnl) 屬性

在 LabVIEW 事件驅動架構中&#xff0c;Val (Sgnl) 屬性&#xff08;Value (Signaling)&#xff09;是實現編程觸發與用戶交互行為一致性的關鍵技術。與普通 Value 屬性不同&#xff0c;Val (Sgnl) 在修改控件值的同時強制生成值改變事件&#xff0c;確保程序邏輯與 UI 交互保持…

04.MySQL數據類型詳解

MySQL數據類型詳解 文章目錄 MySQL數據類型數據類型分類數值類型 tinyint類型bit類型float類型decimal類型 字符串類型 char類型varchar類型char和varchar比較 時間日期類型enum和set類型數據類型選擇的進階技巧常見誤區與解決方案性能優化與最佳實踐 MySQL數據類型 數據類型…

Spring AI 之對話記憶(Chat Memory)

大型語言模型&#xff08;LLMs&#xff09;是無狀態的&#xff0c;這意味著它們不會保留關于之前交互的信息。當想在多次交互中保持上下文或狀態時&#xff0c;這可能會成為一個限制。為了解決這一問題&#xff0c;Spring AI 提供了對話記憶功能&#xff0c;允許你在與大型語言…

H?lder Statistical Pseudo Divergence Proper H?lder Divergence

目錄 Hlder Statistical Pseudo DivergenceProper Hlder Divergence Hlder Statistical Pseudo Divergence Hlder Statistical Pseudo Divergence是一種度量兩個概率分布 p p p 和 q q q差異的方法&#xff0c;它基于Hlder不等式。定義如下&#xff1a; D α H ( p : q ) 1 …

時序數據庫IoTDB基于云原生的創新與實踐

概述 Apache IoTDB 是一款獨立自研的物聯網時序數據庫&#xff0c;作為 Apache 基金會的頂級項目&#xff0c;它融合了產學研的優勢&#xff0c;擁有深厚的科研基底。IoTDB 采用了端邊云協同的架構&#xff0c;專為物聯網設計&#xff0c;致力于提供極致的性能。 數據模型 I…

git 如何解決分支合并沖突(VS code可視化解決+gitLab網頁解決)

1、定義&#xff1a;兩個分支修改了同一文件的同一行代碼&#xff0c;無法自動決定如何合并代碼&#xff0c;需要人工干預的情況。&#xff08;假設A提交了文件a,此時B在未拉取代碼的情況下&#xff0c;直接提交是會報錯的&#xff0c;此時需要拉取之后再提交才會成功&#xff…

系統架構設計師(一):計算機系統基礎知識

系統架構設計師&#xff08;一&#xff09;&#xff1a;計算機系統基礎知識 引言計算機系統概述計算機硬件處理器處理器指令集常見處理器 存儲器總線總線性能指標總線分類按照總線在計算機中所處的位置劃分按照連接方式分類按照功能分類 接口接口分類 計算機軟件文件系統文件類…

聊一聊接口測試中緩存處理策略

目錄 一、強制繞過緩存 添加時間戳參數 修改請求頭 二、主動清除緩存 清除本地緩存 清除服務端緩存&#xff08;需權限&#xff09; 清除CDN緩存 三、測試緩存邏輯 首次請求獲取數據 記錄響應頭中的緩存標識????? 驗證緩存生效 測試緩存過期??????? 四…

機器學習算法-邏輯回歸

今天我們用 「預測考試是否及格」 的例子來講解邏輯回歸&#xff0c;從原理到實現一步步拆解&#xff0c;保證零基礎也能懂&#xff01; &#x1f3af; 例子背景 假設你是班主任&#xff0c;要根據學生的「學習時間」預測「是否及格」&#xff0c;手上有以下數據&#xff1a;…

【論文解讀】CVPR2023 PoseFormerV2:3D人體姿態估計(附論文地址)

論文鏈接&#xff1a;https://arxiv.org/pdf/2303.17472 源碼鏈接&#xff1a;https://github.com/QitaoZhao/PoseFormerV2 Abstract 本文提出了 PoseFormerV2&#xff0c;通過探索頻率域來提高 3D 人體姿態估計的效率和魯棒性。PoseFormerV2 利用離散余弦變換&#xff08;DC…

DRW - 加密市場預測

1.數據集描述 在本次比賽中&#xff0c;數據集包含加密市場的分鐘級歷史數據。您的挑戰是預測未來的加密貨幣市場價格走勢。這是一項kaggle社區預測競賽&#xff0c;您可以以 CSV 文件的形式或通過 Kaggle Notebooks 提交您的預測。有關使用 Kaggle Notebooks 的更多詳細信息&a…

嵌入式Linux系統中的啟動分區架構

在嵌入式Linux系統架構中,Linux內核、設備樹(Device Tree)與引導配置文件構成了系統啟動的基礎核心。如何安全、高效地管理這些關鍵文件,直接影響到系統的穩定性與可維護性。近年來,越來越多的嵌入式Linux開發者選擇將啟動相關文件從傳統的“混合存放”方式,轉向采用獨立…

用戶資產化視角下開源AI智能名片鏈動2+1模式S2B2C商城小程序的應用研究

摘要&#xff1a;在數字化時代&#xff0c;平臺流量用戶尚未完全轉化為企業的數字資產&#xff0c;唯有將其沉淀至私域流量池并實現可控、隨時觸達&#xff0c;方能成為企業重要的數字資產。本文從用戶資產化視角出發&#xff0c;探討開源AI智能名片鏈動21模式S2B2C商城小程序在…

Spring是如何實現屬性占位符解析

Spring屬性占位符解析 核心實現思路1?? 定義占位符處理器類2?? 處理 BeanDefinition 中的屬性3?? 替換具體的占位符4?? 加載配置文件5?? Getter / Setter 方法 源碼見&#xff1a;mini-spring 在使用 Spring 框架開發過程中&#xff0c;為了實現配置的靈活性&#xf…

【大模型面試每日一題】Day 31:LoRA微調方法中低秩矩陣的秩r如何選取?

【大模型面試每日一題】Day 31&#xff1a;LoRA微調方法中低秩矩陣的秩r如何選取&#xff1f; &#x1f4cc; 題目重現 &#x1f31f;&#x1f31f; 面試官:LoRA微調方法中低秩矩陣的秩r如何選取&#xff1f;&#xff1a; #mermaid-svg-g5hxSxV8epzWyP98 {font-family:"…

字節golang后端二面

前端接口使用restful格式&#xff0c;post與get的區別是什么&#xff1f; HTTP網絡返回的狀態碼有哪些&#xff1f; go語言切片與數組的區別是什么&#xff1f; MySQL實現并發安全避免兩個事務同時對一個記錄寫操作的手段有哪些&#xff1f; 如何實現業務的冪等性&#xff08;在…

Spring Security安全實踐指南

安全性的核心價值 用戶視角的數據敏感性認知 從終端用戶角度出發,每個應用程序都涉及不同級別的數據敏感度。以電子郵件服務與網上銀行為例:前者內容泄露可能僅造成隱私困擾,而后者賬戶若被操控將直接導致財產損失。這種差異體現了安全防護需要分級實施的基本原則: // 偽…