网页五子棋——项目测试

打印 上一主题 下一主题

主题 810|帖子 810|积分 2430

目次
测试用例计划
功能测试
注册功能测试
正常注册
异常注册
登录功能测试
正常登录
异常登录
匹配功能测试
对战功能测试
自动化测试
引入依赖
Utils
注册测试
登录测试
匹配测试
RunTest
界面测试
性能测试
总结


测试用例计划


在本篇文章中,紧张进行功能测试、界面测试和性能测试

功能测试

注册功能测试



正常注册

我们以 用户名:李四 密码:123456 为例进行注册
输入用户名和密码,点击注册按钮后,页面成功跳转至登录页面


 
异常注册

我们首先来看 用户名为空 的情况:
仅输入密码点击注册:

我们可以发现,固然弹出了提示信息,但是提示的异常信息过多,其中大多数信息并不是客户端所需要的,因此,我们需要对其进行修改
   为什么会打印上述错误信息呢?
  由于我们使用 @Validated 注解来校验参数,而这些参数未通过验证时,就抛出了 MethodArgumentNotValidException 异常,而 MethodArgumentNotValidException 被作为未知异常进行捕获:

在处理处罚未知异常时直接将错误信息返回给了前端
因此,我们可以对 MethodArgumentNotValidException 异常进行处理处罚,当捕获到  MethodArgumentNotValidException 异常时,表明传递的参数出现异常,此时我们仅返回我们之前指定的 message 信息即可
GlobalErrorCodeConstants 中添加全局错误码:
  1.     ErrorCode BAD_REQUEST = new ErrorCode(400, "客户端请求错误");
复制代码
 在 GlobalExceptionHandler 中添加: 
  1.     /**
  2.      * 捕获 @Valid / @Validated 注解校验异常
  3.      * @param e
  4.      * @return
  5.      */
  6.     @ExceptionHandler(value = MethodArgumentNotValidException.class)
  7.     public CommonResult<?> validationException(MethodArgumentNotValidException e) {
  8.         // 打印错误日志
  9.         log.info("MethodArgumentNotValidException: ", e);
  10.         // 获取所有字段验证错误
  11.         String errors = e.getBindingResult()
  12.                 .getFieldErrors()
  13.                 .stream()
  14.                 .map(error -> error.getDefaultMessage())
  15.                 .collect(Collectors.joining(", "));
  16.         // 构造异常情况下的返回结果
  17.         return CommonResult.fail(GlobalErrorCodeConstants.BAD_REQUEST.getCode(), errors);
  18.     }
复制代码
调用 e.getBindingResult().getFieldErrors() 可以获取所有错误列表,再遍历这些错误,获取每个错误的错误消息,最后,再使用 Collectors.joining(", ") ,将所有的错误消息连接成一个字符串,以 , 作为分隔符
此时的提示信息就简便清晰了许多:

别的,我们也可以在客户端发送哀求之前对用户名和密码进行校验, 从而提升用户体验并减少不必要的服务器哀求:
  1.     <script>
  2.           let btn = document.querySelector('#submit');
  3.           btn.onclick = function() {
  4.             let name =  $("#name").val();
  5.             let password = $("#password").val();
  6.             if (name == "") {
  7.                 alert("用户名不能为空");
  8.                 return;
  9.             }
  10.             if (null == "") {
  11.                 alert("用户密码不能为空");
  12.                 return;
  13.             }
  14.             $.ajax({
  15.                 url: "/register",
  16.                 type: "POST",
  17.                 contentType: 'application/json',
  18.                 data: JSON.stringify({
  19.                     name: name,
  20.                     password: password,
  21.                 }),
  22.                 success: function(result) {
  23.                     if(result.code == 200) {
  24.                         // 注册成功,跳转至登录页面
  25.                         location.assign("login.html");
  26.                     }else {
  27.                         alert(result.errorMessage);
  28.                     }
  29.                 }
  30.             });
  31.           }
  32.     </script>
复制代码

我们继承看注册已存在用户的情况:
再次注册 用户名:李四 密码:123456:

此时直接抛出了 SQLIntegrityConstraintViolationException 异常,提示插入一条新记载时,发生了违反唯一性束缚的错误
这是因为我们在数据入库之前并未对用户名进行校验

