网页五子棋对战测试报告

发布于:2025-05-13 ⋅ 阅读:(15) ⋅ 点赞:(0)

项目背景

初学springboot的第一个项目,这是一款基于SSM框架结合WebSocket技术打造的网页版五子棋游戏,免下载安装,打开网页就能随时享受下棋乐趣。它最核心的功能是双人在线对战,在匹配系统中随机与其他玩家开启棋局。WebSocket技术确保了下棋过程中,双方落子信息能实时同步,几乎没有延迟,让对弈流畅又丝滑。在界面设计上,它简洁美观,棋盘与棋子的绘制精致,操作也十分简单,新手玩家能快速上手。除了实时对弈,游戏还贴心地提供了复盘功能,方便玩家回顾棋局,总结经验,提升棋艺。不管是想在闲暇时光杀上几盘,还是和棋友交流切磋,这款网页版五子棋都能满足你。

项目测试

功能测试

在这里插入图片描述

部分界面截图

在这里插入图片描述
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/bf6be8fd6bdd499e8e594f3a3d512805.png
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

自动化测试

因为写的比较着急,可能代码并不美观,请见谅

Utils

@Data
public class Utils {
    public static EdgeDriver driver;

    public static EdgeDriver createDriver() {
        if(driver == null) {
            WebDriverManager.edgedriver().setup();
            EdgeOptions options = new EdgeOptions();
            //允许访问所有的链接
            options.addArguments("--remote-allow-origins=*");

            driver = new EdgeDriver(options);

            //隐式等待(全局情况,查找元素的时候都让它等待2秒)
            driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(2));
        }

        return driver;
    }

    public Utils(String url) {
        driver = createDriver();
        driver.get(url);
    }
    public List<String> getTime(){
    //文件能不能按照天的维度按文件夹进行保存
    //文件格式 20230212-123030毫秒
        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, AWTException {
        driver.quit();
        List<String> timeParts = getTime();

        // 构建路径
        String dirPath = Paths.get("./src/test/java/com/blogWebAutoTest", timeParts.get(0)).toString();
        String filename = String.format("%s_%s.png", str, timeParts.get(1));
        File destFile = new File(dirPath, filename);

        // 自动创建目录
        if (!destFile.getParentFile().exists()) {
            destFile.getParentFile().mkdirs(); // 创建多级目录
        }

        // 截图并保存
        // 使用 Robot 类截屏
        Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
        BufferedImage screenFullImage = new Robot().createScreenCapture(screenRect);

        // 保存截图
        ImageIO.write(screenFullImage, "png", destFile);
        System.out.println("IDEA运行截图已保存至: " + destFile.getAbsolutePath());
    }

}

RegisterTest

public class RegisterTest extends Utils {
    private static String url = "http://localhost:8080/register.html";

    public RegisterTest() {
        super(url);
    }

    public void registerFail() {
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
        // 空账号空密码测试
        driver.findElement(By.xpath("//*[@id=\"username\"]")).clear();
        driver.findElement(By.xpath("//*[@id=\"password\"]")).clear();
        driver.findElement(By.xpath("//*[@id=\"username\"]")).sendKeys("");
        driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("");
        driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();
        // 处理弹窗(确认)
        wait.until(ExpectedConditions.alertIsPresent());
        Alert alert = driver.switchTo().alert(); // 切换到弹窗
        alert.accept(); // 点击确认(相当于点击"OK")

        driver.findElement(By.xpath("//*[@id=\"username\"]")).sendKeys("laoliu1");
        driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("");
        driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();
        wait.until(ExpectedConditions.alertIsPresent());
        alert = driver.switchTo().alert(); // 切换到弹窗
        alert.accept(); // 点击确认(相当于点击"OK")

        driver.findElement(By.xpath("//*[@id=\"username\"]")).sendKeys("");
        driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("123");
        driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();
        wait.until(ExpectedConditions.alertIsPresent());
        alert = driver.switchTo().alert(); // 切换到弹窗
        alert.accept(); // 点击确认(相当于点击"OK")

    }

