云谈网页聊天室的web自动化测试 性能测试 (包含测试代码和测试的详细过程)

news2024/12/23 10:07:37

概要

  • 项目名称:云谈网页聊天室
  • 测试日期:2024-03-05
  • 测试人员:汪汪miao~
  • 测试类型:功能测试、集成测试,接口测试、性能测试
  • 测试框架&工具:Selenium、Junit、LoadRunner

项目背景

云谈网页聊天室是一款实时双向互通的消息交流平台,目的是为用户提供一个稳定、高效、用户友好的聊天平台,拉近人与人之间的距离,这需要充分的测试覆盖和质量保障。

测试目标

  • 设计可靠的自动化测试用例,覆盖项目核心功能和不同场景。
  • 提高测试效率,减少手动测试的工作量,加速项目交付。
  • 保障持续集成与持续交付流程,确保每次代码提交都经过全面的测试。

测试环境

  • 硬件:LAPTOP-H9LFQ2N5 & AMD Ryzen 5 5600H with Radeon Graphics
  • 操作系统:Windows 11 64 位操作系统, 基于 x64 的处理器
  • 数据库:MySQL5.7
  • 浏览器版本:Chrome浏览器113.0.5672.93 + webDriver(chromedriver)

测试环境的搭建:

  1. 新建一个Mave项目,在ChatRoom包下写测试代码
    在这里插入图片描述
  2. 创建一个类用于初始化webdriver,让其他类继承这个类,使代码变得更精简
    在这里插入图片描述

关于测试用例的设计

  • 从功能、界面、兼容、易用,安全,网络等方面来猜想可能遇到的问题,从而去设计
    在这里插入图片描述

项目的开发测试策略:

在项目需求分析阶段就已经开始考虑测试用例的设计,明确各个功能点的预期效果,然后使用Selenium和Junit自动化测试框架搭建了一套全面的自动化测试用例,用于集成测试,并且这些自动化测试用例覆盖了项目的核心功能以及大部分的应用场景。

关于集成测试:Selenium + JUnit

使用Selenium测试框架结合JUnit来编写集成测试用例。通过模拟用户的操作,自动化地测试用户界面的功能、交互以及不同模块之间的集成情况。例如,针对登录功能,模拟用户输入用户名和密码,然后验证登录是否成功,同时检查用户是否能够正确跳转到主界面。

关于接口测试: Postman

针对每个模块的功能设计了一系列针对单元测试的测试用例。例如,对于用户登录功能,编写了测试用例来验证用户输入正确的用户名和密码时是否能够成功登录,以及输入错误的用户名和密码时是否能够正确提示用户。对于消息发送功能,我测试了消息是否能够正确传递给接收方并显示在界面上。通过这些测试用例,能够确保各个模块的基本功能正常运行。

一些自动化测试的演示

基于selenium3和Junit5来编写的代码,文末可以查看相关脚本

登录相关测试

用例一:输入正确的用户名、密码
预期结果:登录成功
测试过程:

输入正确的用户名密码登陆成功


测试结果:通过

用例二:输入错误的用户名、密码
预期结果:登录失败
测试过程:

输入错误的用户名、密码登录失败


测试结果:通过

注册相关测试

用例三:输入正确的用户名、密码
预期结果:注册成功
测试过程:

输入正确的用户名密码注册成功


测试结果:通过

用例四:输入错误的用户名密码

预期结果:登录失败

测试过程:

输入错的用户名密码注册失败


测试结果:通过

主界面相关测试

用例五:点击好友按钮
预期结果:列表切换为好友列表
测试过程:

点击好友按钮切换为好友列表


测试结果:通过

消息相关测试

用例七:用户发消息,另外一个用户能否即时接收
预期结果:可以即时接收其他用例发来的消息
测试过程:

消息的发送与接收


测试结果:通过

性能测试相关演示:LoadRunner

模拟多个用户同时登录

测试过程:

登录页性能测试

  • 测试数据:在这里插入图片描述
  • 在线用户数:
    在这里插入图片描述
  • 点击率
    在这里插入图片描述
  • 吞吐率
    在这里插入图片描述
  • 平均事务响应时间
    在这里插入图片描述

测试结果:性能基本符合预期,能够承载多用户同时在线。