添加用户名校验:
  1.     @Override
  2.     public UserRegisterResultDTO register(UserRegisterParam param) {
  3.         // 参数校验
  4.         if (userMapper.selectByUserName(param.getName()) != null) {
  5.             throw new ServiceException(ServiceErrorCodeConstants.USER_INFO_EXISTS);
  6.         }
  7.         if (!checkPassword(param.getPassword())) {
  8.             throw new ServiceException(ServiceErrorCodeConstants.PASSWORD_CHECK_ERROR);
  9.         }
  10.         // 数据入库
  11.         UserDO userDO = new UserDO();
  12.         userDO.setUserName(param.getName());
  13.         userDO.setPassword(SecurityUtil.encipherPassword(param.getPassword()));
  14.         userMapper.insert(userDO);
  15.         // 构造响应并返回
  16.         UserRegisterResultDTO registerResultDTO = new UserRegisterResultDTO();
  17.         registerResultDTO.setUserId(userDO.getId());
  18.         return registerResultDTO;
  19.     }
复制代码
 添加 service 层错误码:
  1. ErrorCode USER_INFO_EXISTS = new ErrorCode(102, "用户已存在");
复制代码
此时再次尝试注册: 

接着,我们继承看 用户密码为空的情况:

提示信息正确

密码长度过长或过短:

此时的提示信息并不正确:
在密码校验失败时,抛出自定义的 PASSWORD_CHECK_ERROR 异常:

因此,我们对异常信息进行修改,分别定义注册和登录密码校验异常信息

 别的,在对密码进行校验时,我们仅对密码长度进行了校验

但除了对长度进行校验,我们还应该对其中的字符进行校验,防止其中出现中文或其他非 ASCII 字符的情况,从而出现编码题目,影响用户体验或导致登录失败
因此,我们校验密码为 6 - 12 位,且仅能使用数字或字母:
  1.     private boolean checkPassword(String password) {
  2.         if (!StringUtils.hasText(password)) {
  3.             return false;
  4.         }
  5.         // 使用正则表达式校验密码长度应为 6-12 位,且只包含数字和字母
  6.         String regex= "^[0-9A-Za-z]{6,12}$";
  7.         return Pattern.matches(regex, password);
  8.     }
复制代码
 


登录功能测试



同样的,我们在客户端发送哀求之前对用户名和密码进行校验:


正常登录

使用注册的 用户名和密码进行登录:


输入用户名和密码,点击登录按钮后,页面成功跳转至游戏大厅页面

异常登录

用户名为空或用户名错误:


密码为空或密码错误:


用户多开:
 再次登录 李四 账号:

点击确定后跳转至登录页面:


匹配功能测试



两个天梯分数相近的玩家进行匹配:

匹配成功,并表现对手信息

天梯分数较高玩家匹配天梯分数较低玩家:

 

此时,两名玩家分别加入了差别的匹配队列,因此,并不能进行匹配

玩家在匹配过程中取消匹配:


点击取消匹配后,将玩家从对应队列中移除

异常情况:
玩家在匹配过程中退出游戏房间:

将玩家从对应匹配队列中移除

对战功能测试


玩家1进入游戏房间后,等候对手进入房间:

两名玩家均进入游戏房间后,开始游戏:

玩家轮流落子:

胜负判定: 


异常情况:
一方玩家中途退出游戏房间:

匹配成功后,玩家1在等候玩家2过程中退出游戏房间: 

可以看到,玩家2成功进入游戏房间,但此时玩家1已退出游戏房间
因此,我们需要对对应逻辑进行修改:

在将玩家2加入游戏房间时,我们并未对玩家1的在线状态进行判断,此时,就导致了玩家1已经脱离游戏房间,但玩家2仍进入游戏房间,且开始了游戏
修改后端对应逻辑:

修改删除逻辑:

添加错误码:
  1. ErrorCode GET_RIVAL_ERROR = new ErrorCode(302, "获取对手信息失败");
复制代码
 



匹配成功后,玩家1和玩家2均未加入游戏房间:
若匹配成功后,玩家1 和 玩家2 均为加入游戏房间,此时,就会存在空房间
在两个玩家匹配成功时,我们为其创建了游戏房间:

