网络驿站聊天室--测试报告

目录

一.测试目标及测试任务概况

二.测试文档

三.测试用例

3.1登录界面测试用例

3.2注册界面测试用例

3.3主页面测试用例

四.手动功能测试系统

4.1注册页面

4.2登录页面

4.3主页面

4.3.1首页

4.3.2会话列表

4.3.3聊天区

4.3.4好友搜索框

4.3.5添加好友

4.3.6好友列表

4.3.7查看好友申请

4.3.8处理好友申请

4.3.9登录后长时间未操作

五.兼容性测试

六.易用性测试

七.界面测试

八.自动化测试

8.1导入依赖包---pom.xml

[8.2创建 Utils 类,用于存放自动化代码中的通用方法:](#8.2创建 Utils 类,用于存放自动化代码中的通用方法:)

8.3注册页面测试

8.4登录页面测试

8.5主页面测试

8.6搜索和添加好友测试

8.7好友验证测试

8.8聊天功能测试

九.性能测试

9.1线程组设计

9.2测试报告

9.3测试结果分析

十.安全性测试

[10.1 SQL注入](#10.1 SQL注入)

10.2未登录状态是否可以直接访问其他页面

10.3数据库中的密码是否处于加密状态

10.4在传输过程中密码是否处于加密状态

10.5在输入密码栏中,密码是否处于隐藏状态

10.6用户密码校验是否由后端校验而不是简单的JavaScript校验

10.7同一个用户在多个浏览器上登录,是否能够有安全提醒

十一.测试总结


一.测试目标及测试任务概况

验证网页版聊天系统各个模块功能完整性,以及确保用户登录功能、用户注册功能、主页面、会话列表、好友列表、消息区域、消息传输功能、添加好友功能等核心模块符合要求

二.测试文档

|----------|--------------------------------|
| 类别 | 配置/版本 |
| 硬件 | Predator PHN16-71 |
| 手动测试浏览器 | Chrome Chrome版本 132.0.6827.0 |
| 开发工具 | IntelliJ IDEA 2022.1.4 |
| 自动化测试工具 | Selenium 4.0.0 |
| 操作系统 | Windows 11 家庭中文版 |
| 自动化测试浏览器 | Microsoft Edge版本 144.0.3719.82 |

三.测试用例

3.1登录界面测试用例

避免图片模糊,在此放下图片链接:

https://i-blog.csdnimg.cn/direct/6e37e4a83c0b48239b468523f1d70c46.png

3.2注册界面测试用例

避免图片模糊,在此放下图片链接:

https://i-blog.csdnimg.cn/direct/84e5387d14544612b9a51fbb62da300b.png

3.3主页面测试用例

避免图片模糊,在此放下图片链接:

https://i-blog.csdnimg.cn/direct/25b5c1111a83499c9e228581abdaa5dd.png

四.手动功能测试系统

4.1注册页面

①正确的用户名和密码(用户名长度不大于20且密码长度不小于5)

预期结果:注册成功后自动跳转回登录界面,并且可以正常登录进入主页面

②不输入用户名,输入登录密码

预期结果:提示用户名或密码为空

③输入用户名,不输入登录密码

预期结果:提示用户名或密码为空

④输入已存在的用户名

预期结果:提示注册失败,用户名重复

⑤输入长度大于20的用户名,长度不小于5的密码

预期结果:提示用户名长度范围为1-20

⑥输入长度不大于20的非空用户名,输入长度小于5的密码

预期结果:提示密码长度不能小于5

4.2登录页面

①输入正确的用户名和密码

预期结果:登录成功,正常进入网页版聊天界面

②用户名为空,输入正确的密码

预期结果:登录失败,并提示:用户名或密码为空

③密码为空,输入正确的用户名

预期结果:登录失败,并提示:用户名或密码为空

④输入正确的用户名和错误密码

预期结果:登录失败,提示:错误的密码

⑤输入错误的用户名和正确密码

预期结果:登录失败,提示:用户名不存在

4.3主页面

4.3.1首页

①默认处于会话列表,并且聊天区内容为空

预期结果:默认处于会话列表,并且聊天区内容为空

4.3.2会话列表

①点击会话列表

预期结果:进入会话列表,并切换图标

②若存在会话,则展示之前会话,并附带聊天记录的最后一句

预期结果:展示之前所有的会话和聊天记录的最后一句

③点击会话,会在聊天区展示之前的历史聊天记录

预期结果:会展示与该用户的历史聊天记录

4.3.3聊天区

①未选择会话,且输入内容为空,点击发送

预期结果:无法发送

②未选择会话,但有输入内容,点击发送

预期结果:无法发送

③选择会话,但输入内容为空,点击发送

预期结果:无法发送

④选择会话,输入内容并点击发送

预期结果:成功发送消息

4.3.4好友搜索框

①点击"搜索用户"的搜索栏,可以输入用户名进行搜索,但不点击搜索按钮

预期结果:点击"搜索用户"的搜索栏,可以输入用户名,但并不会进行搜索结果,并且仍然处于会话列表

②点击"搜索用户"的搜索栏,输入不存在的用户名进行搜索,并点击搜索按钮

预期结果:点击"搜索用户"的搜索栏,可以输入用户名,但搜索结果显示为未找到相关用户,并切换为好友列表,图标变绿

③点击"搜索用户"的搜索栏,输入存在的用户名进行搜索,并点击搜索按钮

预期结果:点击"搜索用户"的搜索栏,可以输入用户名,搜索结果为搜索用户名的用户,并切换为好友列表,图标变绿

4.3.5添加好友

①点击添加好友按钮

预期结果:点击添加好友按钮,会弹出要发送的验证消息输入框,并且默认发送语句为"我想加你为好友"并自动全选

②点击添加好友按钮,并在发送验证消息弹窗中输入验证信息

预期结果:点击添加好友按钮,会弹出要发送的验证消息输入框,并且默认发送语句为"我想加你为好友"并自动全选,在输入验证信息后,会变成修改后的验证信息

③点击添加好友按钮,并点击发送验证信息弹窗的取消按钮

预期结果:好友申请并不会成功发送

④点击添加好友按钮,并点击发送验证信息弹窗的确认按钮

预期结果:好友申请成功发送,对方同时会接收到好友申请信息

④搜索已发送好友申请的用户,并点击添加好友按钮

预期结果:好友申请发送失败,并提示"可能是已发送过请求或已是好友"

⑤搜索已经是好友申请的用户,并点击添加好友按钮

预期结果:好友申请发送失败,并提示"可能是已发送过请求或已是好友"

4.3.6好友列表

①点击查看好友列表按钮

预期结果:切换为查看好友列表,并切换图标

②点击好友,且之前没有聊过天

预期结果:切换到会话列表,并创建新会话

③点击好友,且之前聊过天

预期结果:切换到会话列表,并获取之前的会话

4.3.7查看好友申请

①点击查看好友申请按钮

预期结果:切换为查看好友申请列表,并切换图标

②若当前没有好友申请,则显示"暂无好友请求"

预期结果:显示"暂无好友请求"

③若当前存在好友申请,并且好友申请为一条,则显示该条好友申请信息

预期结果:显示该条好友申请信息

④若当前存在好友申请,并且好友申请为两条及以上,则显示所有好友申请信息

预期结果:显示所有好友申请信息

4.3.8处理好友申请

①点击同意按钮

预期结果:好友添加成功,在好友列表中可以查看到该用户,且好友申请信息删除,若还有好友申请,则会展示剩下的好友申请信息

②点击拒绝按钮

预期结果:好友添加失败,在好友列表中不能查看到该用户,且好友申请信息删除,若没有好友申请,则会展示暂无好友请求

③不点击任何按钮

预期结果:将一直存在于好友申请列表中,处于未处理状态

4.3.9登录后长时间未操作

①登录后长时间未操作

预期结果:登录信息过期,显示当前用户未登录,并跳转回登录界面

五.兼容性测试

①在Chrome浏览器下进入网页版聊天系统

预期结果:无异常且一切布局显示功能等与其一致

②在Edge浏览器下进入网页版聊天系统

预期结果:无异常且一切布局显示功能等与其一致

③在手机自带浏览器下进入网页版聊天系统

预期结果:无异常且一切布局显示功能等与其一致

实际结果:主页面显示不完整

Bug:在手机移动端,主页面不能完全展示

六.易用性测试

①键盘中Tab键Enter键是否可用

预期结果:按下Tab键可以切换焦点,Enter键可代替点击登录和注册按键

实际结果:按下Tab键可以切换焦点,但Enter只有当焦点处于登录和注册按钮时才可用

Bug:只有当焦点处于登录和注册按键时Enter键才可用,其他区域不可用
②切换大小写时,输入框是否有提示

预期结果:有提示

实际情况:并没有大小写提醒

Bug:按下切换大小写键,网页上并无提醒
③是否有错误提示的引导

预期结果:有错误提示的引导

④是否符合普遍登录流程逻辑

预期结果:符合普遍登录流程逻辑

实际结果:符合普遍登录流程逻辑
⑤是否有记住密码和账号

预期结果:有

实际结果:浏览器能有记住密码和账号的功能,但系统自带并没有

七.界面测试

登录和注册页面图片正确显示、不遮挡关键信息、页面无错别字:

主页面图片正确显示、不遮挡关键信息、页面无错别字:

八.自动化测试

8.1导入依赖包---pom.xml

java 复制代码
<?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>BlogUIAutoTest</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>io.github.bonigarcia</groupId>
            <artifactId>webdrivermanager</artifactId>
            <version>5.8.0</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
    </dependencies>

</project>

8.2创建 Utils类,用于存放自动化代码中的通用方法:

java 复制代码
public class Utils {
    public static WebDriver driver=null;

    public Utils(String url){

        driver=createDriver();

        driver.get(url);
    }
    //获取驱动对象
    public static WebDriver createDriver(){
        if(driver==null){

            //下载驱动
            System.setProperty("webdriver.edge.driver", "D:\\drivers\\edgedriver_win64\\msedgedriver.exe");
            WebDriverManager.edgedriver().setup();
            //添加配置:允许访问所有的连接
            EdgeOptions options=new EdgeOptions();

            options.addArguments("--remote-allow-origins=*");
            //创建驱动对象
            driver=new EdgeDriver(options);

            //隐式等待
            driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
        }
        return driver;
    }

    public void ScreenShot(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());

        String fileName="./src/test/java/images/"+dirTime+"/"+str+"-"+fileTime+".png";
        File srcFile=((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
        FileUtils.copyFile(srcFile,new File(fileName));
    }

    //销毁driver对象,关闭浏览器
    public static void quit()
    {
        if(driver != null)
            driver.quit();
    }
}

8.3注册页面测试

java 复制代码
package tests;

import common.Utils;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.support.ui.ExpectedConditions;

import java.io.IOException;

public class RegisterPage extends Utils {
    public static String url="http://117.72.166.68:8081/register.html";

    public RegisterPage() {
        super(url);
    }

    /**
     * 注册页面可以正常打开
     */
    public void checkPageRight() throws IOException {
        //检查输入框和提交按键
        driver.findElement(By.cssSelector("#username"));
        driver.findElement(By.cssSelector("#password"));
        driver.findElement(By.cssSelector("#submit"));
        ScreenShot(Thread.currentThread().getStackTrace()[1].getMethodName());
    }
    /**
     * 成功注册
     */
    public void RegisterSuc() throws IOException{

        //先清空输入框
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();

        //输入正确的用户名和密码:Suc_test 12345
        driver.findElement(By.cssSelector("#username")).sendKeys("Suc_test");
        driver.findElement(By.cssSelector("#password")).sendKeys("12345");
        driver.findElement(By.cssSelector("#submit")).click();

        //通过显示等待等待弹窗出现
        wait.until(ExpectedConditions.alertIsPresent());

        //处理注册成功弹窗
        Alert alert=driver.switchTo().alert();
        alert.accept();
        //检查是否跳转到登录页面(查询只有登录页面才有的注册跳转按钮)
        driver.findElement(By.cssSelector("#registerBtn"));
        String regi=driver.getTitle();
        ScreenShot(Thread.currentThread().getStackTrace()[1].getMethodName());
        assert regi.equals("登录页面");
    }

    /**
     * 用户名为空
     */
    public void RegisterFail1() throws IOException {
        //先清空输入框
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();

        //输入错误的用户名和密码: 12345
        driver.findElement(By.cssSelector("#password")).sendKeys("12345");
        driver.findElement(By.cssSelector("#submit")).click();

        //通过显示等待等待弹窗出现
        wait.until(ExpectedConditions.alertIsPresent());

        //处理注册失败弹窗
        Alert alert=driver.switchTo().alert();
        //获取弹窗的内容(当出现弹窗时,不能截图)
        String alertText=alert.getText();
        alert.accept();
        ScreenShot(Thread.currentThread().getStackTrace()[1].getMethodName());

        assert alertText.equals("您输入的用户名或密码为空!");
    }

    /**
     * 输入已经注册过的账户
     */
    public void RegisterFail2() throws IOException {
        //先清空输入框
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();

        //输入已经注册过的用户名和密码:Suc_test 12345
        driver.findElement(By.cssSelector("#username")).sendKeys("Suc_test");
        driver.findElement(By.cssSelector("#password")).sendKeys("12345");
        driver.findElement(By.cssSelector("#submit")).click();

        //通过显示等待等待弹窗出现
        wait.until(ExpectedConditions.alertIsPresent());

        //处理注册失败弹窗
        Alert alert=driver.switchTo().alert();
        alert.accept();

        //通过显示等待等待弹窗出现
        wait.until(ExpectedConditions.alertIsPresent());

        //处理注册失败弹窗
        alert=driver.switchTo().alert();
        //获取弹窗的内容(当出现弹窗时,不能截图)
        String alertText=alert.getText();
        alert.accept();

        ScreenShot(Thread.currentThread().getStackTrace()[1].getMethodName());

        assert alertText.equals("用户名重复,请更改用户名");
    }

    /**
     * 输入长度不合法的密码
     */
    public void RegisterFail3() throws IOException {
        //先清空输入框
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();

        //输入长度不合法的密码:Suc_test1 123
        driver.findElement(By.cssSelector("#username")).sendKeys("Suc_test1");
        driver.findElement(By.cssSelector("#password")).sendKeys("123");
        driver.findElement(By.cssSelector("#submit")).click();

        //通过显示等待等待弹窗出现
        wait.until(ExpectedConditions.alertIsPresent());

        //处理注册失败弹窗
        Alert alert=driver.switchTo().alert();
        alert.accept();

        //通过显示等待等待弹窗出现
        wait.until(ExpectedConditions.alertIsPresent());

        //处理注册失败弹窗
        alert=driver.switchTo().alert();
        //获取弹窗的内容(当出现弹窗时,不能截图)
        String alertText=alert.getText();
        alert.accept();

        ScreenShot(Thread.currentThread().getStackTrace()[1].getMethodName());

        assert alertText.equals("密码长度不能少于5");
    }
}

8.4登录页面测试

java 复制代码
package tests;

import common.Utils;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.support.ui.ExpectedConditions;

import java.io.IOException;

public class LoginPage extends Utils {
    public static String url="http://117.72.166.68:8081/login.html";

    public LoginPage() {
        super(url);
    }

    /**
     * 检查页面是否能正常访问或者展示出来
     */
    public void LoginPage() throws InterruptedException{
        //通过查看页面元素是否存在来检查页面是否加载成功与否
        driver.findElement(By.cssSelector("#username"));
        driver.findElement(By.cssSelector("#password"));
        driver.findElement(By.cssSelector("#submit"));
        driver.findElement(By.cssSelector("#registerBtn"));
    }

    /**
     *成功登录
     */
    public void LoginSuc() throws IOException {

        //先清空输入框
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();

        driver.findElement(By.cssSelector("#username")).sendKeys("Suc_test");
        driver.findElement(By.cssSelector("#password")).sendKeys("12345");
        driver.findElement(By.cssSelector("#submit")).click();

        //通过显示等待等待弹窗出现
        wait.until(ExpectedConditions.alertIsPresent());

        //处理成功登录弹窗
        Alert alert=driver.switchTo().alert();
        alert.accept();

        //检查是否跳转到主页面(查询只有主页面页面才有的元素)
        driver.findElement(By.cssSelector("body > div.client-container > div > div.right > div.ctrl > button"));
        driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.user"));
        String title=driver.getTitle();
        ScreenShot(Thread.currentThread().getStackTrace()[1].getMethodName());
        assert title.equals("网页聊天程序");
    }

    /**
     * 登录失败-输入正确的用户名和错误的密码
     */
    public void LoginFail1() throws IOException {

        //先清空输入框
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();

        driver.findElement(By.cssSelector("#username")).sendKeys("Suc_test");
        driver.findElement(By.cssSelector("#password")).sendKeys("123456");
        driver.findElement(By.cssSelector("#submit")).click();

        //通过显示等待等待弹窗出现
        wait.until(ExpectedConditions.alertIsPresent());

        //处理登录失败弹窗
        Alert alert=driver.switchTo().alert();
        alert.accept();

        alert=driver.switchTo().alert();
        String alertText= alert.getText();
        alert.accept();

        ScreenShot(Thread.currentThread().getStackTrace()[1].getMethodName());

        assert alertText.equals("用户密码错误");
    }

    /**
     * 登录失败-输入错误的用户名和正确的密码
     */
    public void LoginFail2() throws IOException {

        //先清空输入框
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();

        driver.findElement(By.cssSelector("#username")).sendKeys("Suc_test1");
        driver.findElement(By.cssSelector("#password")).sendKeys("12345");
        driver.findElement(By.cssSelector("#submit")).click();

        //通过显示等待等待弹窗出现
        wait.until(ExpectedConditions.alertIsPresent());

        //处理登录失败弹窗
        Alert alert=driver.switchTo().alert();
        alert.accept();

        alert=driver.switchTo().alert();
        String alertText= alert.getText();
        alert.accept();

        ScreenShot(Thread.currentThread().getStackTrace()[1].getMethodName());

        assert alertText.equals("用户不存在");
    }

    /**
     * 登录失败-输入空的用户名
     */
    public void LoginFail3() throws IOException {

        //先清空输入框
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();

        driver.findElement(By.cssSelector("#password")).sendKeys("12345");
        driver.findElement(By.cssSelector("#submit")).click();

        //通过显示等待等待弹窗出现
        wait.until(ExpectedConditions.alertIsPresent());

        //处理登录失败弹窗
        Alert alert=driver.switchTo().alert();
        String alertText= alert.getText();
        alert.accept();

        ScreenShot(Thread.currentThread().getStackTrace()[1].getMethodName());

        assert alertText.equals("当前输入的用户名或者密码为空!");
    }

    /**
     * 登录失败-输入空的密码
     */
    public void LoginFail4() throws IOException {

        //先清空输入框
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();

        driver.findElement(By.cssSelector("#username")).sendKeys("Suc_test");
        driver.findElement(By.cssSelector("#submit")).click();

        //通过显示等待等待弹窗出现
        wait.until(ExpectedConditions.alertIsPresent());

        //处理登录失败弹窗
        Alert alert=driver.switchTo().alert();
        String alertText= alert.getText();
        alert.accept();

        ScreenShot(Thread.currentThread().getStackTrace()[1].getMethodName());

        assert alertText.equals("当前输入的用户名或者密码为空!");
    }
}

8.5主页面测试

java 复制代码
package tests;

import common.Utils;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.support.ui.ExpectedConditions;

import java.io.IOException;

public class HomePage extends Utils {
    public static String url="http://117.72.166.68:8081/client.html";
    public HomePage(){
        super(url);
    }

    /**
     * 未登录状态下进入主页面
     */
    public void NoLoginHome() throws IOException {

        //通过显示等待等待弹窗出现
        wait.until(ExpectedConditions.alertIsPresent());

        //处理登录失败弹窗
        Alert alert=driver.switchTo().alert();
        alert.accept();

        wait.until(ExpectedConditions.alertIsPresent());

        //处理当前用户未登录的弹窗
        alert=driver.switchTo().alert();
        alert.accept();

        wait.until(ExpectedConditions.alertIsPresent());

        //处理当前用户未登录的弹窗
        alert=driver.switchTo().alert();
        alert.accept();

        String title=driver.getTitle();

        ScreenShot(Thread.currentThread().getStackTrace()[1].getMethodName());

        assert title.equals("登录页面");
    }

    /**
     *登录状态下进入主页面,功能是否齐全
     */
    public void LoginProject() throws IOException {
        //先清空输入框
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();

        driver.findElement(By.cssSelector("#username")).sendKeys("Suc_test");
        driver.findElement(By.cssSelector("#password")).sendKeys("12345");
        driver.findElement(By.cssSelector("#submit")).click();

        //通过显示等待等待弹窗出现
        wait.until(ExpectedConditions.alertIsPresent());

        //处理成功登录弹窗
        Alert alert=driver.switchTo().alert();
        alert.accept();

        //等待页面元素加载完成
        wait.until(ExpectedConditions.textToBePresentInElementLocated(By.cssSelector("#login-user-name"),"Suc_test"));

        //是否为当前登录用户
        String userName = driver.findElement(By.cssSelector("#login-user-name")).getText();
        assert userName.equals("Suc_test");

        //所有功能是否存在
        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("body > div.client-container > div > div.left > div.tab > div.tab-session"));
        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.tab > div.tab-request"));
        driver.findElement(By.cssSelector("body > div.client-container > div > div.right > div.ctrl > button"));
        driver.findElement(By.cssSelector("body > div.client-container > div > div.right > textarea"));
        driver.findElement(By.cssSelector("body > div.client-container > div > div.right > div.message-show"));
        driver.findElement(By.cssSelector("#session-list"));
        driver.findElement(By.cssSelector("body > div.client-container > div > div.right > div.title"));

        String title=driver.getTitle();
        ScreenShot(Thread.currentThread().getStackTrace()[1].getMethodName());
        assert title.equals("网页聊天程序");
    }
}

8.6搜索和添加好友测试

java 复制代码
package tests;

import common.Utils;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.support.ui.ExpectedConditions;

import java.io.IOException;

public class SearchFriend extends Utils {
    public static String url="http://117.72.166.68:8081/login.html";

    public SearchFriend(){
        super(url);
    }

    /**
     * 输入存在的用户,进行搜索并添加
     */
    public void SearchSuc() throws IOException {
        //先清空输入框
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();

        driver.findElement(By.cssSelector("#username")).sendKeys("Suc_test");
        driver.findElement(By.cssSelector("#password")).sendKeys("12345");
        driver.findElement(By.cssSelector("#submit")).click();

        //通过显示等待等待弹窗出现
        wait.until(ExpectedConditions.alertIsPresent());

        //处理登录成功弹窗
        Alert alert=driver.switchTo().alert();
        alert.accept();

        //等待页面元素加载完成
        wait.until(ExpectedConditions.textToBePresentInElementLocated(By.cssSelector("#login-user-name"),"Suc_test"));

        //进行搜索
        driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.search > input[type=text]")).sendKeys("kk");
        driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.search > button")).click();

        //是否能正确查询
        String FriendName = driver.findElement(By.cssSelector("#search-result-list > li > h4")).getText();
        assert FriendName.equals("kk");

        //点击添加好友
        driver.findElement(By.cssSelector("#search-result-list > li > span")).click();

        //通过显示等待等待弹窗出现
        wait.until(ExpectedConditions.alertIsPresent());

        alert=driver.switchTo().alert();
        alert.sendKeys("我是测试");
        alert.accept();

        //通过显示等待等待弹窗出现
        wait.until(ExpectedConditions.alertIsPresent());

        alert=driver.switchTo().alert();
        alert.accept();

        ScreenShot(Thread.currentThread().getStackTrace()[1].getMethodName());
    }

    /**
     * 输入不存在的用户,查询结果为空
     */
    public void SearchFriendFail() throws IOException {
        //先清空输入框
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();

        driver.findElement(By.cssSelector("#username")).sendKeys("Suc_test");
        driver.findElement(By.cssSelector("#password")).sendKeys("12345");
        driver.findElement(By.cssSelector("#submit")).click();

        //通过显示等待等待弹窗出现
        wait.until(ExpectedConditions.alertIsPresent());

        //处理登录成功弹窗
        Alert alert=driver.switchTo().alert();
        alert.accept();

        //等待页面元素加载完成
        wait.until(ExpectedConditions.textToBePresentInElementLocated(By.cssSelector("#login-user-name"),"Suc_test"));

        //进行搜索
        driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.search > input[type=text]")).sendKeys("kk1");
        driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.search > button")).click();

        //是否能正确查询
        String FriendName = driver.findElement(By.cssSelector("#search-result-list > li > h4")).getText();
        assert FriendName.equals("未找到相关用户");

        ScreenShot(Thread.currentThread().getStackTrace()[1].getMethodName());
    }
}

8.7好友验证测试

java 复制代码
package tests;

import common.Utils;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;

import java.io.IOException;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 86152
 * Date: 2026-01-26
 * Time: 12:26
 */
public class Verification extends Utils {
    public static String url="http://117.72.166.68:8081/login.html";

    public Verification(){
        super(url);
    }

    /**
     * 同意好友申请
     */
    public void Agree() throws IOException {
        //先清空输入框
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();

        driver.findElement(By.cssSelector("#username")).sendKeys("kk");
        driver.findElement(By.cssSelector("#password")).sendKeys("12345");
        driver.findElement(By.cssSelector("#submit")).click();

        //通过显示等待等待弹窗出现
        wait.until(ExpectedConditions.alertIsPresent());

        //处理登录成功弹窗
        Alert alert=driver.switchTo().alert();
        alert.accept();

        //等待页面元素加载完成
        wait.until(ExpectedConditions.textToBePresentInElementLocated(By.cssSelector("#login-user-name"),"kk"));

        //切换到好友申请列表
        driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.tab > div.tab-request")).click();

        //找到好友申请并同意
        assert driver.findElement(By.cssSelector("#request-list > li > h4")).getText().equals("Suc_test");
        driver.findElement(By.cssSelector("#request-list > li > div.request-message"));
        driver.findElement(By.cssSelector("#request-list > li > div.request-actions > span.accept-btn")).click();

        //通过显示等待等待弹窗出现
        wait.until(ExpectedConditions.alertIsPresent());

        //处理好友同意弹窗
        alert=driver.switchTo().alert();
        alert.accept();

        //切换回好友列表
        driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.tab > div.tab-friend")).click();

        //找到刚添加的好友
        WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id='friend-list']/li[2]/h4[text()='Suc_test']")));

        assert element.getText().equals("Suc_test");

        ScreenShot(Thread.currentThread().getStackTrace()[1].getMethodName());
    }

    /**
     * 拒绝好友申请
     */
    public void Reject() throws IOException {
        //先清空输入框
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();

        driver.findElement(By.cssSelector("#username")).sendKeys("kk");
        driver.findElement(By.cssSelector("#password")).sendKeys("12345");
        driver.findElement(By.cssSelector("#submit")).click();

        //通过显示等待等待弹窗出现
        wait.until(ExpectedConditions.alertIsPresent());

        //处理登录成功弹窗
        Alert alert=driver.switchTo().alert();
        alert.accept();

        //等待页面元素加载完成
        wait.until(ExpectedConditions.textToBePresentInElementLocated(By.cssSelector("#login-user-name"),"kk"));

        //切换到好友申请列表
        driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.tab > div.tab-request")).click();

        //找到好友申请并拒绝
        assert driver.findElement(By.cssSelector("#request-list > li > h4")).getText().equals("admin");
        driver.findElement(By.cssSelector("#request-list > li > div.request-message"));
        driver.findElement(By.cssSelector("#request-list > li > div.request-actions > span.reject-btn")).click();

        //通过显示等待等待弹窗出现
        wait.until(ExpectedConditions.alertIsPresent());

        //处理好友拒绝弹窗
        alert=driver.switchTo().alert();
        alert.accept();

        ScreenShot(Thread.currentThread().getStackTrace()[1].getMethodName());
    }
}

8.8聊天功能测试

java 复制代码
package tests;

import common.Utils;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;

import java.io.IOException;
import java.util.List;

public class ChatPage extends Utils {
    public static String url="http://117.72.166.68:8081/login.html";

    public ChatPage(){
        super(url);
    }

    /**
     * 发送消息
     */
    public void SendMessage() throws IOException,InterruptedException {
        //先清空输入框
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();

        driver.findElement(By.cssSelector("#username")).sendKeys("kk");
        driver.findElement(By.cssSelector("#password")).sendKeys("12345");
        driver.findElement(By.cssSelector("#submit")).click();

        //通过显示等待等待弹窗出现
        wait.until(ExpectedConditions.alertIsPresent());

        //处理登录成功弹窗
        Alert alert=driver.switchTo().alert();
        alert.accept();

        //等待列表加载完成
        WebElement listContainer = wait.until(
                ExpectedConditions.presenceOfElementLocated(By.cssSelector("#session-list"))
        );

        //获取列表
        List<WebElement> listItems = listContainer.findElements(By.tagName("li"));
        
        // 判断是否有之前的会话
        if(listItems.size() == 0){
            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)"));
        }else{
            Thread.sleep(1000);
            driver.findElement(By.cssSelector("#session-list > li:nth-child(1)")).click();
        }
        //清空输入框
        driver.findElement(By.cssSelector("body > div.client-container > div > div.right > textarea")).clear();
        
        driver.findElement(By.cssSelector("body > div.client-container > div > div.right > textarea")).sendKeys("自动化测试2222");
        
        //点击发送
        WebElement submit=wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("body > div.client-container > div > div.right > div.ctrl > button")));
        submit.click();

        ScreenShot(Thread.currentThread().getStackTrace()[1].getMethodName());
    }
}