测试过程中遇到的问题

  • 使用 cssselector 和 XPath 都无法定位到会话元素
    在这里插入图片描述
    在这里插入图片描述
    解决办法:
    先定位父元素,把父元素给一个变量,然后通过这个变量找子元素,逐层递进,直至定位到目标元素。
    在这里插入图片描述

  • 定位最新会话时,通过css选择器获取到的始终时第一条历史消息
    -

    解决办法:查阅资料发现,不能直接复制css路径,需要使用 :last-child 定位消息列表中的最消息
    在这里插入图片描述
    在这里插入图片描述

总结

在“网页聊天室”项目中,通过融合Selenium与JUint进行集成测试,使用Postman实施接口测试,构建测试开发体系。通过针对每个模块的测试用例,验证了登录功能、注册功能、消息发送等核心功能,提高了测试效率。同时还通过LoadRunner搭建高并发场景,模拟多用户同时在线,测试系统的整体性能表现,确保了系统的稳定性。

附录

登录界面相关测试脚本
/*
  *  输入正确的用户名、密码
  *  登录成功
  * */
  @ParameterizedTest
  @CsvFileSource(resources = "LoginSuccess.csv")
  @Order(1)
  void LoginSuccess(String userName,String userPassword,String client_url) throws InterruptedException {
      // 1. 打开聊天室登录页
      webDriver.get("http://60.204.223.152:8080/login.html");
      webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

      // 2. 输入用户名
      WebElement userNameInput = webDriver.findElement(By.cssSelector("#username"));
      userNameInput.sendKeys(userName);
      WebElement passwordInput = webDriver.findElement(By.cssSelector("#password"));
      passwordInput.sendKeys(userPassword);
      webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

      // 3. 点击登录按钮
      webDriver.findElement(By.cssSelector("#submit")).click();
      webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
      sleep(5000);
      // 忽略弹窗
      webDriver.switchTo().alert().dismiss();
      // 4. 页面跳转
      // 5. 判断url是否一致
      String url = webDriver.getCurrentUrl();
      Assertions.assertEquals(client_url, url);

      // 6. 判断展示的用户名是否一致
      String cur_name = webDriver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.user")).getText();
      Assertions.assertEquals(userName, cur_name);
  }
*
    * 输入错误的用户名、密码
    * 登录失败
    * */
    @ParameterizedTest
    @CsvFileSource(resources = "LoginFaild.csv")
    @Order(2)
    @Disabled
    void LoginFaild(String userName,String userPassword,String client_url) throws InterruptedException {
        // 1. 打开聊天室登录页
        webDriver.get("http://60.204.223.152:8080/login.html");
        webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

        // 2. 输入用户名
        WebElement userNameInput = webDriver.findElement(By.cssSelector("#username"));
        userNameInput.sendKeys(userName);
        WebElement passwordInput = webDriver.findElement(By.cssSelector("#password"));
        passwordInput.sendKeys(userPassword);
        webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

        // 3. 点击登录按钮
        webDriver.findElement(By.cssSelector("#submit")).click();
        webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        sleep(5000);
        // 忽略弹窗
        webDriver.switchTo().alert().dismiss();
        // 4. 页面跳转
        // 5. 判断url是否一致
        String url = webDriver.getCurrentUrl();
        Assertions.assertEquals(client_url, url);

        // 6. 判断展示的用户名是否一致
        String cur_name = webDriver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.user")).getText();
        Assertions.assertEquals(userName, cur_name);
    }

注册界面相关测试脚本
/*
    * 输入正确的用户名、密码
    * 注册成功
    * */
    @ParameterizedTest
    @CsvFileSource(resources = "RegisterSuccess.csv")
    @Order(3)
    @Disabled
    void RegisterSuccess (String username,String password,String url) throws InterruptedException {
        // 1. 打开注册页面
        webDriver.get("http://60.204.223.152:8080/register.html");
        webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        // 2. 输入用户名和密码
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        //3. 点击注册按钮
        webDriver.findElement(By.cssSelector("#submit")).click();
        sleep(1000);
        // 忽略弹窗
        webDriver.switchTo().alert().accept();
        webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        // 4. 页面跳转
        // 5. 判断url是否一致
        String cur_url = webDriver.getCurrentUrl();
        Assertions.assertEquals(url, cur_url);
    }