若两个玩家都不加入当前游戏房间,此时空的游戏房间就会一直存在,但这些空房间并不会再次被使用,因此,我们需要对这些空房间进行处理处罚
我们使用定时器定期对这些空房间进行处理处罚:
启用定时任务:

为了保证不误删刚创建的新房间,我们还需要对游戏房间的创建时间进行记载,若一个空房间存活时间超过 1h,则表明当前空房间已不会再使用
我们可以将创建时间添加至房间 ID 中:

RoomManager 中添加定时任务:

由于匹配成功后,双方玩家均未进入房间这种异常情况出现概率较低,因此,我们仅需要一天执行一次定时任务即可

自动化测试

使用 selenium 对五子棋的 注册、登录和匹配功能进行自动化测试,由于对战模块需要模拟真人对战,且落子下标欠好定位,因此,就不进行自动化测试了
引入依赖

  1. <!--        selenium -->
  2.         <dependency>
  3.             <groupId>org.seleniumhq.selenium</groupId>
  4.             <artifactId>selenium-java</artifactId>
  5.             <version>4.0.0</version>
  6.         </dependency>
  7. <!--        驱动管理-->
  8.         <dependency>
  9.             <groupId>io.github.bonigarcia</groupId>
  10.             <artifactId>webdrivermanager</artifactId>
  11.             <version>5.5.3</version>
  12.         </dependency>
  13. <!--        屏幕截图-->
  14.         <dependency>
  15.             <groupId>commons-io</groupId>
  16.             <artifactId>commons-io</artifactId>
  17.             <version>2.6</version>
  18.         </dependency>
复制代码
 
Utils

接着,我们创建 Utils 类,用于存放自动化代码中的通用方法
  1. public class Utils {
  2.     public static WebDriver webDriver;
  3.     /**
  4.      * 创建 webDriver 并 访问指定 url
  5.      * @param url
  6.      */
  7.     public Utils(String url) {
  8.         if (null == webDriver) {
  9.             WebDriverManager.edgedriver().setup();
  10.             EdgeOptions options = new EdgeOptions();
  11.             // 允许访问所有连接
  12.             options.addArguments("--remote-allow-origins=*");
  13.             this.webDriver = new EdgeDriver(options);
  14.             // 隐式等待 3 秒
  15.             this.webDriver.manage().timeouts().implicitlyWait(java.time.Duration.ofSeconds(3));
  16.         }
  17.         webDriver.get(url);
  18.     }
  19.     /**
  20.      * 关闭 WebDriver 和浏览器
  21.      */
  22.     public void closeBrowser() {
  23.         if (webDriver != null) {
  24.             webDriver.quit();
  25.         }
  26.     }
  27.     /**
  28.      * 进行屏幕截图并将其保存到自定路径
  29.      * 路径: ./src/tests/image/2025-2-24/LoginPage-17548130.png
  30.      * @param str
  31.      */
  32.     public void getScreenShot(String str) {
  33.         try {
  34.             DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  35.             DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HHmmssSS");
  36.             String dirTime = dateFormatter.format(LocalDateTime.now());
  37.             String fileTime = timeFormatter.format(LocalDateTime.now());
  38.             // 使用 File.separator 来适应不同操作系统上的路径分隔符
  39.             String filename = "src" + File.separator + "test" + File.separator + "image" + File.separator + dirTime + File.separator + str + "-" + fileTime + ".png";
  40.             // 创建目录
  41.             Path path = Paths.get(filename).getParent();
  42.             if (path != null && !Files.exists(path)) {
  43.                 Files.createDirectories(path);
  44.             }
  45.             // 将截图存放到指定位置
  46.             File srcFile = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
  47.             File destFile = new File(filename);
  48.             FileUtils.copyFile(srcFile, destFile);
  49.         } catch (IOException e) {
  50.             // 更好的错误处理或日志记录
  51.             System.err.println("截图失败: " + e.getMessage());
  52.             e.printStackTrace();
  53.         }
  54.     }
  55. }
复制代码
 
注册测试