九.性能测试

9.1线程组设计

9.2测试报告

9.3测试结果分析

基础信息

-测试接口:11个

-工具版本:Apache JMeter 5.5

-测试时段:2026.1.27 16:00-17:00

核心指标

  • 吞吐量:414.2请求/秒

  • 平均响应时间:155ms

  • 峰值响应:登录页1224ms

  • 数据流量:接收182.77KB/s,发送164.61KB/s

关键结论

  1. 系统稳定性良好,全场景无异常

  2. 登录接口性能波动明显(93ms~1224ms)

  3. 整体响应均优(平均155ms)

十.安全性测试

10.1 SQL注入

黑盒测试:

白盒测试:

复制代码
        QueryWrapper<UserInfo> queryWrapper=new QueryWrapper<>();
        queryWrapper.lambda().eq(UserInfo::getUserName,userLoginRequest.getUserName())
                .eq(UserInfo::getDeleteFlag, Constants.USER_NORMAL);
        UserInfo userInfo=userInfoMapper.selectOne(queryWrapper);

后端代码使用的是 MyBatis-Plus 的 Lambda 条件构造器,本质是参数化查询,从根源上避免了注入风险。

10.2未登录状态是否可以直接访问其他页面

实际结果:直接跳转回登录页面

10.3数据库中的密码是否处于加密状态

