简易的微信聊天网页版【项目测试报告】

文章目录

  • 一、项目背景
  • 二、项目简介
    • 登录功能
    • 好友列表页面
    • 好友会话页面
  • 三、测试工具和环境
  • 四、测试计划
    • 测试用例
    • 部分人工手动测试截图
    • web自动化测试
      • 测试用例
      • 代码框架
      • 配置内容代码文件(Utils.py)
      • 登录页面代码文件(WeChatLogin.py)
      • 好友列表测试用例代码文件(WeChatPeopleDetail.py)
      • 好友会话测试用例代码文件(WeChatFormationDetail.py)
      • 测试项目代码文件(RunTest.py)
  • 五、总结


一、项目背景

本系统采用前后端分离架构实现,通过WebSocket协议实现实时通讯功能,结合数据库进行聊天记录存储,并部署于云服务器。
前端包含三大核心页面:登录验证页、好友会话列表页、通讯录好友页,构建了基础的即时通讯体验。
系统主要实现以下功能模块:个人好友列表、好友消息实时收发、聊天记录查询等功能。

当前版本存在以下待优化点:

  • 1. 用户体系仅支持预设账号登录(需提前录入数据库校验),未开放自主注册通道;
  • 2. 好友关系采用静态数据模拟,暂未实现动态添加/删除功能;
  • 3. 消息状态提示(如已读/送达)功能尚未完整实现。

该即时通讯系统可实现基本的文字消息交互,支持查看历史聊天记录(按时间倒序展示),虽然功能相对基础,
但已构建起网页端即时通讯的核心框架,满足用户基本的文字聊天需求。

二、项目简介

本系统主要实现以下核心功能:

  • 用户登录、
  • 好友消息实时收发、
  • 聊天记录查询。

登录功能

用户需通过预设账号登录(账号信息已固化至数据库,暂不开放自主注册);

  • 登录成功需点击警告窗口中确认按钮,然后跳转至好友会话列表页;
  • 登录异常状态下,警告窗口提示登录失败!

好友列表页面

纵向排列好友列表,展示好友昵称,点击对应的好友跳转到对应的会话窗口。

好友会话页面

顶部状态栏显示当前对话好友昵称;
消息气泡左右分流(右侧绿色为发送方,左侧白色为接收方);
自动加载最近历史记录(按时间倒序排列);
文本输入框支持即时内容发送(点击发送按钮)

三、测试工具和环境

处理器 11th Gen Intel(R) Core(TM) i5-1155G7 @ 2.50GHz 2.50 GHz
机带 RAM: 16.0 GB (15.8 GB 可用)
系统类型: 64 位操作系统, 基于 x64 的处理器
版本: Windows 11 家庭中文版
操作系统版本: 26100.3194

Chrome浏览器版本 :133.0.6943.142(正式版本) (64 位)
自动化脚本运行环境:PyCharm 2024.2.1

四、测试计划

测试用例

部分人工手动测试截图

正常登录:输入预设账号和密码


异常登录:输入未预设账号和密码


正常登录后跳转的页面


正常登录后好友列表页

web自动化测试

测试用例

代码框架

在这里插入图片描述

配置内容代码文件(Utils.py)