/*
    * 输入错误的用户名、密码
    * 注册失败
    * */
    @ParameterizedTest
    @CsvFileSource(resources = "RegisterFaild.csv")
    @Order(4)
    @Disabled
    void RegisterFaild (String username,String password,String url) throws InterruptedException {
        // 1. 打开注册页面
        webDriver.get("http://60.204.223.152:8080/register.html");
        webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        // 2. 输入用户名和密码
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        //3. 点击注册按钮
        webDriver.findElement(By.cssSelector("#submit")).click();
        sleep(1000);
        // 忽略弹窗
        webDriver.switchTo().alert().accept();
        webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        // 4. 页面跳转
        // 5. 判断url是否不一致
        String cur_url = webDriver.getCurrentUrl();
        Assertions.assertNotEquals(url, cur_url);
    }

主界面相关测试脚本
/*
    * 点击好友按钮
    * 列表切换为好友列表
    * */
    @Test
    @Order(5)
    void ClickFriend() {
        // 1. 打开主界面
        webDriver.get("http://60.204.223.152:8080/client.html");
        webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        // 2. 点击好友按钮
        webDriver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.tab > div.tab-friend")).click();

        webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        // 4. 获取好友名
        // 5. 断言好友名是否一致
        String friendname = webDriver.findElement(By.cssSelector("#friend-list > li:nth-child(1) > h4")).getText();
        Assertions.assertEquals("lisi", friendname);
    }

消息相关测试脚本
/*
    * 用户发消息,另外一个用户能否即时接收
    *
    * */
    @ParameterizedTest
    @CsvFileSource(resources = "SendMessage.csv")
    @Order(6)
    void SendMessage(String message) throws InterruptedException {
        webDriver.get("http://60.204.223.152:8080/client.html");
        webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        // 选中和赵六的会话并点击
        WebElement element1 = webDriver.findElement(By.cssSelector("body > div.client-container"));
        WebElement element2 = element1.findElement(By.cssSelector(".main"));
        WebElement element3 = element2.findElement(By.cssSelector(".left"));
        WebElement element4 = element3.findElement(By.cssSelector(".list"));
        WebElement element5 = element4.findElement(By.cssSelector("li"));
        WebElement element6 = element5.findElement(By.cssSelector("h3"));
        element6.click();
        // 输入消息
        webDriver.findElement(By.cssSelector("body > div.client-container > div > div.right > textarea")).sendKeys(message);
        //点击发送按钮
        webDriver.findElement(By.cssSelector("body > div.client-container > div > div.right > div.ctrl > button")).click();
        sleep(2000);
        // 判断消息是否发送成功
        String cur_message = webDriver.findElement(By.cssSelector("body > div.client-container > div > div.right > div.message-show > div:last-child > div > p")).getText();
        Assertions.assertNotEquals("", cur_message);
    }
    /*
    * 接收消息
    * */
    @Test
    @Order(7)

    void ReceiveMessage() throws InterruptedException {
        //登录
        // 1. 打开聊天室登录页
        webDriver.get("http://60.204.223.152:8080/login.html");
        webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

        // 2. 输入用户名zhaoliu信息
        WebElement userNameInput = webDriver.findElement(By.cssSelector("#username"));
        userNameInput.sendKeys("zhaoliu");
        WebElement passwordInput = webDriver.findElement(By.cssSelector("#password"));
        passwordInput.sendKeys("123");
        webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

        // 3. 点击登录按钮
        webDriver.findElement(By.cssSelector("#submit")).click();
        webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        sleep(1000);
        // 忽略弹窗
        webDriver.switchTo().alert().dismiss();
        // 4. 页面跳转
        // 5. 判断url是否一致
        String url = webDriver.getCurrentUrl();
        Assertions.assertEquals("http://60.204.223.152:8080/client.html", url);
        sleep(1000);
        // 6. 判断展示的用户名是否一致
        String cur_name = webDriver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.user")).getText();
        Assertions.assertEquals("zhaoliu", cur_name);

        // 校验
        // 点击和zhangsan的会话
        WebElement element1 = webDriver.findElement(By.cssSelector("body > div.client-container"));
        WebElement element2 = element1.findElement(By.cssSelector(".main"));
        WebElement element3 = element2.findElement(By.cssSelector(".left"));
        WebElement element4 = element3.findElement(By.cssSelector(".list"));
        WebElement element5 = element4.findElement(By.cssSelector("li"));
        WebElement element6 = element5.findElement(By.cssSelector("h3"));
        element6.click();

        // 获取最新消息
        WebElement lastMessage = webDriver.findElement(By.cssSelector("body > div.client-container > div > div.right > div.message-show > div:last-child > div > p"));
        // 获取好友名
        WebElement friendName = webDriver.findElement(By.cssSelector("body > div.client-container > div > div.right > div.message-show > div:last-child > div > h4"));
        String cur_message = lastMessage.getText();
        String cur_friendName = friendName.getText();
        // 判断好友名是否一致
        Assertions.assertEquals("zhangsan", cur_friendName);
        // 判断消息是否一致
        Assertions.assertNotEquals("", cur_message);

    }