实际结果:MySQL中password属性进行了加密

10.4在传输过程中密码是否处于加密状态

实际结果:在传输过程中,密码处于明文状态,能被抓包工具抓到并获取

Bug:在传输过程中密码没有处于加密状态

10.5在输入密码栏中,密码是否处于隐藏状态

实际结果:密码是处于隐藏状态

10.6用户密码校验是否由后端校验而不是简单的JavaScript校验

复制代码
@Override
    public UserLoginResponse checkPassword(UserLoginRequest userLoginRequest, HttpServletRequest request) {
        QueryWrapper<UserInfo> queryWrapper=new QueryWrapper<>();
        queryWrapper.lambda().eq(UserInfo::getUserName,userLoginRequest.getUserName())
                .eq(UserInfo::getDeleteFlag, Constants.USER_NORMAL);
        UserInfo userInfo=userInfoMapper.selectOne(queryWrapper);
        if(userInfo==null){
            throw new UserException("用户不存在");
        }
        if(!SecurityUtil.verify(userLoginRequest.getPassword(),userInfo.getPassword())){
            throw new UserException("用户密码错误");
        }
        // ===== 步骤2:强制清理旧 token(核心!)=====
        String userId = userInfo.getUserId().toString(); // 以用户ID为Redis的key
        redisUtil.del(userId); // 删除该用户的旧token(无论是否存在)

        Map<String,Object> map=new HashMap<>();
        map.put("id",userInfo.getUserId());
        map.put("name",userInfo.getUserName());
        String token= JwtUtils.genToken(map);
        System.out.println("登录token:"+token);
        redisUtil.set(userInfo.getUserId()+"",token);
        HttpSession session=request.getSession(true);
        UserGetResponse user= BeanTransUtils.trans(userInfo);
        session.setAttribute("user",user);
        return new UserLoginResponse(userInfo.getUserId(),token);
    }