# 导入所需的模块
import datetime  # 用于处理日期和时间
import os  # 用于文件和目录操作
import sys  # 用于获取调用栈信息# 导入Selenium相关模块
from selenium import webdriver  # Selenium核心模块
from selenium.webdriver.chrome.service import Service  # Chrome浏览器服务
from webdriver_manager.chrome import ChromeDriverManager  # 自动管理ChromeDriver# 创建浏览器驱动类
class Driver:driver = ""  # 类属性,用于保存浏览器驱动实例def __init__(self):"""初始化浏览器驱动配置"""# 创建Chrome浏览器选项对象(可用于添加扩展、无头模式等配置)options = webdriver.ChromeOptions()# 指定ChromeDriver的路径driver_path = "D:/Downloads/chromedriver-win64/chromedriver-win64/chromedriver.exe"# 创建Chrome浏览器驱动实例self.driver = webdriver.Chrome(executable_path=driver_path,  # 指定驱动路径options=options  # 传入浏览器选项)# 设置隐式等待(作用于整个浏览器生命周期,查找元素时的默认等待时间)self.driver.implicitly_wait(2)  # 单位:秒def getScreeShot(self):"""屏幕截图方法"""# 生成日期格式的目录名(示例:2023-08-01)dirname = datetime.datetime.now().strftime("%Y-%m-%d")# 拼接截图保存路径(上级目录的images文件夹下)screenshot_dir = "../images/" + dirname# 如果目录不存在则创建if not os.path.exists(screenshot_dir):os.mkdir(screenshot_dir)# 生成文件名格式:# 调用当前方法的上层方法名 + 时间戳 + 后缀(示例:test_login_2023-08-01-143045.png)filename = (sys._getframe().f_back.f_code.co_name  # 获取调用该方法的函数名+ datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S")+ ".png")# 保存截图到指定路径self.driver.save_screenshot(os.path.join(screenshot_dir, filename))# 创建全局浏览器驱动实例(可被其他模块导入使用)
WeChatDriver = Driver()

登录页面代码文件(WeChatLogin.py)

# 测试微信登录界面# 从selenium库中导入By类,用于定位网页元素
from selenium.webdriver.common.by import By
# 从selenium库中导入expected_conditions模块,用于设置显示等待的条件
from selenium.webdriver.support import expected_conditions as EC
# 从selenium库中导入WebDriverWait类,用于实现显示等待
from selenium.webdriver.support.wait import WebDriverWait# 从自定义的common.Utils模块中导入WeChatDriver类,用于创建和管理浏览器驱动
from common.Utils import WeChatDriverclass WeChatLogin:# 初始化类属性,用于存储登录页面的URL和浏览器驱动对象url = ""driver = ""def __init__(self):# 给登录页面的URL赋值,这里是本地的登录页面地址self.url = "http://127.0.0.1:8080/login.html"# 获取WeChatDriver类中的driver对象,用于操作浏览器self.driver = WeChatDriver.driver# 打开指定的登录页面self.driver.get(self.url)# 成功登陆的测试用例def LoginSucTest(self):# 若连续多次的send_keys则会出现关键词拼接,而不是替换。若要替换需要先clear# 找到用户名输入框元素,并清空其中的内容self.driver.find_element(By.CSS_SELECTOR, "#username").clear()# 找到密码输入框元素,并清空其中的内容self.driver.find_element(By.CSS_SELECTOR, "#password").clear()# 向用户名输入框中输入正确的用户名 "zhangsan"self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangsan")# 向密码输入框中输入正确的密码 "123"self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123")# 找到登录按钮元素,并点击该按钮进行登录操作self.driver.find_element(By.CSS_SELECTOR, "#submit").click()# 添加显示等待# 创建一个WebDriverWait对象,设置最大等待时间为2秒wait = WebDriverWait(self.driver, 2)# 等待直到页面上出现弹窗wait.until(EC.alert_is_present())# 切换到当前页面的弹窗alert = self.driver.switch_to.alert# 点击弹窗的确认按钮alert.accept()# 查找登录成功页面的元素:昵称:body > div.client-container > div > div.left > div.user# 查找登录成功页面中显示用户昵称的元素,若找到则说明登录成功self.driver.find_element(By.CSS_SELECTOR, "body > div.client-container > div > div.left > div.user")# 添加屏幕截图# 调用WeChatDriver类的getScreeShot方法,对当前页面进行截图WeChatDriver.getScreeShot()# 异常登陆的测试用例def LoginFailTest(self):# 若连续多次的send_keys则会出现关键词拼接,而不是替换。若要替换需要先clear# 找到用户名输入框元素,并清空其中的内容self.driver.find_element(By.CSS_SELECTOR, "#username").clear()# 找到密码输入框元素,并清空其中的内容self.driver.find_element(By.CSS_SELECTOR, "#password").clear()# 错误的用户名# 向用户名输入框中输入错误的用户名 "admin"self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("admin")# 向密码输入框中输入密码 "123"self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123")# 找到登录按钮元素,并点击该按钮进行登录操作self.driver.find_element(By.CSS_SELECTOR, "#submit").click()# 检查是否登录失败:看是否出现弹窗# 添加显示等待# 创建一个WebDriverWait对象,设置最大等待时间为13秒wait = WebDriverWait(self.driver, 13)# 等待直到页面上出现弹窗wait.until(EC.alert_is_present())# 切换到当前页面的弹窗alert = self.driver.switch_to.alert# 点击弹窗的确认按钮alert.accept()# 添加屏幕截图# 调用WeChatDriver类的getScreeShot方法,对当前页面进行截图WeChatDriver.getScreeShot()

