一、项目背景1.1项目概述本项目基于SSM框架搭建SpringBoot管理项目组件SpringMVC处理页面交互MyBatis完成数据库操作。比特论坛系统一个Web网站程序你可以看到其他用户论坛也可以登录自己的账号自由发布言论点赞私信等功能。1.2项目名称网络观点汇1.3开发语言Java1.4开发环境IntelliJ IDEA 2024.1.4 (Ultimate Edition)二、项目主要页面及功能2.1用户登录页http://127.0.0.1:58080/sign-in.html2.2用户注册页http://127.0.0.1:58080/sign-up.html2.3论坛列表页http://127.0.0.1:58080/index.html2.3.1论坛展示2.3.2帖子详情模块1登录用户为帖子作者时作者可以给帖子点赞也可以编辑帖子删除帖子2登录用户不是帖子作者不是作者只能给帖子点赞也可以给作者发私信同时两者都可以在帖子下面进行回复2.3.3我的帖子模块2.3.4用户中心模块在用户中心模块中用户可以修改上传自己的头像修改昵称密码等功能。2.3.5帖子编辑模块三、对项目进行测试3.1编写测试用例3.1.1用户登陆页测试用例3.1.2用户注册页测试用例3.1.3论坛列表页测试用例3.2编写自动化测试用例3.2执行测试首先要创建一个maven项目引入selenium以及Junit5的依赖以及浏览器驱动依赖dependency groupIdorg.seleniumhq.selenium/groupId artifactIdselenium-java/artifactId version4.0.0/version /dependency dependency groupIdorg.junit.jupiter/groupId artifactIdjunit-jupiter/artifactId version5.8.2/version scopetest/scope /dependency dependency groupIdorg.junit.platform/groupId artifactIdjunit-platform-suite/artifactId version1.8.2/version scopetest/scope /dependency dependency groupIdio.github.bonigarcia/groupId artifactIdwebdrivermanager/artifactId version5.8.0/version /dependency引入依赖后创建浏览器驱动对象由于是在谷歌浏览器进行自动化测试的所以创建一个谷歌驱动对象为了在测试期间便于发现测试问题所以写个截图这样可以知道问题会出现在哪里~截图和创建驱动对象这两个方法是放在一个父类里可以实现代码复用这是我所创建的一些包和类可以再创建一个类用来关闭driver和Junit5很适配就不会再忘记关闭driver了~~~创建一个测试套件以此顺序来执行自动化测试用例根据自己所编写的自动化用例对用户登录页进行测试首先查看页面是否被正确加载这里我检查了三个点图标用户输入框登录按钮第二查看正常登录的情况输入正确的账号和密码才可以正常登录第三登录按钮测试页面是否可以跳转成功第四异常登录有四种情况1账号为空 //eg:,1234562账号不为空密码为空 //eg:zhangsan,3都不为空账号在数据库中不存在 //eg:wyb,1234564都不为空账号在数据库中存在密码错误 //eg:zhangsan,456Test Order(1) public void nullLoginFail() throws IOException, InterruptedException { driver.get(url1); //清空输入框 driver.findElement(By.cssSelector(#username)).clear(); driver.findElement(By.cssSelector(#password)).clear(); //输入账号密码 // 1.账号为空会出现用户名不能为空的提示 driver.findElement(By.cssSelector(#username)).sendKeys(); driver.findElement(By.cssSelector(#password)).sendKeys(123456); Thread.sleep(1); getScreenshot(loginFail1); driver.findElement(By.cssSelector(#submit)).click(); Thread.sleep(1); String actual driver.findElement(By.cssSelector(#signInForm div.mb-3 div)).getText(); String expect 用户名不能为空; Assertions.assertEquals(expect, actual); //清空输入框 driver.findElement(By.cssSelector(#username)).clear(); driver.findElement(By.cssSelector(#password)).clear(); // 2.密码为空会出现‘密码不能为空’的提示 driver.findElement(By.cssSelector(#username)).sendKeys(zhangsan); driver.findElement(By.cssSelector(#password)).sendKeys(); Thread.sleep(1000); getScreenshot(loginFail2); driver.findElement(By.cssSelector(#submit)).click(); Thread.sleep(1000); String actual2 driver.findElement(By.cssSelector(#signInForm div.mb-2 div div)).getText(); String expect2 密码不能为空; Assertions.assertEquals(expect2, actual2); } /* 3.都不为空用户名没有在数据库中找到 4.都不为空用户名正确密码错误 */ ParameterizedTest Order(2) CsvSource({wyb,123456,zhangsan,456}) public void errorLoginFail(String username, String password) throws IOException, InterruptedException { //清空输入框 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(password); Thread.sleep(2000); driver.findElement(By.cssSelector(#submit)).click(); //查看是否出现提示 WebDriverWait wait new WebDriverWait(driver, Duration.ofSeconds(2)); wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(body div.jq-toast-wrap.bottom-right div))); }登录页面测试基本完毕接下来是用户注册页面首先查看页面是否被正确加载检查点 确认密码输入框 注册按钮第二注册测试1.要注册的用户名数据库中已经存在注册失败2. 要注册的用户名数据库中不存在1两次输入密码不一样注册失败2两次输入密码一样注册成功zhgangsanlisi这两个用户名在数据库中是已经存在的要注册的用户名数据库中已经存在注册失败Test Order(2) public void usernameExist() throws IOException { //页面刷新 driver.navigate().refresh(); //用户名输入框 driver.findElement(By.cssSelector(#username)).sendKeys(zhangsan); //昵称输入框 driver.findElement(By.cssSelector(#nickname)).sendKeys(ss); //密码输入框 driver.findElement(By.cssSelector(#password)).sendKeys(123456); //确认密码输入框 driver.findElement(By.cssSelector(#passwordRepeat)).sendKeys(123456); //勾选协议条款框 driver.findElement(By.cssSelector(#policy)).click(); getScreenshot(usernameExist); //点击注册按钮 driver.findElement(By.cssSelector(#submit)).click(); //由于用户名已经存在所以弹出用户已存在提示,查看是否出现提示 String actual driver.findElement(By.cssSelector(body div.jq-toast-wrap.bottom-right div)).getText(); String expect ×\n 警告\n 用户已存在; getScreenshot(usernameExist); Assertions.assertEquals(actual,expect); }要注册的用户名数据库中不存在 两次输入密码不一样注册失败Test Order(3) public void usernameNotExistPassFail() throws IOException { //页面刷新 driver.navigate().refresh(); //用户名输入框 driver.findElement(By.cssSelector(#username)).sendKeys(wangwu); //昵称输入框 driver.findElement(By.cssSelector(#nickname)).sendKeys(www); //密码输入框 driver.findElement(By.cssSelector(#password)).sendKeys(123456); //确认密码输入框 两次密码不一样 driver.findElement(By.cssSelector(#passwordRepeat)).sendKeys(123); //勾选协议条款框 driver.findElement(By.cssSelector(#policy)).click(); getScreenshot(usernameNotExistPassFail); //点击注册按钮 driver.findElement(By.cssSelector(#submit)).click(); //确认密码输入框下面会出现提示 String actual driver.findElement(By.cssSelector(#signUpForm div div:nth-child(5) div div)).getText(); String expect 请检查确认密码; getScreenshot(usernameNotExistPassFail); Assertions.assertEquals(actual,expect); }要注册的用户名数据库中不存在 两次输入密码一样注册成功Test Order(4) public void usernameNotExistPassSuccess() throws IOException { //页面刷新 driver.navigate().refresh(); //用户名输入框 driver.findElement(By.cssSelector(#username)).sendKeys(wangwu); //昵称输入框 driver.findElement(By.cssSelector(#nickname)).sendKeys(www); //密码输入框 driver.findElement(By.cssSelector(#password)).sendKeys(123456); //确认密码输入框 两次密码一样 driver.findElement(By.cssSelector(#passwordRepeat)).sendKeys(123456); //勾选协议条款框 driver.findElement(By.cssSelector(#policy)).click(); getScreenshot(usernameNotExistPassSucess); //点击注册按钮 driver.findElement(By.cssSelector(#submit)).click(); getScreenshot(usernameNotExistPassSucess); }在注册成功后是直接跳转到用户登录页面的可以去检查一下登录页面的元素加载出来了没也可以直接driver.getCurrentUrl();获取当前页面的url来判断是否到了登录页面~这里就不展示啦~也还可以测试在登录页面是否可以跳转到注册页面注册页面是否可以跳转到登录页面~论坛列表页若是在未登录的情况下直接使用列表页的url直接进入会怎么样会直接跳转到登录页面若是在正常登录的情况下检测页面是否可以正常打开检查点发布帖子按钮 导航栏中的首页第三在论坛详情页可以看到各个导航栏分类下面的帖子比如点击java就会出现与java相关的帖子Test Order(2) public void postCategorization() throws IOException { //在正确加载页面后点击导航栏里面的java分类就可以到与java相关的帖子页面并且会显示帖子有几个 driver.findElement(By.cssSelector(#topBoardListlili)).click(); String actual driver.findElement(By.cssSelector(#article_list_board_title)).getText(); String expect Java; getScreenshot(postCategorization); Assertions.assertEquals(expect,actual); String listNum driver.findElement(By.cssSelector(#article_list_count_board)).getText(); System.out.println(listNum); }我在最后输出了帖子详情数在Java分类下正好有一个帖子点击帖子进入帖子详情页如果帖子是登录用户发表的则会有三个功能点赞编辑删除而帖子不是登录用户发表的则只能对帖子进行点赞所以我测试了点赞编辑Test Order(3) public void postDetail() throws InterruptedException, IOException { // 1.点击Java分类下的帖子这个帖子正好是登录用户zhangsan发布的 driver.findElement(By.cssSelector(#artical-items-body div:nth-child(1) div div.col div.text-truncate a strong)).click(); // 2.测试点赞,并查看是否有点赞成功提示 //Thread.sleep(2000); driver.findElement(By.cssSelector(#details_btn_like_count)).click(); String actual driver.findElement(By.cssSelector(body div.jq-toast-wrap.bottom-right div)).getText(); String expect ×\n 成功\n 点赞成功; getScreenshot(postDetail); Assertions.assertEquals(expect,actual); Thread.sleep(3000); // 3.测试编辑跳转到编辑查看一下标题输入框,点击提交按钮跳转到首页并提示编辑成功 driver.findElement(By.cssSelector(#details_artile_edit)).click(); driver.findElement(By.cssSelector(#edit_article_title)); String actual1 driver.findElement(By.cssSelector(#edit_article_submit)).getText(); String expect1 提交; Assertions.assertEquals(expect1,actual1); //等待元素出现就可以点击了 Thread.sleep(5000); WebDriverWait wait new WebDriverWait(driver, Duration.ofSeconds(10)); WebElement element driver.findElement(By.cssSelector(#edit_article_submit)); wait.until(ExpectedConditions.elementToBeClickable(element)); element.click(); String actual2 driver.findElement(By.cssSelector(body div.jq-toast-wrap.bottom-right div)).getText(); String expect2 ×\n 成功\n 修改成功; getScreenshot(postDetail2); Assertions.assertEquals(expect2,actual2); Thread.sleep(3000); }最后一块内容是论坛编辑页~~~同前面一样先查看是否进入帖子编辑页页面元素是否加载成功我选择了两个检查点第二填充要发布的帖子内容帖子内容有三个模块都不可为空1.分别是一个分类模块是下拉框默认为Java2.还有一个标题输入框3.还有一个正文输入由于是使用的第三方编写软件所以需要鼠标和键盘配合操作1)鼠标先挪动到输入内容区域2鼠标单击3输入内容Test Order(2) void postEdit() throws IOException, InterruptedException { //下拉框内容待补充现在有默认的的为Java driver.findElement(By.cssSelector(#article_post_title)).sendKeys(今天你过得开心嘛); Thread.sleep(1000); //找到pre块存到ele中 WebElement ele driver.findElement(By.cssSelector(#edit-article div.CodeMirror.cm-s-default.CodeMirror-wrap.CodeMirror-empty div.CodeMirror-scroll div.CodeMirror-sizer div div div div.CodeMirror-code div pre)); //对于鼠标和键盘的操作selenum中专门提供了一个类 Actions actions new Actions(driver); //单击ele perform作用为了在页面看到效果 actions.click(ele).perform(); Thread.sleep(1000); //actions中有很多方法比如keyDown //actions.keyDown(Keys.DELETE).perform(); // 表示按下delete键Keys中有很多键的表示 //输入内容 先挪动到元素上再输入内容就ok啦 actions.moveToElement(ele).sendKeys(精通Java快乐每一天).perform(); getScreenshot(postEdit); Thread.sleep(1000); }这一块内容的知识点我自己整理了一下可自行去我的博客中查找~~帖子内容已经添加好点击发布按钮查看弹出提示帖子是否发布成功四、测试总结4.1测试分类4.1.1功能测试测试用例功能测试结果测试用例100%通过4.1.2自动化测试自动化测试覆盖模块用户登陆页面用户注册页面论坛列表页面自动化代码实列我的gitee后续会补自动化测试用例数量自动化测试结果4.2遗留风险测试时间紧张先保证了论坛主体功能没有问题可能存在细节测试不到位风险。4.3测试结果评估1主功能测试通过项目可以上线2项目上线后高优观察线上数据查看线上用户操作日志即使跟用户进行反馈。