实际结果:密码校验由后端校验

10.7同一个用户在多个浏览器上登录,是否能够有安全提醒

先在Edge浏览器登录

后在Chrome浏览器登录

实际结果:同一个账号能在多地登录

Bug:没有防范"异地登陆"的情况

十一.测试总结

网页驿站聊天室的基本功能正常运行,正常流程能够正确执行。

需优化"登录/注册页面"中"Enter"按钮不可用问题。

需优化"登录/注册页面"中"大小写无提示"问题。

需修复"登录页面"中在传输数据时密码未加密的安全问题。

需修复"异地登陆"的安全问题。

需修复手机移动端不兼容的兼容性问题

交互体验良好:所有按钮点击响应迅速,页面渲染正常,无错别字、遮挡或显示异常。

该系统的性能测试结果表明其在当前并发场景下表现优秀,能够满足正常需求。

相关推荐
wangsir.1 天前
测试之测试分类
测试
mljy.4 天前
博客系统自动化测试报告
python·测试
wangsir.5 天前
测试之用例篇
测试
池央5 天前
软件测试知识点总结8-接口测试概念
测试
wangsir.7 天前
测试之BUG篇
bug·测试
池央9 天前
软件测试知识点总结-自动化测试常用函数
测试
oscar99912 天前
构建敏捷团队的DevOps测试策略:速度与可靠性的平衡艺术
运维·测试·devops
池央12 天前
软件测试知识点总结1
软件测试·测试
望未来无悔13 天前
软件测试理论
测试