登录页性能测试脚本
Action()
{


	web_submit_data("login", 
		"Action=http://60.204.223.152:8080/login", 
		"Method=POST", 
		"RecContentType=application/json", 
		"Referer=http://60.204.223.152:8080/login.html", 
		"Snapshot=t4.inf", 
		"Mode=HTML", 
		ITEMDATA, 
		"Name=username", "Value=zhangsan", ENDITEM, 
		"Name=password", "Value=123", ENDITEM, 
		LAST);
	
	lr_rendezvous("集合点");
	
	
	web_reg_find("Fail=NotFound",
		"Search=All",
		"SaveCount=",
		"Text=zhangsan",
		LAST);


	web_url("client.html", 
		"URL=http://60.204.223.152:8080/client.html", 
		"Resource=0", 
		"Referer=http://60.204.223.152:8080/login.html", 
		"Snapshot=t6.inf", 
		"Mode=HTML", 
		EXTRARES, 
		"Url=/userInfo", ENDITEM, 
		"Url=/friendList", ENDITEM, 
		"Url=/sessionList", ENDITEM, 
		LAST);
	

	return 0;

}
项目测试源码

ChatRoomTest

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1574616.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算法】两数之和(暴力求解+哈希表)

本题来源---《两数之和》。 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里…

OPPO云VPC网络实践

1 OPPO 云网络现状 随着OPPO业务的快速发展,OPPO云规模增长迅速。大规模虚拟实例的弹性伸缩、低延时需求对网络提出了诸多挑战。原有基于VLAN搭建的私有网络无法解决这些问题,给网络运维和业务的快速上线带来了挑战。 梳理存在的主要问题如下&#xf…

redis 集群模式(redis cluster)介绍

目录 一 redis cluster 相关定义 1, redis cluster 是什么 2,redis 集群的组成 3,集群的作用 4,集群架构图 二 Redis集群的数据分片 1,哈希槽是什么 2,哈希槽如何排布 3,Redis集…

(源码+部署+讲解)基于Springboot+vue校园设施报修系统的设计与实现

前言 💗博主介绍:✌专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 2024年Java精品实战案例《100套》 🍅文末获取源码联系🍅 &#x1f31f…

freeRTOS-day4

1.总结二进制信号量和计数型信号量的区别,以及他们的使用场景。 二进制信号量只有两个状态:0和1。它通常用于线程同步,表示某个线程执行完毕,另一个线程才能开始执行。这种特性使得二进制信号量特别适用于互斥访问共享资源的场景…

ensp 通过cloud连接交换,通过本机直连telnet交换机

#连接图 #cloud配置 绑定本机一个虚拟网卡,勾选双向通信,这样就可以通过真机直接telent到交换机 #交换机配置 #需要将管理口ip配置为绑定的虚拟网卡同网段的IP,便于直接链接 system-view sysname s5700 undo info-center en telnet server…

HTTP 常见的状态码以及其适用场景

是什么 HTTP状态码(英语:HTTP Status Code),用以表示网页服务器超文本传输协议响应状态的3位数字代码 它由 RFC 2616规范定义的,并得到 RFC 2518、RFC 2817、RFC 2295、RFC 2774与 RFC 4918等规范扩展 简单来讲&#…

什么是网络行为监控审计