对注册功能进行测试:
  1. public class RegisterPage extends Utils {
  2.     private static String url = "http://49.108.48.236:8081/register.html";
  3.     public RegisterPage() {
  4.         super(url);
  5.     }
  6.     /**
  7.      * 检查页面是否加载成功
  8.      */
  9.     public void registerPageRight() {
  10.         // 查看页面元素是否存在
  11.         webDriver.findElement(By.cssSelector("body > div.register-container > div > div:nth-child(3) > span")); // 密码提示信息
  12.         webDriver.findElement(By.cssSelector("body > div.nav")); // 导航栏
  13.         webDriver.findElement(By.cssSelector("body > div.register-container > div > h3")); // 注册标题
  14.     }
  15.     /**
  16.      * 注册成功测试
  17.      */
  18.     public void registerSuc() {
  19.         // 清除输入框内文本
  20.         webDriver.findElement(By.cssSelector("#name")).clear();
  21.         webDriver.findElement(By.cssSelector("#password")).clear();
  22.         // 输入用户名和密码
  23.         webDriver.findElement(By.cssSelector("#name")).sendKeys("zhaoliu");
  24.         webDriver.findElement(By.cssSelector("#password")).sendKeys("123456");
  25.         // 点击登录按钮
  26.         webDriver.findElement(By.cssSelector("#submit")).click();
  27.         // 通过页面标题检查是否登录成功
  28.         String expect = webDriver.getTitle();
  29.         assert expect.equals("登录");
  30.         // 退回到注册页面
  31.         webDriver.navigate().back();
  32.     }
  33.     /**
  34.      * 注册失败 —— 账号错误 测试
  35.      * 1. 账号为空
  36.      * 2. 用户名已存在
  37.      */
  38.     public void registerNameFail() {
  39.         // 1. 未输入账号
  40.         // 清除输入框内文本
  41.         webDriver.findElement(By.cssSelector("#name")).clear();
  42.         webDriver.findElement(By.cssSelector("#password")).clear();
  43.         webDriver.findElement(By.cssSelector("#password")).sendKeys("123456");
  44.         webDriver.findElement(By.cssSelector("#submit")).click();
  45.         // 处理弹窗
  46.         WebDriverWait wait = new WebDriverWait(webDriver, Duration.ofSeconds(5));
  47.         wait.until(ExpectedConditions.alertIsPresent());// 等待弹窗出现
  48.         Alert alert = webDriver.switchTo().alert();
  49.         alert.accept();
  50.         // 2. 账号已存在
  51.         // 清除输入框内文本
  52.         webDriver.findElement(By.cssSelector("#name")).clear();
  53.         webDriver.findElement(By.cssSelector("#password")).clear();
  54.         webDriver.findElement(By.cssSelector("#name")).sendKeys("zhangsan");
  55.         webDriver.findElement(By.cssSelector("#password")).sendKeys("123456");
  56.         webDriver.findElement(By.cssSelector("#submit")).click();
  57.         // 处理弹窗
  58.         wait = new WebDriverWait(webDriver, Duration.ofSeconds(5));
  59.         wait.until(ExpectedConditions.alertIsPresent());// 等待弹窗出现
  60.         alert = webDriver.switchTo().alert();
  61.         alert.accept();
  62.     }
  63.     /**
  64.      * 注册失败 —— 密码错误 测试
  65.      * 1. 密码为空
  66.      * 2. 密码过长或过短
  67.      * 3. 密码中包含特殊字符
  68.      */
  69.     public void registerPasswordFail() {
  70.         // 1. 未输入密码
  71.         // 清除输入框内文本
  72.         webDriver.findElement(By.cssSelector("#name")).clear();
  73.         webDriver.findElement(By.cssSelector("#password")).clear();
  74.         webDriver.findElement(By.cssSelector("#name")).sendKeys("admin");
  75.         webDriver.findElement(By.cssSelector("#submit")).click();
  76.         // 处理弹窗
  77.         WebDriverWait wait = new WebDriverWait(webDriver, Duration.ofSeconds(5));
  78.         wait.until(ExpectedConditions.alertIsPresent());// 等待弹窗出现
  79.         Alert alert = webDriver.switchTo().alert();
  80.         alert.accept();
  81.         // 2. 密码过长
  82.         // 清除输入框内文本
  83.         webDriver.findElement(By.cssSelector("#name")).clear();
  84.         webDriver.findElement(By.cssSelector("#password")).clear();
  85.         webDriver.findElement(By.cssSelector("#name")).sendKeys("admin");
  86.         webDriver.findElement(By.cssSelector("#password")).sendKeys("1234591111111");
  87.         webDriver.findElement(By.cssSelector("#submit")).click();
  88.         // 处理弹窗
  89.         wait = new WebDriverWait(webDriver, Duration.ofSeconds(5));
  90.         wait.until(ExpectedConditions.alertIsPresent());// 等待弹窗出现
  91.         alert = webDriver.switchTo().alert();
  92.         alert.accept();
  93.         // 3. 密码过短
  94.         // 清除输入框内文本
  95.         webDriver.findElement(By.cssSelector("#name")).clear();
  96.         webDriver.findElement(By.cssSelector("#password")).clear();
  97.         webDriver.findElement(By.cssSelector("#name")).sendKeys("admin");
  98.         webDriver.findElement(By.cssSelector("#password")).sendKeys("12345");
  99.         webDriver.findElement(By.cssSelector("#submit")).click();
  100.         // 处理弹窗
  101.         wait = new WebDriverWait(webDriver, Duration.ofSeconds(5));
  102.         wait.until(ExpectedConditions.alertIsPresent());// 等待弹窗出现
  103.         alert = webDriver.switchTo().alert();
  104.         alert.accept();
  105.         // 4. 密码中包含特殊字符
  106.         // 清除输入框内文本
  107.         webDriver.findElement(By.cssSelector("#name")).clear();
  108.         webDriver.findElement(By.cssSelector("#password")).clear();
  109.         webDriver.findElement(By.cssSelector("#name")).sendKeys("admin");
  110.         webDriver.findElement(By.cssSelector("#password")).sendKeys("12345@");
  111.         webDriver.findElement(By.cssSelector("#submit")).click();
  112.         // 处理弹窗
  113.         wait = new WebDriverWait(webDriver, Duration.ofSeconds(5));
  114.         wait.until(ExpectedConditions.alertIsPresent());// 等待弹窗出现
  115.         alert = webDriver.switchTo().alert();
  116.         alert.accept();
  117.     }
  118. }