    public void registerSuccess() throws InterruptedException {
        // 等待页面加载完成

        // 第一次注册
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
//        wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id=\"username\"]")));
//        driver.findElement(By.xpath("//*[@id=\"username\"]")).clear();
//        driver.findElement(By.xpath("//*[@id=\"password\"]")).clear();
//        driver.findElement(By.xpath("//*[@id=\"username\"]")).sendKeys("laoliu1");
//        driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("123");
//        driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();
//
//        // 处理第一个弹窗
//        try {
//            wait.until(ExpectedConditions.alertIsPresent());
//            Alert alert = driver.switchTo().alert();
//            alert.accept();
//        } catch (Exception e) {
//            System.out.println("第一个弹窗处理失败: " + e.getMessage());
//        }
        driver.get(url);
//        // 等待页面元素重新加载
        
        // 第二次注册
        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id=\"username\"]")));
        driver.findElement(By.xpath("//*[@id=\"username\"]")).clear();
        driver.findElement(By.xpath("//*[@id=\"password\"]")).clear();
        driver.findElement(By.xpath("//*[@id=\"username\"]")).sendKeys("ceshi");
        driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("123");
        driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();
        
        // 处理第二个弹窗
        try {
            wait.until(ExpectedConditions.alertIsPresent());
            Alert alert = driver.switchTo().alert();
            alert.accept();
        } catch (Exception e) {
            System.out.println("第二个弹窗处理失败: " + e.getMessage());
        }
        
        // 等待页面跳转
        wait.until(ExpectedConditions.urlToBe("http://localhost:8080/login.html"));
        
        // 验证跳转
        String currentUrl = driver.getCurrentUrl();
        assert currentUrl.equals("http://localhost:8080/login.html") : 
            "Expected URL: http://localhost:8080/login.html, but got: " + currentUrl;

    }

    public void registerT() throws InterruptedException {
        // 等待页面加载完成

        
        // 创建显式等待对象
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
        
        // 等待输入框元素可见
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id=\"username\"]")));
        
        // 输入注册信息
        driver.findElement(By.xpath("//*[@id=\"username\"]")).clear();
        driver.findElement(By.xpath("//*[@id=\"password\"]")).clear();
        driver.findElement(By.xpath("//*[@id=\"username\"]")).sendKeys("laoliu2");
        driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("123");
        
        // 点击提交按钮
        driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();
        
        // 等待AJAX请求完成和弹窗出现
        try {
            wait.until(ExpectedConditions.alertIsPresent());
            Alert alert = driver.switchTo().alert();
            alert.accept();
        } catch (Exception e) {
            System.out.println("弹窗处理失败: " + e.getMessage());
            throw e;
        }

        driver.quit();
    }
}

LoginTest

public class LoginTest extends Utils {
    private static String url = "http://localhost:8080/login.html";
    public LoginTest() {
        super(url);
    }

    public void LoginFail() {

        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id=\"username\"]")));
        loginTest("", "");
        wait.until(ExpectedConditions.alertIsPresent());
        Alert alert = driver.switchTo().alert(); // 切换到弹窗
        alert.accept(); // 点击确认(相当于点击"OK")

        loginTest("laoliu1", "");
        wait.until(ExpectedConditions.alertIsPresent());
        alert = driver.switchTo().alert(); // 切换到弹窗
        alert.accept(); // 点击确认(相当于点击"OK")

        loginTest("", "123");
        wait.until(ExpectedConditions.alertIsPresent());
        alert = driver.switchTo().alert(); // 切换到弹窗
        alert.accept(); // 点击确认(相当于点击"OK")

        loginTest("laoliu123", "123");
        wait.until(ExpectedConditions.alertIsPresent());
        alert = driver.switchTo().alert(); // 切换到弹窗
        alert.accept(); // 点击确认(相当于点击"OK")

    }
    public void LoginSuccess() {
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
        loginTest("ceshi", "123");
        wait.until(ExpectedConditions.alertIsPresent());
        Alert alert = driver.switchTo().alert(); // 切换到弹窗
        alert.accept(); // 点击确认(相当于点击"OK")
        assert driver.getCurrentUrl().equals("http://localhost:8080/game_hall.html");
//        driver.quit();
    }

    private static void loginTest(String username, String number) {
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();
        driver.findElement(By.cssSelector("#username")).sendKeys(username);
        driver.findElement(By.cssSelector("#password")).sendKeys(number);
        driver.findElement(By.cssSelector("#submit")).click();
    }
}

