当前位置: 首页 > news >正文

自动化测试项目1 --- 唠嗑星球 [软件测试实战 Java 篇]

目录

项目介绍

项目源码库地址

项目功能测试 

1.自动化实施步骤 

1.1 编写测试用例

 1.2 自动化测试脚本开发

1.2.1 配置相关环境, 添加相关依赖

1.2.2 相关代码编写

2. 自动化功能测试总结

2.1 弹窗的解决相关问题

2.2 断言的使用和说明

2.3 重新登录问题

项目性能(接口)测试

1. 进行性能测试

2.生成的性能测试报告

项目总结

1. 部分使用缺陷总结

​编辑

2. 测试结论与建议


项目介绍

// "唠嗑星球" 项目专注于打造私密、深度的沟通场景,是一款仅支持一对一交流的即时通讯平台,为用户带来专注且安全的聊天体验;

// 在功能设计上,摒弃了群聊模式,全力优化一对一聊天体验; 项目配备实时消息推送功能,确保重要信息及时触达;聊天记录云端存储,方便用户随时回溯查看;

// 对于用户而言,本项目是维系情感、深入沟通的绝佳工具。无论是与亲朋好友分享生活感悟,还是与合作伙伴进行业务洽谈,都能在这里获得专注、高效且安全的交流体验,助力每一次一对一沟通都充满温度与价值。

项目源码库地址

        唠嗑星球 git 仓库地址, 点击跳转https://gitee.com/zhou-jintao2002/web-chat-auto-test

项目功能测试 

1.自动化实施步骤 

1.1 编写测试用例

 1.2 自动化测试脚本开发

1.2.1 配置相关环境, 添加相关依赖

// 自动化测试基础知识及相关函数, 包括 Selenium 的安装和使用基础教程

1.2.2 相关代码编写

// 我们将需要测试的内容按照具体需求放到不同的文件夹中, 方便管理

common/Untils.java