复制代码
 
登录测试

  1. public class LoginPage extends Utils {
  2.     private static String url = "http://49.108.48.236:8081/login.html";
  3.     public LoginPage() {
  4.         super(url);
  5.     }
  6.     /**
  7.      * 检查页面是否加载成功
  8.      */
  9.     public void loginPageRight() {
  10.         // 查看页面元素是否存在
  11.         webDriver.findElement(By.cssSelector("body > div.login-container > div > div:nth-child(2) > span")); // 用户名提示信息
  12.         webDriver.findElement(By.cssSelector("body > div.nav")); // 导航栏
  13.         webDriver.findElement(By.cssSelector("body > div.login-container > div > div.register > a")); // 注册链接
  14.     }
  15.     /**
  16.      * 登录成功测试
  17.      */
  18.     public void loginSuc() {
  19.         // 清除输入框内文本
  20.         webDriver.findElement(By.cssSelector("#name")).clear();
  21.         webDriver.findElement(By.cssSelector("#password")).clear();
  22.         // 输入用户名和密码
  23.         webDriver.findElement(By.cssSelector("#name")).sendKeys("zhangsan");
  24.         webDriver.findElement(By.cssSelector("#password")).sendKeys("123456");
  25.         // 点击登录按钮
  26.         webDriver.findElement(By.cssSelector("#submit")).click();
  27.         // 通过页面标题检查是否登录成功
  28.         String expect = webDriver.getTitle();
  29.         assert expect.equals("游戏大厅");
  30.         getScreenShot(getClass().getName());
  31.         // 退回到登录页面
  32.          webDriver.navigate().back();
  33.     }
  34.     /**
  35.      * 登录失败 —— 账号错误 测试
  36.      * 1. 账号为空
  37.      * 2. 用户名错误
  38.      */
  39.     public void loginNameFail() {
  40.         // 1. 未输入账号
  41.         // 清除输入框内文本
  42.         webDriver.findElement(By.cssSelector("#name")).clear();
  43.         webDriver.findElement(By.cssSelector("#password")).clear();
  44.         webDriver.findElement(By.cssSelector("#password")).sendKeys("123456");
  45.         webDriver.findElement(By.cssSelector("#submit")).click();
  46.         // 处理弹窗
  47.         WebDriverWait wait = new WebDriverWait(webDriver, Duration.ofSeconds(5));
  48.         wait.until(ExpectedConditions.alertIsPresent());// 等待弹窗出现
  49.         Alert alert = webDriver.switchTo().alert();
  50.         alert.accept();
  51.         // 2. 账号错误
  52.         // 清除输入框内文本
  53.         webDriver.findElement(By.cssSelector("#name")).clear();
  54.         webDriver.findElement(By.cssSelector("#password")).clear();
  55.         webDriver.findElement(By.cssSelector("#name")).sendKeys("admin");
  56.         webDriver.findElement(By.cssSelector("#password")).sendKeys("123456");
  57.         webDriver.findElement(By.cssSelector("#submit")).click();
  58.         // 处理弹窗
  59.         wait = new WebDriverWait(webDriver, Duration.ofSeconds(5));
  60.         wait.until(ExpectedConditions.alertIsPresent());// 等待弹窗出现
  61.         alert = webDriver.switchTo().alert();
  62.         alert.accept();
  63.     }
  64.     /**
  65.      * 登录失败 —— 密码错误 测试
  66.      * 1. 密码为空
  67.      * 2. 用户名正确,密码错误
  68.      */
  69.     public void loginPasswordFail() {
  70.         // 1. 未输入密码
  71.         // 清除输入框内文本
  72.         webDriver.findElement(By.cssSelector("#name")).clear();
  73.         webDriver.findElement(By.cssSelector("#password")).clear();
  74.         webDriver.findElement(By.cssSelector("#name")).sendKeys("zhangsan");
  75.         webDriver.findElement(By.cssSelector("#submit")).click();
  76.         // 处理弹窗
  77.         WebDriverWait wait = new WebDriverWait(webDriver, Duration.ofSeconds(5));
  78.         wait.until(ExpectedConditions.alertIsPresent());// 等待弹窗出现
  79.         Alert alert = webDriver.switchTo().alert();
  80.         alert.accept();
  81.         // 2. 密码错误
  82.         // 清除输入框内文本
  83.         webDriver.findElement(By.cssSelector("#name")).clear();
  84.         webDriver.findElement(By.cssSelector("#password")).clear();
  85.         webDriver.findElement(By.cssSelector("#name")).sendKeys("zhangsan");
  86.         webDriver.findElement(By.cssSelector("#password")).sendKeys("123459");
  87.         webDriver.findElement(By.cssSelector("#submit")).click();
  88.         // 处理弹窗
  89.         wait = new WebDriverWait(webDriver, Duration.ofSeconds(5));
  90.         wait.until(ExpectedConditions.alertIsPresent());// 等待弹窗出现
  91.         alert = webDriver.switchTo().alert();
  92.         alert.accept();
  93.     }
  94. }