HallTest

public class HallTest extends Utils {
    private static String url = "http://localhost:8080/game_hall.html";
    public HallTest() {
        super(url);
    }

    public void hallFail() {
        // 清理登录状态
        driver.manage().deleteAllCookies();
        driver.get(url);
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
        WebElement screen = wait.until(d -> {
            WebElement el = d.findElement(By.id("screen"));
            return el.getText().contains("玩家:") ? el : null;
        });
        // 获取所有文本节点(需注意浏览器兼容性)
        List<WebElement> textNodes = driver.findElements(By.cssSelector("#screen > *"));

        //解析整个文本
        String fullText = screen.getText();
        String[] lines = fullText.split("\n");
        assertEquals("玩家: undefined", lines[0]);
        driver.findElement(By.cssSelector("#match-button")).click();
        assert driver.findElement(By.cssSelector("#match-button")).getText().equals("开始匹配") : "未登入状态进入游戏大厅匹配异常";
    }

    public void hallSuccess() {
        driver.get("http://localhost:8080/login.html");
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(20));
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id=\"username\"]")));
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();
        driver.findElement(By.cssSelector("#username")).sendKeys("ceshi");
        driver.findElement(By.cssSelector("#password")).sendKeys("123");
        driver.findElement(By.cssSelector("#submit")).click();
        wait.until(ExpectedConditions.alertIsPresent());
        Alert alert = driver.switchTo().alert(); // 切换到弹窗
        alert.accept(); // 点击确认(相当于点击"OK")

        // 等待页面跳转
        wait.until(ExpectedConditions.urlToBe(url));

        // 验证跳转
        String currentUrl = driver.getCurrentUrl();
        assert currentUrl.equals(url) :
                "Expected URL: http://localhost:8080/game_hall.html, but got: " + currentUrl;

//        wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id=\"screen\"]/text()[1]")));;
        WebElement screen = wait.until(d -> {
            WebElement el = d.findElement(By.id("screen"));
            return el.getText().contains("玩家:") ? el : null;
        });
        // 获取所有文本节点(需注意浏览器兼容性)
        List<WebElement> textNodes = driver.findElements(By.cssSelector("#screen > *"));


        String fullText = screen.getText();
        String[] lines = fullText.split("\n");
        assertEquals("玩家: ceshi", lines[0]);
        driver.findElement(By.cssSelector("#match-button")).click();
        System.out.println(driver.findElement(By.cssSelector("#match-button")).getText());
        assert driver.findElement(By.cssSelector("#match-button")).getText().equals("匹配中...(点击取消)") : "登入状态点击开始匹配异常";

        driver.findElement(By.cssSelector("#match-button")).click();
        assert driver.findElement(By.cssSelector("#match-button")).getText().equals("开始匹配") : "登入状态点击取消匹配异常";

//        driver.quit();
    }
}

RoomTest

public class RoomTest extends Utils {
    private static String url = "http://localhost:8080/game_room.html";
    public RoomTest() {
        super(url);
    }

    public void roomFail() {
        driver.manage().deleteAllCookies();
        driver.get(url);
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
        wait.until(driver -> ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#screen")));
        assert driver.findElement(By.cssSelector("#screen")).getText().equals("等待玩家连接中...") : "无状态访问游戏房间异常";
    }

//    public void roomSuccess() {
//
//    }
}