好友列表测试用例代码文件(WeChatPeopleDetail.py)

# 导入所需模块
import time  # 时间相关操作
from selenium.webdriver.common.by import By  # Selenium定位策略
from common.Utils import WeChatDriver  # 自定义的微信驱动工具类# 微信联系人详情页测试类
class WeChatPeopleDetail:url = ""  # 页面URL(已通过__init__初始化)driver = ""  # 浏览器驱动实例def __init__(self):"""初始化方法,配置测试环境"""self.url = "http://127.0.0.1:8080/client.html"  # 测试页面地址self.driver = WeChatDriver.driver  # 获取全局浏览器驱动实例self.driver.get(self.url)  # 打开测试页面def PeopleDetailTestByLogin(self):"""登录状态下的详情页测试"""# 验证联系人图标存在性(如果元素未找到会抛出NoSuchElementException)# 使用CSS选择器定位元素self.driver.find_element(By.CSS_SELECTOR,"body > div.client-container > div > div.left > div.tab > div.tab-friend")# 添加固定等待time.sleep(1)  # 强制等待 1 秒,可能影响测试效率# 调用截图方法WeChatDriver.getScreeShot()  # 保存当前页面截图

好友会话测试用例代码文件(WeChatFormationDetail.py)

# 导入所需模块
import time  # 时间相关操作
from selenium.webdriver.common.by import By  # Selenium元素定位策略
from common.Utils import WeChatDriver  # 自定义的微信驱动工具类# 微信消息列表页测试类
class WeChatFormationDetail:url = ""  # 页面URL(已通过__init__初始化)driver = ""  # 浏览器驱动实例def __init__(self):"""初始化方法,配置测试环境"""self.url = "http://127.0.0.1:8080/client.html"  # 测试页面地址self.driver = WeChatDriver.driver  # 获取全局浏览器驱动实例self.driver.get(self.url)  # 打开测试页面def FormationDetailTestByLogin(self):"""登录状态下消息详情页测试(方法名建议改为 test_message_details)"""# 验证消息图标存在性# 使用层级过深的选择器,容易受页面结构变化影响self.driver.find_element(By.CSS_SELECTOR,"body > div.client-container > div > div.left > div.tab > div.tab-session")# 添加固定等待time.sleep(1)  # 强制等待可能导致测试效率低下# 调用截图方法WeChatDriver.getScreeShot()  # 保存当前页面状态

测试项目代码文件(RunTest.py)

# 导入测试模块和工具类
from tests import WeChatLogin  # 微信登录测试类
from tests import WeChatPeopleDetail  # 联系人详情测试类
from tests import WeChatFormationDetail  # 消息列表测试类
from common.Utils import WeChatDriver  # 浏览器驱动工具类if __name__ == '__main__':# 执行登录失败测试用例WeChatLogin.WeChatLogin().LoginFailTest()# 执行登录成功测试用例WeChatLogin.WeChatLogin().LoginSucTest()# 消息列表页面测试WeChatFormationDetail.WeChatFormationDetail().FormationDetailTestByLogin()# 联系人列表页面测试WeChatPeopleDetail.WeChatPeopleDetail().PeopleDetailTestByLogin()# 退出浏览器WeChatDriver.driver.quit()