public class Untils {public static WebDriver driver;public static WebDriver createDriver() {if (driver == null) {// 创建驱动对象WebDriverManager.chromedriver().setup();ChromeOptions options = new ChromeOptions();// 设置无头模式options.addArguments("-headless");// 设置浏览器加载策略options.setPageLoadStrategy(PageLoadStrategy.NORMAL);// 允许访问所有链接options.addArguments("--remote-allow-origins=*");// 驱动创建好了driver = new ChromeDriver(options);// 创建隐式等待driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(2));}return driver;}public Untils(String url) {// 调用 driver 对象driver = createDriver();// 访问urldriver.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());// 生成文件的格式为: 年-月-日/test.类名-时分秒毫秒.pngString fileName = "./src/test/image/" + dirTime + "/" + str + "-" + fileTime + ".png";// System.out.printf("fileName:" + fileName);File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);// srcFile 放到指定位置FileUtils.copyFile(srcFile,new File((fileName)));}
}

tests/LoginPage.java

public class LoginPage extends Untils {public static String url = "http://127.0.0.1:8080/login.html";public LoginPage() {super(url);}/*检查页面是否加载成功*/public void loginPageRight() throws InterruptedException, IOException {getScreenShot(getClass().getName());// 通过查看页面元素是否存在来检查页面加载成功与否driver.findElement(By.cssSelector("body > div.nav"));//        Thread.sleep(3000);
//        driver.quit();}/*检查登录功能*/// 成功登录public void LoginSuc() throws InterruptedException, IOException {getScreenShot(getClass().getName());// 登录成功测试前可以先 刷新页面 或者 清除一下输入框, 确保输入框中没有文本// 方法一: 通过 clear 保证输入框没有文本
//        driver.findElement(By.cssSelector("username")).clear();
//        driver.findElement(By.cssSelector("password")).clear();// 方法二: 通过界面刷新操作清除输入框文本driver.navigate().refresh();driver.findElement(By.cssSelector("#username")).sendKeys("lisi");driver.findElement(By.cssSelector("#password")).sendKeys("123");driver.findElement(By.cssSelector("#submit")).click();// 加一个等待Thread.sleep(1000);//有弹窗先解决弹窗Alert alert = driver.switchTo().alert();alert.accept();// 程序执行过快, 导致报错, 加一个显式等待 (是处理弹窗前需要等待, 所以这行代码先不用)
//        WebDriverWait off = new WebDriverWait(driver, Duration.ofSeconds(3));
//        off.until(ExpectedConditions.elementToBeClickable(By.cssSelector("body > div.client-container > div > div.left > div.tab > div.tab-friend")));// 通过新页面的图标来检查点击登录之后是否登录成功driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.tab > div.tab-session"));// 通过新页面的标题来再次检查点击登录之后是否登录成功String expect = driver.getTitle();// 通过断言功能来检查assert expect.equals("网页聊天程序");getScreenShot(getClass().getName());// 回退driver. Navigate().back();// 回退之后就刷新一下页面driver. Navigate().refresh();}// 异常登录(账号为空)public void LoginFail1() throws InterruptedException, IOException {// 清除输入框中原有的内容// 方法一: 通过 clear 保证输入框没有文本
//        driver.findElement(By.cssSelector("username")).clear();
//        driver.findElement(By.cssSelector("password")).clear();// 方法二: 通过界面刷新操作清除输入框文本
//        driver.navigate().refresh();driver.findElement(By.cssSelector("#username")).sendKeys("");driver.findElement(By.cssSelector("#password")).sendKeys("123");driver.findElement(By.cssSelector("#submit")).click();// 加一个等待Thread.sleep(1000);//有弹窗先解决弹窗Alert alert = driver.switchTo().alert();alert. Accept();// 弹窗解决后再判断是否登录成功, 若登录失败, 则表示还在登录界面String u = driver.getCurrentUrl();assert u.equals("http://127.0.0.1:8080/login.html");// 页面刷新一下, 确保输入框没有文本driver.navigate().refresh();//        driver.quit();}// 异常登录(密码为空)public void LoginFail2() throws InterruptedException, IOException {driver.findElement(By.cssSelector("#username")).sendKeys("lisi");driver.findElement(By.cssSelector("#password")).sendKeys("");driver.findElement(By.cssSelector("#submit")).click();// 加一个等待Thread.sleep(1000);//有弹窗先解决弹窗Alert alert = driver.switchTo().alert();alert.accept();// 弹窗解决后再判断是否登录成功, 若登录失败, 则表示还在登录界面String u = driver.getCurrentUrl();assert u.equals("http://127.0.0.1:8080/login.html");// 页面刷新一下, 确保输入框没有文本driver.navigate().refresh();
//        driver.quit();}// 异常登录(账号错误)public void LoginFail3() throws InterruptedException, IOException {driver.findElement(By.cssSelector("#username")).sendKeys("lisizi");driver.findElement(By.cssSelector("#password")).sendKeys("123");driver.findElement(By.cssSelector("#submit")).click();// 加一个等待Thread.sleep(1000);//有弹窗先解决弹窗Alert alert = driver.switchTo().alert();alert.accept();// 弹窗解决后再判断是否登录成功, 若登录失败, 则表示还在登录界面String u = driver.getCurrentUrl();assert u.equals("http://127.0.0.1:8080/login.html");// 页面刷新一下, 确保输入框没有文本driver.navigate().refresh();
//        driver.quit();}// 异常登录(密码错误)public void LoginFail4() throws InterruptedException, IOException {driver.findElement(By.cssSelector("#username")).sendKeys("lisi");driver.findElement(By.cssSelector("#password")).sendKeys("1234");driver.findElement(By.cssSelector("#submit")).click();// 加一个等待Thread.sleep(1000);//有弹窗先解决弹窗Alert alert = driver.switchTo().alert();alert.accept();// 弹窗解决后再判断是否登录成功, 若登录失败, 则表示还在登录界面String u = driver.getCurrentUrl();assert u.equals("http://127.0.0.1:8080/login.html");// 页面刷新一下, 确保输入框没有文本driver.navigate().refresh();
//        driver.quit();//driver.navigate().back();driver.navigate().refresh();}
}

tests/ListPage.java

public class ListPage extends Untils {private static String url = "http://127.0.0.1:8080/login.html";public ListPage() {super(url);}/*未登录状态下 --- 访问列表页由 PageByNoLogin类 进行测试*//*登录状态下 --- 访问主页面*/public static String username = null;public static String se1 = null;public static String se2 = null;public void ListLogin() throws InterruptedException {
//        Thread.sleep(1000);// 重新返回并清空登录页面进行登录driver.navigate().refresh();// 登录driver.findElement(By.cssSelector("#username")).sendKeys("lisi");username = driver.findElement(By.cssSelector("#username")).getText();driver.findElement(By.cssSelector("#password")).sendKeys("123");driver.findElement(By.cssSelector("#submit")).click();// 为了能等到弹窗出现,加一个等待Thread.sleep(1000);// 有弹窗先解决弹窗Alert alert = driver.switchTo().alert();alert.accept();// 通过查看页面元素是否存在来检查页面加载成功与否driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.tab > div.tab-session"));se1 =driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.tab > div.tab-session")).getText();}/*检查个人信息是否正确*/public void PersonalInformation() {// 找到登录用户名driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.user"));// 用断言来比较这个用户名和登录的用户名是否一致assert se1.equals(username);}/*检查搜索框*/public void SearchBox() throws InterruptedException {// 检查是否可以正常输入driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.search > input[type=text]")).sendKeys("zhangsan");// 点击搜索按钮driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.search > button"));// 这里按钮虽然可以点击,但是做不到搜索功能}/*检查聊天内容预览因为这个消息是动态的,所以只能测试一次,一次过后就要改 test2*/public void ChatPage() throws InterruptedException {// 程序执行过快,网站内容还没加载完全,加一个显式等待WebDriverWait off = new WebDriverWait(driver, Duration.ofSeconds(20));off.until(ExpectedConditions.textToBe (By.cssSelector("#session-list > li:nth-child(2) > h3"),("zhangsan")));// 查询到主页预览中的聊天内容String test1 = driver.findElement(By.cssSelector("#session-list > li.selected > p")).getText();// 点击对应用户并查询到聊天界面中的聊天内容driver.findElement(By.cssSelector("#session-list > li:nth-child(2)")).click();String test2 = driver.findElement(By.cssSelector("body > div.client-container > div > div.right > div.message-show > div:nth-child(14) > div > p")).getText();// 使用断言判断预览功能是否成功assert test1.equals(test2);}/*给其他用户发送消息*/public void SendMessage() {// 程序执行过快,网站内容还没加载完全,加一个显式等待WebDriverWait off = new WebDriverWait(driver, Duration.ofSeconds(20));off.until(ExpectedConditions.textToBe (By.cssSelector("#session-list > li:nth-child(2) > h3"),("zhangsan")));// 选择一个用户并点击进入消息发送界面driver.findElement(By.cssSelector("#session-list > li:nth-child(2)")).click();// 找到输入框, 并输入想要发送的内容(空)driver.findElement(By.cssSelector("body > div.client-container > div > div.right > textarea")).sendKeys("");// 点击发送按钮,发送消息driver.findElement(By.cssSelector("body > div.client-container > div > div.right > div.ctrl > button")).click();// 找到输入框, 并输入想要发送的内容(仅文字)driver.findElement(By.cssSelector("body > div.client-container > div > div.right > textarea")).sendKeys("你好呀!");se2 = driver.findElement(By.cssSelector("#session-list > li.selected > p")).getText();// 点击发送按钮,发送消息driver.findElement(By.cssSelector("body > div.client-container > div > div.right > div.ctrl > button")).click();// 找到输入框, 并输入想要发送的内容 (文字 + 其他内容)
//         driver.findElement(By.cssSelector("body > div.client-container > div > div.right > textarea")).sendKeys("你好呀!35465466654^&%^%$^%$&^*&%^#$%&%*&$^%#^%#^%&^*&^&");// 点击发送按钮,发送消息driver.findElement(By.cssSelector("body > div.client-container > div > div.right > div.ctrl > button")).click();}/*检查接收消息*/public void ReceiveMessage() throws InterruptedException {// 需要登录另一个接收账号来测试// 首先回退,刷新重新登录driver.navigate().back();driver.navigate().refresh();// 登录driver.findElement(By.cssSelector("#username")).sendKeys("zhangsan");username = driver.findElement(By.cssSelector("#username")).getText();driver.findElement(By.cssSelector("#password")).sendKeys("123");driver.findElement(By.cssSelector("#submit")).click();// 为了能等到弹窗出现,加一个等待Thread.sleep(2000);// 有弹窗先解决弹窗Alert alert = driver.switchTo().alert();alert.accept();// 通过查看页面元素是否存在来检查页面加载成功与否driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.tab > div.tab-session"));// 进行收发件验证// 程序执行过快,网站内容还没加载完全,加一个显式等待WebDriverWait off = new WebDriverWait(driver, Duration.ofSeconds(25));off.until(ExpectedConditions.textToBe (By.cssSelector("#session-list > li:nth-child(1) > h3"),("zhaoliu")));// 找到发件人昵称,点击进去driver.findElement(By.cssSelector("#session-list > li:nth-child(3)")).click();// 用断言检查发件人发送的内容是否接收到了String ele = driver.findElement(By.cssSelector("#session-list > li.selected > p")).getText();
//        System.out.println(ele+"1");
//        System.out.println(se2+"2");assert se2.equals(ele);}/*检查好友列表页*/public void FriendsList() {// 找到好友图标并点击,通过查看好友列表的好友昵称判断是否成功跳转driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.tab > div.tab-friend")).click();driver.findElement(By.cssSelector("#friend-list > li:nth-child(1) > h4"));// 点击好友,跳转到聊天界面driver.findElement(By.cssSelector("#friend-list > li:nth-child(1) > h4")).click();driver.findElement(By.cssSelector("body > div.client-container > div > div.right > div.title"));}
}

tests/PageByNoLogin.java

/*测试未登录的用例*/
public class PageByNoLogin extends Untils {public static String url = "http://127.0.0.1:8080/client.html";public PageByNoLogin() {super(url);}public void ListPageByNoLogin() throws IOException, InterruptedException {// 保证未登录状态Thread.sleep(1000);// 主页未登录处理// 处理弹窗Alert alert = driver.switchTo().alert();alert.accept();// 跳转到登录页面String expect = driver.getTitle();getScreenShot(getClass().getName());assert expect.equals("登录页面");//         driver.quit();}
}

RunTests.java

public class RunTests {public static void main(String[] args) throws InterruptedException, IOException {LoginPage login = new LoginPage();login.loginPageRight();login.LoginSuc();login.LoginFail1();login.LoginFail2();login.LoginFail3();login.LoginFail4();PageByNoLogin noLogin = new PageByNoLogin();noLogin.ListPageByNoLogin();ListPage list = new ListPage();list.ListLogin();list.PersonalInformation();list.SearchBox();list.ChatPage();list.SendMessage();list.ReceiveMessage();list.FriendsList();Thread.sleep(1000);driver.quit();}
}

2. 自动化功能测试总结

2.1 弹窗的解决相关问题

// 有弹窗先处理弹窗, 弹窗未处理之前不能对页面元素进行操作

// 在执行登录测试的程序时, 报了以下错误

// 我就觉得是在解决弹窗时出了点问题, 调试了几遍发现是程序执行过快导致弹窗没有被检测到

// 所以我就个加了等待, 再次尝试运行就没有弹窗错误了

2.2 断言的使用和说明

// 断言语法: assert 变量1.equals(变量2);

  

// 判断是否相同的情况可以多使用断言

