目錄
一.項目介紹?
(一)項目簡介
(二)功能介紹
(三)頁面展示
1.注冊頁面
2.登錄頁面
3.游戲大廳頁面
4.游戲房間頁面(對戰)
二.功能測試
(一)出現的bug
?(二)解決方法
三.自動化測試
(一)測試用例設計
(二)測試準備
(三)編寫測試腳本
1.工具類
2.注冊功能
3.登錄測試
3.“游戲大廳”測試
4.“游戲房間”測試
5.驅動退出和測試套件類
(四)測試結果
四.性能測試
例子
五.總結
?
一.項目介紹?
若需要【萌筆趣棋】項目源碼可后臺私信
(一)項目簡介
“新醬愛玩的五子棋” 是一款以《蠟筆小新》春日部角色為主題背景的五子棋游戲。該游戲基于網頁端開發,通過簡潔易懂的界面設計,為玩家提供經典五子棋的對戰體驗,融合了趣味性與競技性,目標用戶主要為喜愛五子棋和《蠟筆小新》動漫的人群。
(二)功能介紹
- 注冊頁面:玩家可在此頁面輸入自定義的用戶名和密碼進行賬號注冊。系統會對輸入信息進行驗證,確保用戶名的唯一性等,成功注冊后可獲得在游戲中進行對戰的資格。
- 登錄頁面:已注冊玩家輸入正確的用戶名和密碼登錄游戲。登錄成功后,可進入游戲大廳開始游戲相關操作;若輸入錯誤,系統會提示重新輸入。
- 游戲大廳:玩家登錄后進入游戲大廳,可查看自己的游戲信息,包括用戶名、當前分數、比賽場次和獲勝場次等。點擊 “開始匹配” 按鈕,系統會自動為玩家尋找對戰對手,在匹配過程中可點擊取消匹配。
- 游戲房間:匹配成功后進入游戲房間,玩家和對手在此進行五子棋對戰。游戲界面會顯示棋盤,玩家按規則輪流落子。當一方率先在棋盤的橫線、豎線或斜線上形成連續的五個棋子時,判定為獲勝方,系統會顯示勝負結果,并更新玩家在游戲大廳中的相關數據(如分數、比賽場次、獲勝場次等) 。
(三)頁面展示
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 請求的響應時間短且穩定,無異常請求,系統在當前測試場景下性能表現良好,能較快速且穩定地處理請求 。
五.總結
功能測試保障軟件功能正常、無缺失和錯誤,讓用戶有預期體驗;性能測試確保軟件在不同負載下響應及時、不卡頓崩潰,評估承載能力;自動化測試提升效率、降成本、保準確一致,在開發流程中及時發現問題,穩定軟件質量。
?