五、总结

在实际测试中,遇到以下几个问题:

  • (1)遇到页面元素查找的情况,原因是网络渲染过慢造成的;
  • (2)浏览器驱动管理工具 webdriver-manager由于网络环境的问题,不能自动下载对应的浏览器驱动,需自己先下载好,再去指定浏览器驱动安装的路径;
  • (3)有时候出现卡顿,需重新打开编写的自动化脚本软件。

当前系统核心功能基本可用,满足基础聊天需求,但存在以下待改进项:

  • 页面元素定位稳定性需优化

  • 增加浏览器兼容性验证

  • 补充性能测试场景


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

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

相关文章

【开源-鸿蒙土拨鼠大理石系统】鸿蒙 HarmonyOS Next App+微信小程序+云平台

✨本人自己开发的开源项目:土拨鼠充电系统 ✨踩坑不易,还希望各位大佬支持一下,在GitHub给我点个 Start ⭐⭐👍👍 ✍GitHub开源项目地址👉:https://github.com/cheinlu/HarmonyOS-groundhog-mar…

如何停止Oracle expdp/impdp job

一、停止 expdp job举例 1.执行 expdp 命令 $ expdp rui/rui DIRECTORYdmp_dir dumpfilestudyfull_expdp.dmp FULLy logfilestudyfullexpdp.log job_nameexpdp_job2.查看在运行的作业名称 SQL> select job_name,state from dba_datapump_jobs; JOB_NAME …

深入解析SQL Server高级SQL技巧

SQL Server 是一种功能强大的关系型数据库管理系统,广泛应用于各种数据驱动的应用程序中。在开发过程中,掌握一些高级SQL技巧,不仅能提高查询性能,还能优化开发效率。这篇文章将全面深入地探讨SQL Server中的一些高级技巧&#xf…

ES批量查询

在 Elasticsearch 中,multi_search(也称为 msearch)是一种允许你在单个请求中执行多个搜索操作的 API。它可以显著减少网络开销,尤其是在需要执行多个查询时。multi_search 会将多个查询打包成一个请求发送给 Elasticsearch&#…

安装 cnpm 出现 Unsupported URL Type “npm:“: npm:string-width@^4.2.0

Unsupported URL Type "npm:": npm:string-width^4.2.0 可能是 node 版本太低了,需要安装低版本的 cnpm 试试 npm cache clean --force npm config set strict-ssl false npm install -g cnpm --registryhttps://registry.npmmirror.com 改为 npm insta…

计算机基础面试(数据库)

1. 事务的ACID特性?如何通过日志保证原子性和持久性? 专业解答: ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Dura…

fastjson1.2.24 CVE-2017-18349 漏洞复现

fastjson1.2.24 CVE-2017-18349 漏洞复现 时间不等人啊/(ㄒoㄒ)/~~ 0. 前置知识 建议直接看参考链接 JNDI:Java命名和目录接口 RMI:远程方法调用注册表 LDAP:轻量级目录访问协议 CORBA:公共对象请求代理体系结构 1. jndi …

【计算机视觉】手势识别

手势识别是计算机视觉领域中的重要方向,通过对摄像机采集的手部相关的图像序列进行分析处理,进而识别其中的手势,手势被识别后用户就可以通过手势来控制设备或者与设备交互。完整的手势识别一般有手的检测和姿态估计、手部跟踪和手势识别等。…

Leetcode 37: 解数独

