一、项目概述以及本次测试的目标
本项目是基于Web的五子棋实时对战应用,为用户提供多人实时游戏体验;项目采用了前后端分离的方法来实现,使用了数据库来存储相关的数据;前端主要有四个页面构成:登录页面,注册页面,游戏大厅页面和游戏房间页面,测试的目标是验证游戏的功能的完整性。
二、项目的功能
本五子棋对战项目主要是实现了以下几个功能:登录,注册,匹配和对战。
1.用户注册与登录:玩家可以注册账户并进行登录,每个玩家可以保存个人积分信息和游戏记录
2.游戏大厅页面:展示在线玩家的信息和进行玩家匹配的功能。
3.游戏房间页面:当两个积分相近的玩家匹配成功后,会进入游戏房间的页面,使用了WebSocket进行页面初始化,并发送请求和接收响应,前端发送落子请求,后端进行胜利逻辑判断并返回落子响应,实现实时对战。
三、自动化测试
a、首先创建一个Maven项目,引入selenium以及Junit5的依赖
<dependencies> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.0.0</version> </dependency> <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>commons-io</groupId> <artifactId>commons-io</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>io.github.bonigarcia</groupId> <artifactId>webdrivermanager</artifactId> <version>5.8.0</version> </dependency> </dependencies>
b、创建驱动类
package common; import io.github.bonigarcia.wdm.WebDriverManager; import org.apache.commons.io.FileUtils; import org.openqa.selenium.OutputType; import org.openqa.selenium.TakesScreenshot; import org.openqa.selenium.WebDriver; import org.openqa.selenium.edge.EdgeDriver; import org.openqa.selenium.edge.EdgeOptions; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.time.Duration; public class Utils { public static WebDriver driver; public static WebDriver createDriver() { if(driver == null) { WebDriverManager.edgedriver().setup(); EdgeOptions options = new EdgeOptions(); //允许访问所有的链接 options.addArguments("--remote-allow-origins=*"); driver = new EdgeDriver(options); //等待 driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(2)); } return driver; } public Utils(String url) { //调用driver对象 driver = createDriver(); //访问url driver.get(url); } public void getScreenShot(String str) throws IOException { //屏幕截图 SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat sim2 = new SimpleDateFormat("HHmmssSS"); String dirTime = sim1.format(System.currentTimeMillis()); String fileTime = sim2.format(System.currentTimeMillis()); //./src/test/image/2024-07-17/test01-17453020.png String filename ="./src/test/image/"+ dirTime +"/" + str + "-" + fileTime+".png"; File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); //srcFile放到指定位置 FileUtils.copyFile(srcFile,new File(filename)); } }
c、测试登录界面
package tests; import common.Utils; import org.apache.commons.io.FileUtils; import org.openqa.selenium.By; import org.openqa.selenium.OutputType; import org.openqa.selenium.TakesScreenshot; import java.io.File; import java.io.IOException; public class Login extends Utils { public static String url = "http://127.0.0.1:8080/login.html"; public Login() { super(url); } /* 检查页面是否加载成功 */ public void loginPageRight() throws InterruptedException, IOException { //通过查看页面元素是否存在来检查页面加载成功与否 driver.findElement(By.cssSelector("body > div.nav > a")); //登陆输入框 //driver.findElement(By.cssSelector("body > div.login-container > form > div")); } //检查登录功能---成功登录 public void LoginSuc() throws IOException { driver.findElement(By.cssSelector("#username")).clear(); driver.findElement(By.cssSelector("#password")).clear(); driver.findElement(By.cssSelector("#username")).sendKeys("zhangsan"); driver.findElement(By.cssSelector("#password")).sendKeys("123"); driver.findElement(By.cssSelector("#submit")).click(); //检查点击登陆之后是否登陆成功 driver.findElement(By.cssSelector("#submit")); //页面标题来检查是否登陆成功 String expect = driver.getTitle(); assert expect.equals("游戏大厅"); getScreenShot(getClass().getName()); driver.navigate().back(); } /* 检查登录功能---登录失败 */ public void LoginFail() throws IOException { // //方法一:通过clear保证输入框没有文本 // driver.findElement(By.cssSelector("#username")).clear(); // driver.findElement(By.cssSelector("#password")).clear(); //方法二:通过刷新保证输入框没有文本 driver.navigate().refresh(); driver.findElement(By.cssSelector("#username")).sendKeys("admin111"); driver.findElement(By.cssSelector("#password")).sendKeys("123"); driver.findElement(By.cssSelector("#submit")).click(); String res = driver.findElement(By.cssSelector("body")).getText(); getScreenShot(getClass().getName()); assert res.equals("用户名或密码错误!"); } }
d、测试注册界面
package tests; import common.Utils; import org.junit.jupiter.api.Assertions; import org.openqa.selenium.By; import java.io.IOException; public class Register extends Utils { public static String url = "http://127.0.0.1:8080/register.html"; public Register(){ super(url); } public void registerPageLoadRight() throws IOException { driver.findElement(By.cssSelector("body > div.nav > a")); String expect = "注册"; String actual = driver.findElement(By.cssSelector("#submit")).getText(); getScreenShot(getClass().getName()); Assertions.assertEquals(expect, actual); } public void registerSuc() throws IOException { driver.findElement(By.cssSelector("#username")).clear(); driver.findElement(By.cssSelector("#password")).clear(); driver.findElement(By.cssSelector("#username")).sendKeys("zhangsan"); driver.findElement(By.cssSelector("#password")).sendKeys("123"); driver.findElement(By.cssSelector("#submit")).click(); //检查点击登陆之后是否注册成功 driver.findElement(By.cssSelector("#submit")); //页面标题来检查是否注册成功 String expect = driver.getTitle(); assert expect.equals("注册成功"); getScreenShot(getClass().getName()); driver.navigate().back(); } /* 检查注册功能---注册失败 */ public void registerFail() throws IOException { //通过刷新保证输入框没有文本 driver.navigate().refresh(); driver.findElement(By.cssSelector("#username")).sendKeys("admin111"); driver.findElement(By.cssSelector("#password")).sendKeys("123"); driver.findElement(By.cssSelector("#submit")).click(); String res = driver.findElement(By.cssSelector("body")).getText(); getScreenShot(getClass().getName()); assert res.equals("用户名或密码错误!"); } }
四、测试总结
趣味五子棋实时对战在功能方面表现良好,测试过程中发现的问题都已及时修复。