一.项目背景
1.网页聊天室是一种基于浏览器运行的实时在线聊天系统,允许多用户通过网页端进行文字交互,类似于微信的简易版,用户无需下载APP,通过浏览器快速进入临时讨论,支持用户之间的临时通信,好友管理和历史消息记录查看。
聊天室采用了SpringBoot,SpringMVC作为后端框架,通过WebSocket实现消息的实时传输,前端使用HTML,JavaScript,CSS构建用户界面,项目的自动化测试部分通过Selenium进行编写,结合Java语言进行测试脚本开发,主要对部分功能进行测试。
二.项目功能
网页聊天室主要实现了以下几个功能:登录,消息列表,联系人列表,会话框。
1.登录功能:用户以及密码已经在后端写入了数据库,没有实现用户注册功能,用户名和密码是已经存在的,登陆成功后会弹出弹窗,提示登陆成功,此时我们点击确定按钮就会跳转到会话框页面。
2.会话框:可以会话框页面看到登录用户的昵称,界面上有会话框和联系人两个图标,页面会显示与部分用户的聊天消息,最多不会出现十个字,上面有搜索框可以搜索联系人或某一条消息,但此功能还未实现。
3.消息列表:点进和某人的聊天界面,在输入框输入消息并发送,接收方可以收到发送方发送的消息,也可以在此界面查看到历史消息。
4.联系人列表:此界面会显示联系人好有,点击某一个联系人,他的会话会显示在会话界面的置顶位置,与该联系人进行聊天。
三.测试计划
设计测试用例方法主要从功能测试,界面测试,性能测试,兼容性测试,易用性测试,安全性测试,弱网测试,安装和卸载测试等方面进行测试,但个人博客的测试主要针对核心功能进行测试。
1.测试用例:
2.1.实际执行测试的部分操作步骤/截图
提示:用户名以及密码已经在后端写入了数据库了,是已经存在的,登录成功后点击确定按钮就会跳转到聊天页面
以zhangsan作为用户名为例
1)正常登录
用户名和密码正确,
预期结果:出现弹窗,提示登录成功点击弹窗确定按钮,进入主页面
2)错误登录
用户名错误,密码正确
预期结果:提示登录失败!
3)用户名正确,密码错误
预期结果:提示登录失败!
4)用户名为空,密码不为空
预期结果:提示当前输入的用户名或密码为空!
5)密码为空,用户名不为空
预期结果:提示当前输入的用户名或密码为空!
6)用户名和密码都为空
预期结果:提示当前输入的用户名或密码为空!
2.2.聊天消息列表展示
在此列表页可以看到部分用户最近的聊天,以及联系人的名称,以及最后一条消息的部分内容,点击对应的联系人就会跳转到相应的聊天详情页。
1)列表页
2)聊天详情页
3.3.联系人列表
可以在此列表查看所有的联系人,点击对应的联系人可与其进行聊天,并在聊天消息页将此联系人置顶。
1)联系人列表
2)跳转到相应聊天页
4.4.聊天消息详情展示页
在此列表可以查看具体的信息详情,也可以查看其历史的消息,也可以编辑和发送消息,发送方点击发送按钮接收方会收到消息。
1)消息详情页
2)编辑和发送消息
3)发送消息
4)发送成功
5.搜索框
但此功能还未实现,搜索东西并不能搜出来
四.自动化测试
1.登录界面测试
package tests;
import common.Utils;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
public class LoginPage extends Utils {
public static String url="http://127.0.0.1:8080/login.html";
public LoginPage() {
super(url);
}
//查看是否有登录页面
public void LoginPageRight() throws InterruptedException {
//通过查看页面元素是否存在来检查页面加载是否成功
driver.findElement(By.cssSelector("body > div.login-container > div"));
//页面上是否出现登录文字
driver.findElement(By.cssSelector("body > div.login-container > div > h3"));
Thread.sleep(3000);
driver.findElement(By.cssSelector("#username"));
driver.findElement(By.cssSelector("#password"));
driver.findElement(By.cssSelector("#submit"));
}
//登录成功
public void LoginSuc() throws InterruptedException {
//清除原有的用户名和密码
driver.navigate().refresh();
Thread.sleep(3000);
driver.findElement(By.cssSelector("#username")).sendKeys("zhangsan");
driver.findElement(By.cssSelector("#password")).sendKeys("123");
driver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(3000);
//出现登录成功弹窗,点击确定进入列表页
Alert alert=driver.switchTo().alert();
alert.accept();
Thread.sleep(3000);
//检查点击确定之后是否登陆成功,进入会话列表页
driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.tab > div.tab-friend"));
Thread.sleep(3000);
}
//登录失败
//1.用户名,密码错误
public void LoginFail() throws InterruptedException {
//清除原有的用户名和密码
driver.navigate().refresh();
driver.findElement(By.cssSelector("#username")).sendKeys("zhangsan1");
driver.findElement(By.cssSelector("#password")).sendKeys("1234");
driver.findElement(By.cssSelector("#submit")).click();
//等待弹窗
Thread.sleep(3000);
//出现登录失败弹窗,点击确定按钮重新登陆
Alert alert=driver.switchTo().alert();
String except="登录失败!";
String res=driver.switchTo().alert().getText();
assert res.equals(except);
alert.accept();
Thread.sleep(3000);
driver.navigate().refresh();
Thread.sleep(3000);
}
//2.用户名和密码为空
public void LoginFailNull() throws InterruptedException {
//清除原有的用户名和密码
driver.navigate().refresh();
driver.findElement(By.cssSelector("#submit")).click();
//等待弹窗
Thread.sleep(3000);
//出现登录失败弹窗,点击确定按钮重新登陆
Alert alert=driver.switchTo().alert();
String except="当前输入的用户名或者密码为空!";
String res=driver.switchTo().alert().getText();
assert res.equals(except);
alert.accept();
Thread.sleep(3000);
driver.navigate().refresh();
Thread.sleep(3000);
}
}
2.会话功能测试
package tests;
import common.Utils;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import java.io.IOException;
import java.util.List;
public class SessionPage extends Utils {
public static String url="http://127.0.0.1:8080/client.html";
public SessionPage() {
super(url);
}
//进入会话页成功
public void SessionPageRight() throws IOException, InterruptedException {
//聊天页表
driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.tab > div.tab-session"));
//用户名
String expect="zhangsan";
String res=driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.user")).getText();
assert res.equals(expect);
//好友列表
driver.findElement(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.search > input[type=text]"));
//搜索按钮
driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.search > button"));
//聊天的某一个用户
driver.findElement(By.cssSelector("#session-list > li.selected"));
//消息列表
driver.findElement(By.cssSelector("#session-list"));
//联系人列表
driver.findElement(By.cssSelector("#friend-list"));
Thread.sleep(3000);
getScreenShot(getClass().getName());
Thread.sleep(3000);
}
//点击消息,右侧会话框能正常显示该消息详细信息
public void SessionList() throws InterruptedException, IOException {
//点击消息列表标签页
driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.tab > div.tab-session")).click();
//点击具体会话
driver.findElement(By.cssSelector("#session-list > li:nth-child(1)>h3")).click();
Thread.sleep(3000);
//消息列表
driver.findElement(By.cssSelector("#session-list"));
Thread.sleep(3000);
//遍历每条消息,记录最新消息的用户和消息
List<WebElement> nums=driver.findElements(By.cssSelector("#session-list->li"));
if(nums.size()!= 0){
String name= driver.findElement(By.cssSelector("#session-list > li.selected > h3")).getText();
String text=driver.findElement(By.cssSelector("#session-list > li.selected > p")).getText();
Thread.sleep(3000);
//点击具体会话
driver.findElement(By.cssSelector("#session-list > li:nth-child(1)>h3")).click();
Thread.sleep(3000);
//检查消息和用户名
String nameA=driver.findElement(By.cssSelector("body > div.client-container > div > div.right > div.message-show > div:nth-child(5) > div > p")).getText();
//验证最新一条消息
assert nameA.equals(text);
getScreenShot(getClass().getName());
Thread.sleep(3000);
}
}
}
3.消息详情页
package tests;
import common.Utils;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import java.io.IOException;
import java.util.List;
public class ContactPage extends Utils {
public static String url="http://127.0.0.1:8080/client.html";
public ContactPage() {
super(url);
}
public void ContactPageRight() throws InterruptedException, IOException {
//点击联系人列表
driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.tab > div.tab-friend")).click();
Thread.sleep(3000);
//遍历联系人列表
List<WebElement> nums=driver.findElements(By.cssSelector("#friend-list"));
if(nums.size()!= 0){
String name= driver.findElement(By.cssSelector("#friend-list > li:nth-child(1) > h4")).getText();
Thread.sleep(3000);
//点击置顶联系人
driver.findElement(By.cssSelector("#friend-list > li:nth-child(1) > h4")).click();
Thread.sleep(3000);
//点击具体会话
driver.findElement(By.cssSelector("#session-list > li:nth-child(1)>h3")).click();
Thread.sleep(3000);
//检查消息和用户名
String text=driver.findElement(By.cssSelector("body > div.client-container > div > div.right > div.message-show > div.message.message-right > div > p")).getText();
String nameA=driver.findElement(By.cssSelector("body > div.client-container > div > div.right > div.message-show > div.message.message-right > div > h4")).getText();
//验证最新一条消息
assert text.equals("你好呀!");
getScreenShot(getClass().getName());
Thread.sleep(3000);
}
}
}
4.信息编辑页
package tests;
import common.Utils;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import java.io.IOException;
public class MessageDetailsPage extends Utils {
public static String url="http://127.0.0.1:8080/client.html";
public MessageDetailsPage() {
super(url);
}
//zhangsan给lisi发送消息
public void ChatSuc() throws InterruptedException, IOException {
//点击消息列表标签页
driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.tab > div.tab-session")).click();
//点击具体会话
driver.findElement(By.cssSelector("#session-list > li:nth-child(1)>h3")).click();
Thread.sleep(3000);
//在输入框发送消息
driver.findElement(By.cssSelector("body > div.client-container > div > div.right > textarea")).sendKeys("你好呀!");
Thread.sleep(3000);
//点击发送按钮
driver.findElement(By.cssSelector("body > div.client-container > div > div.right > div.ctrl > button")).click();
Thread.sleep(3000);
//通过屏幕截图验证消息是否发送成功
getScreenShot(getClass().getName());
}
//lisi收到消息
public void Receive() throws InterruptedException {
//退出登录
//1.返回到登录页面
driver.navigate().back();
//2.清空用户账号和密码
driver.navigate().refresh();
//登录李四用户名和密码
Thread.sleep(3000);
driver.findElement(By.cssSelector("#username")).sendKeys("lisi");
driver.findElement(By.cssSelector("#password")).sendKeys("123");
driver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(3000);
//出现登录成功弹窗,点击确定进入列表页
Alert alert=driver.switchTo().alert();
alert.accept();
Thread.sleep(3000);
//检查点击确定之后是否登陆成功,进入会话列表页
driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.user"));
Thread.sleep(3000);
//点击zhangsan会话页
driver.findElement(By.cssSelector("#session-list > li:nth-child(1) > h3")).click();
//获取好友名
String name=driver.findElement(By.cssSelector("body > div.client-container > div > div.right > div.message-show > div.message.message-left > div > h4")).getText();
//获取最后一条消息
String text=driver.findElement(By.cssSelector(" body > div.client-container > div > div.right > div.message-show > div.message.message-left > div > p")).getText();
//判断好友是否一致
assert name.equals("zhangsan");
//判断内容
assert text.equals("你好呀!");
driver.quit();
}
}
5.创建驱动和截屏
package common;
import io.github.bonigarcia.wdm.WebDriverManager;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.Duration;
public class Utils {
public static WebDriver driver;
public static WebDriver createDriver(){
if(driver==null){
WebDriverManager.chromedriver().setup();
ChromeOptions options=new ChromeOptions();
//允许访问所有的链接
options.addArguments("--remote-allow-origins=*");
driver=new ChromeDriver(options);
//等待
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
}
return driver;
}
public Utils(String url){
//调用driver对象
driver=createDriver();
//访问url
driver.get(url);
}
public void getScreenShot(String src) 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());
String filename="./src/test/image/"+dirTime+"/"+src+"-"+fileTime+".png";
File srcFile=((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
//srcFile放到指定位置
FileUtils.copyFile(srcFile,new File(filename));
}
}
6.测试套件
package tests;
import java.io.IOException;
public class RunTests {
public static void main(String[] args) throws InterruptedException, IOException {
LoginPage login=new LoginPage();
login.LoginPageRight();
login.LoginFail();
login.LoginFailNull();
login.LoginSuc();
SessionPage session=new SessionPage();
session.SessionPageRight();
session.SessionList();
ContactPage contact=new ContactPage();
contact.ContactPageRight();
MessageDetailsPage message=new MessageDetailsPage();
message.ChatSuc();
message.Receive();
}
}
7.屏幕截图
8.pom.xml依赖引入
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>WebChatAutoTest</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>5.9.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
</project>