复制代码
 
匹配测试

  1. public class MatchPage extends Utils {
  2.     private static String url = "http://49.108.48.236:8081/game_hall.html";
  3.     public MatchPage() {
  4.         super(url);
  5.     }
  6.     /**
  7.      * 未登录状态下进入游戏大厅
  8.      */
  9.     public void noLoginToMatch() {
  10.         getScreenShot(getClass().getName());
  11.         // 通过页面标题检查是否跳转到登录页面
  12.         String expect = webDriver.getTitle();
  13.         assert expect.equals("登录");
  14.     }
  15.     public void match() {
  16.         // 清除输入框内文本
  17.         webDriver.findElement(By.cssSelector("#name")).clear();
  18.         webDriver.findElement(By.cssSelector("#password")).clear();
  19.         // 1. 进行登录
  20.         webDriver.findElement(By.cssSelector("#name")).sendKeys("zhangsan");
  21.         webDriver.findElement(By.cssSelector("#password")).sendKeys("123456");
  22.         webDriver.findElement(By.cssSelector("#submit")).click();
  23.         // 2. 等待页面加载
  24.         WebDriverWait wait = new WebDriverWait(webDriver, Duration.ofSeconds(5));
  25.         wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#match-button")));
  26.         // 3. 开始匹配
  27.         webDriver.findElement(By.cssSelector("#match-button")).click();
  28.         wait.until(ExpectedConditions.textToBe(By.cssSelector("#match-button"), "匹配中...(点击停止)"));
  29.         WebElement element = webDriver.findElement(By.cssSelector("#match-button"));
  30.         String content = element.getText();
  31.         assert content.equals("匹配中...(点击停止)");
  32.         // 4. 停止匹配
  33.         webDriver.findElement(By.cssSelector("#match-button")).click();
  34.         wait.until(ExpectedConditions.textToBe(By.cssSelector("#match-button"), "开始匹配"));
  35.         element = webDriver.findElement(By.cssSelector("#match-button"));
  36.         content = element.getText();
  37.         assert content.equals("开始匹配");
  38.     }
  39. }