网络行为监控审计,顾名思义,是指对网络使用者的行为进行实时监控,并对这些行为进行详细记录和审计的过程。 它涉及到对网络流量、用户操作、数据访问等多个方面的监控,旨在发现潜在的安全威胁和违规行为,从而保障网络…

视听杂志知网收录期刊投稿发表论文

《视听》是由国家新闻出版总署批准的正规的,兼有新闻传播、新媒体理论探索的当代学术性省级综合期刊。坚持正确的理论导向,全面展示广播影视事业发展中出现的新情况、新事物,探索现代传媒基础理论,研究网络传播、通讯传播等新媒体…

职场中持续加班的原因、影响及应对策略

在当今竞争激烈的职场环境中,加班已经成为许多行业的常态。本文将探讨持续加班的原因、对员工和企业的负面影响,以及应对持续加班的策略。 一、持续加班的原因 1. 工作任务繁重:在许多企业中,工作任务量过大,员工为了完…

Sora的阅读技术报告

sora的技术报告 走进sorasora的特性sora的介绍sora的实际操作sora的发展安全措施研究技术 走进sora 大家好,我是清风之上。随着人工智能的发展,慢慢的他已经出现在我们生活中的各个角落,其中有API推出的sora,让我们震惊不已&…

Linux多进程通信(4)——消息队列从入门到实战!

Linux多进程通信总结——进程间通信看这一篇足够啦! 1.基本介绍 1)消息队列的本质其实是一个内核提供的链表,内核基于这个链表,实现了一个数据结构,向消息队列中写数据,实际上是向这个数据结构中插入一个…

页面转word的那些事

背景 有些时候需要将页面内容或者是页面的数据通过word进行下载,以方便客户进行二次编辑,而不是直接导出图片或者是pdf。 想在页面端点击下载成word,那必然需要服务端来进行读写文件,无论是你后端编辑好的内容流,还是…

MySQL如何创建存储过程

工作中有时候需要自己去创建存储过程,然后调用存储去获得一些数据等,接下来就给大家介绍下MySQL如何创建存储过程。 语法: CREATE PROCEDURE 存储程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]]) [特性 …] 过…

git生成ssh key并推送到远端仓库

ssh-keygen -t rsa -C "anarckkgmail.com"在用户文件夹中找到id_rsa.pub,把内容复制到gitea的配置里,然后直接用git推送就可以了

HTML基础知识详解(下)(如果想知道html的全部基础知识点,那么只看这一篇就足够了!)

前言:在上一篇文章中,我们已经学习完了超链接标签、列表标签和表格标签,但是我们还有一些标签没有学习,在这篇文章中,我们将学习剩余的标签。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页…

【进阶六】Python实现SDVRPTW常见求解算法——遗传算法(GA)

基于python语言,采用经典遗传算法(GA)对 带硬时间窗的需求拆分车辆路径规划问题(SDVRP) 进行求解。 目录 往期优质资源1. 适用场景2. 代码调整2.1 需求拆分2.2 需求拆分后的服务时长取值问题 3. 求解结果4. 代码片段参…

前端零基础学习web3开发

目录 1 钱包 2 发起交易 3 出块 4 块高 5 矿工 6 Gas费 这一节,我们不说让人神往的比特币,不说自己会不会利用这个虚拟的货币来发财,也不说那些模模糊糊的知识,什么去中心化啦,什么奇妙的加密啦,我们…

深入浅出 -- 系统架构之负载均衡Nginx缓存机制

一、Nginx缓存机制 对于性能优化而言,缓存是一种能够大幅度提升性能的方案,因此几乎可以在各处都能看见缓存,如客户端缓存、代理缓存、服务器缓存等等,Nginx的缓存则属于代理缓存的一种。对于整个系统而言,加入缓存带来…

1.8.4 卷积神经网络近年来在结构设计上的主要发展和变迁——Inception-v2 和Inception-v3

1.8.4 卷积神经网络近年来在结构设计上的主要发展和变迁——Inception-v2 和Inception-v3 前情回顾: 1.8.1 卷积神经网络近年来在结构设计上的主要发展和变迁——AlexNet 1.8.2 卷积神经网络近年来在结构设计上的主要发展和变迁——VGGNet 1.8.3 卷积神经网络近年来…