Leetcode 37: 解数独 是经典的回溯算法问题,考察如何利用递归和剪枝高效求解数独问题。这题主要考察对回溯、递归、深度优先搜索 (DFS)、剪枝优化等算法思想的掌握。 题目描述 给定一个部分填充的数独(9 x 9)网格,用一个有效的算…

VSCode 移除EmmyLua插件的红色波浪线提示

VSCode 中安装插件EmmyLua,然后打开lua文件的时候,如果lua代码引用了C#脚本的变量,经常出现 “undefined global variable: UnityEngineEmmyLua(undefined-global)” 的红色波浪线提示,这个提示看着比较烦人,我们可以通…

【音视频】视频基本概念

一、视频的基本概念 1.1 视频码率(kb/s) 视频码率是指视频文件在单位时间内使用的数据流量,也叫码流率。码率越大,说明单位时间内取样率越大,数据流进度也就越高 1.2 视频帧率(fps) 视频帧率…

Grafana服务安装并启动

Grafana服务安装并启动 1、介绍2、下载Grafana3、解压缩文件4、启动Grafana服务5、增加数据源,填写Prometheus访问地址6、增加图表 1、介绍 Grafana是一个开源的可视化系统监控和警报工具包。 2、下载Grafana 介绍:Grafana是一个开源的可视化系统监控和警报工具包…

如何将hf-mirror.com作为vllm默认的下载源? conda如何移除虚拟环境?conda 如何复制一份虚拟环境?

前言 上回咱说道,如果你没办法访问huggingface.co,则可以把modelscope作为vllm默认的下载源。 但如果你非得用你用不了的huggingface.co呢?那你可以考虑将hf-mirror.com作为vllm默认的下载源。这里,hf-mirror.com和huggingface.co的效果是一样的。 要将hf-mirror.com设为v…

MySQL零基础教程14—子查询

子查询比较简单,我们还是通过案例引入。 有时候我们查询的时候,需要用到的不止一个表的数据,比如下面的场景: 查询名字叫李晓红同学的班主任姓名 我们提供三个表的基础信息如下: 从三张表的结构,我们不难…

基于单片机和Wifi技术的智能台灯设计

摘要 :本文主要介绍了基于单片机AT89C51和Wifi技术的智能台灯的硬件和软件设计。该智能台灯具有根据当前光线自动调节灯光亮度的功能,还可对用户使用台灯时处于非正常的距离和姿态时给予报警提示,用户可以随时通过手机app查询智能台灯的报警记…

最新版AI大模型面试八股文

1、主流的开源大模型体系有哪些,并简要介绍它们的特点? 这个问题考察面试者对当前大模型生态的了解,包括如 Transformer-based 模型(如 BERT, GPT 系 列)、T5、Switch Transformer 等,以及它们的架构特点和…

在MySQL拿到一条慢SQL语句要如何优化?

在工作的过程中,很多时候会发现执行业务逻辑的时候,某一条SQL语句执行得非常慢。这时候,要如何处理这条语句,如何判断语句慢的地方在哪里? 一、初级排查 EXPLAIN慢SQL分析 MySQL官网用法: https://dev.mys…

leetcode hot 100 239. 滑动窗口最大值

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1: 输入:nums [1,3,-1,-3,5,3,6,7], k 3 输…

Leetcode 189: 轮转数组

Leetcode 189: 轮转数组 这是一道经典问题,题目要求将一个数组向右轮转 k 个位置,有多种解法可以快速求解,既可以通过额外空间,也可以在 O(1) 的空间复杂度内完成。本题考察数组操作、双指针,以及算法优化能力。 题目…

优选算法的智慧之光:滑动窗口专题(二)

专栏:算法的魔法世界​​​​​​ 个人主页:手握风云 目录 一、例题讲解 1.1. 最大连续1的个数 III 1.2. 找到字符串中所有字母异位词 1.3. 串联所有单词的子串 1.4. 最小覆盖子串 一、例题讲解 1.1. 最大连续1的个数 III 题目要求是二进制数组&am…