复制代码
 
RunTest

运行上述接口:
  1. public class RunTest {
  2.     public static void main(String[] args) {
  3.         // 未登录状态下访问游戏大厅页面
  4.         MatchPage matchPage = new MatchPage();
  5.         matchPage.noLoginToMatch();
  6.         // 注册测试
  7.         RegisterPage registerPage = new RegisterPage();
  8.         registerPage.registerPageRight();
  9.         registerPage.registerNameFail();
  10.         registerPage.registerPasswordFail();
  11.         registerPage.registerSuc();
  12.         // 登录测试
  13.         LoginPage loginPage = new LoginPage();
  14.         loginPage.loginPageRight();
  15.         loginPage.loginNameFail();
  16.         loginPage.loginPasswordFail();
  17.         loginPage.loginSuc();
  18.         // 进行匹配测试
  19.         matchPage.match();
  20.         matchPage.closeBrowser();
  21.     }
  22. }
复制代码
 测试通过:

 
界面测试


注册登录页面正确表现:

游戏大厅页面正确表现:

对战页面:

可以看到,其中棋盘下方和右侧边沿并不能包罗最后一个格子,因此,我们对棋盘进行修改:

此时就能保证正确棋盘的边框被绘制出来:

绘制棋子:

游戏竣事:

返回大厅,更新对应信息:
 
 
性能测试


使用 JMeter 对五子棋的登录接口进行性能测试: 
创建梯度压测线程组(Stepping Thread Group),逐步增大我们对接口的并发哀求量:

创建 csv 文件,存放用户名和密码:

导入 csv 文件:
 
设置哀求头:
 
添加哀求:

查察结果:
聚合报告:

测试过程中并未发生异常情况,且 99% 的哀求相应时间在 220ms 及以内
最大相应时间达到了1156 ms,这表明在某些时刻体系处理处罚哀求的速度显著下降

每秒处理处罚事务数: 

 事务数在测试开始时渐渐增长,并在一段时间内保持相对稳定

相应时间:
 
相应时间在测试过程中有较大的颠簸,尤其是在某些时间段内出现了较高的峰值。这可能表明体系在高负载下存在性能瓶颈

总结

功能测试:
1. 五子棋游戏的基本功能正常运行,正常流程能够正确执行
2. 异常情况处理处罚具有缺陷,对异常注册、异常登录 以及 异常进入游戏房间缺陷进行了修改
界面测试:
1. 所有按钮点击相应及时,页面表现良好,无遮挡或表现错误情况
2. 棋盘边框表现不完整,对棋盘进行了修改
性能测试:
1. 相应时间在测试过程中有较大的颠簸,尤其是在某些时间段内出现了较高的峰值
2. 可调整测试设置,增长线程数或调整循环次数,以测试更高并发用户数下性能
后续改进:
1. 针对相应时间的颠簸,进一步分析体系日志和监控数据 ,找出导致性能瓶颈的具体原因
2. 增长禁手规则更好地平衡游戏,减少先手玩家的优势
3. 限定玩家思索时间,从而增长游戏的挑衅性和紧张感

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大连密封材料

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表