 // 要想在 idea 中使用断言, 需要先按照以下步骤进行配置

2.3 重新登录问题

// 成功登录测试完之后, 我们需要测试登录失败的用例时, 就需要重新登录, 这时候就要用到 回退(driver.navigate().back();) 操作, 但仅仅回退还不行, 因为在之前登录的时候, 用户名和密码的输入框中已经输入了内容, 我们如果直接进行测试的话, 会在原基础上拼接, 所以我们需要先将输入框中的内容清空才能继续进行测试, 这里我们可以用两种方法, 一种是使用 clear 语句, 第二种是 使用 刷新 (driver.navigate().refresh();) 操作

// 为了防止我们的测试代码因执行顺序发生变化导致报错, 每次登录不管是否成功, 我们都可以 back 并 refresh 一下, 这样不论我们是先测试成功用例还是失败用例, 到最后都可以实现

项目性能(接口)测试

// 使用 JMeter 进行性能测试

// 可以和 Postman 配合使用

1. 进行性能测试

2.生成的性能测试报告

// 点击查看性能测试报告

 

 

项目总结

1. 部分使用缺陷总结

2. 测试结论与建议

相关文章:

  • 百度后端开发一面
  • vue3+ts项目 配置vue-router
  • HarmonyOS NEXT第一课——HarmonyOS介绍
  • Java实现区间合并算法详解
  • 2025A卷华为OD机试真题-数组二叉树(C++/Java/Python)-100分
  • 学习springboot-条件化配置@Conditional(条件注解)
  • 数字智慧方案5872丨智慧交通解决方案(54页PPT)(文末有下载方式)
  • AI大模型-RAG到底能做些什么?
  • 镜像和容器的深度介绍和关系
  • 使用xlwings计算合并单元格的求和
  • 改进算法超详细:双变异樽海鞘群算法:从最优性能设计到分析
  • MySQL数据库上篇
  • 怎么实现动态提示词,并提升准确率
  • 【IPMV】图像处理与机器视觉:Lec9 Laplace Blending 拉普拉斯混合
  • 这款软件的第三方评测:功能、易用性与性能表现如何?
  • map和set的遗留 + AVL树(1):
  • K8S - StatefulSet 与 DaemonSet - 有状态应用部署与节点管理策略
  • [面试]SoC验证工程师面试常见问题(二)
  • PyTorch_创建张量
  • 浅谈SpringBoot框架中的单例bean
  • 爱彼迎:一季度总收入约23亿美元,将拓展住宿以外的新领域
  • CMG亚太总站:没有邀请韩国偶像团体举办巡回演出
  • 五一去哪玩?“时代交响”音乐会解锁艺术假期
  • 一季度我国服务进出口总额19741.8亿元,同比增长8.7%
  • 广西干旱程度有所缓解,未来一周旱情偏重地区降水量仍不足
  • 新华社评论员:汇聚起工人阶级和广大劳动群众的磅礴力量