【软件测试】个人博客项目测试报告

news2025/1/21 2:47:32

目录

1.报告概要

2、测试环境

3、手动测试用例编写

4、自动化测试用例


1.报告概要

测试对象:基于SSM项目的博客系统。

测试目的:检测博客项目是否符合预期,并且对测试知识进行练习和巩固。

测试点:主要针对常用的功能进行测试如:博客项目的注册、登录、博客列表页、博客编辑页、个人列表页、导航栏等进行测试。

测试结果及结论:测试的常用功能全部正常,测试注册页面的密码时,发现密码没有限制长度以及强度的限制。

2、测试环境

硬件:Lenovo Y7000 2020

软件:Windows 、Google Chrome、IDEA

测试工具:自动化测试工具Selenium3

浏览器版本:Google Chrome  118.0.5993.118

3、手动测试用例编写

用户注册页 

用户登录页 

个人列表页

博客列表页(主页)

 

博客详情页

博客编辑页

4、自动化测试用例

博客注册页面

package Blog;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.TestMethodOrder;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.MethodSource;
import org.openqa.selenium.By;


import java.util.concurrent.TimeUnit;

import static java.lang.Thread.sleep;
//根据程序员指定的顺序执行
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class RegCases extends InitAndEnd{
    /*
    * 注册成功
    * */
    @Order(1)
    @ParameterizedTest
    @CsvSource({"zhangsan,12345,12345"})
    void regSuccess(String username,String password,String conPassword ) throws InterruptedException {
        //打开主页面
        webDriver.get("http://154.8.139.1:48080/login.html");
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        //找到注册按钮
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        sleep(3000);
        //输入注册的用户名,密码
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        webDriver.findElement(By.cssSelector("#password2")).sendKeys(conPassword);
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        //点击提交
        webDriver.findElement(By.cssSelector("#submit")).click();
        sleep(3000);
        //处理弹窗
        String test = webDriver.switchTo().alert().getText();
        String except = "恭喜:注册成功!";
        webDriver.switchTo().alert().accept();
        Assertions.assertEquals(except,test);

    }

    /*
    *
    * 用户名为空注册失败
    * */
    @Order(2)
    @ParameterizedTest
    @CsvSource(value = {"'',123,123","'',123,456","'',546,''","'','',456","'','',''","'张三','',''","'张三','123',''","'张三','123','123'",})
    void RegFail(String username,String password,String conPassword) throws InterruptedException {
        //打开主页
        webDriver.get("http://154.8.139.1:48080/login.html");
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        sleep(3000);
        //找到注册点击
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        //输入用户名、密码、确认密码
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        webDriver.findElement(By.cssSelector("#password2")).sendKeys(conPassword);
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        //点击提交
        webDriver.findElement(By.cssSelector("#submit")).click();
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        sleep(3000);

        //处理弹窗
        //获取弹窗信息
        String test = webDriver.switchTo().alert().getText();
        webDriver.switchTo().alert().accept();
        String except = "恭喜:注册成功!";
        //断言
        Assertions.assertNotEquals(except,test);
    }



}

博客登录页面

import static java.lang.Thread.sleep;
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogCases extends InitAndEnd{
   
    /*
    * 输入正确的账号、密码登录成功
    * */
    @Order(1)
    @ParameterizedTest
    @CsvFileSource(resources = "LoginSuccess.csv")
    void LoginSuccess(String username,String password,String blog_list_url) throws InterruptedException {
        //打开博客登录页面
        webDriver.get("http://154.8.139.1:48080/login.html");
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        //输入账号admin
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        //输入密码123
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        //点击提交按钮
        webDriver.findElement(By.cssSelector("#submit")).click();
        sleep(3000);
        //处理弹窗
          //用于接受警告对话框(确认)
        webDriver.switchTo().alert().accept();
        //跳转到列表页
        //获取到当前的页面的url
        String cur_url = webDriver.getCurrentUrl();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        //判断url是否和预期相等
        Assertions.assertEquals(blog_list_url,cur_url);

    }

    /*
    * 输入错误的密码和账号
    * */
    @Disabled
    @Order(2)
    @ParameterizedTest
    @CsvSource(value = {"张帆,123","lisi,123","'',123456","张帆,''","'',''"})
    void LoginFail(String username,String password) throws InterruptedException {
        //打开博客登录页面
        webDriver.get("http://154.8.139.1:48080/login.html");
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        //输入账号和密码
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        //点击提交按钮
        webDriver.findElement(By.cssSelector("#submit")).click();
        sleep(3000);
        //处理弹窗
            //获取弹窗内容
        String test = webDriver.switchTo().alert().getText();
        String except = "恭喜,登录成功!";
            //用于接受警告对话框(确认)
        webDriver.switchTo().alert().accept();
        //断言两个字符串的内容不相等,测试通过
        Assertions.assertNotEquals(except,test);
        System.out.println("登录不成功");


}

个人列表页

    /*
     * 博客列表页
     * */
    @Test
    void BlogList(){
        //打开博客列表页
        webDriver.get("http://154.8.139.1:48080/myblog_list.html");
        //获取页面上所有博客标题对应的元素
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        int title_num = webDriver.findElements(By.cssSelector("title")).size();
        //如果元素数量不为0,测试通过
        System.out.println(title_num);
        Assertions.assertNotEquals(0,title_num);
    }

博客详情页

   /*
    * 博客详情页校验
    * url
    * 博客标题
    * 页面title是"博客详情页"
    * 用户名
    * 文章数
    * */
    @Order(4)
    @ParameterizedTest
    @MethodSource("Generator")
    void BlogDetail(String expect_url,String expected_title,String expected_blog_title,String except_username ) throws InterruptedException {
        //找到第一篇博客对应的查看全文按钮
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        webDriver.findElement(By.xpath("//*[@id=\"artListDiv\"]/div[1]/a[1]")).click();
        //获取当前页面的URL
        String cur_url = webDriver.getCurrentUrl();
        //获取当前页面的title
        String cur_title = webDriver.getTitle();
        //获取博客标题
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        String cur_blog_title = webDriver.findElement(By.cssSelector("#title")).getText();

        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        //获取用户名
        String cur_username = webDriver.findElement(By.cssSelector("#username")).getText();
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        //获取文章数
        String cur_blog_count = webDriver.findElement(By.cssSelector("#artcount")).getText();
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        Assertions.assertEquals(except_username,cur_username);
        Assertions.assertNotEquals(0,cur_blog_count);
        if(cur_url.contains(expect_url)){
            System.out.println("测试通过");
        }else{
            System.out.println(cur_url);
            System.out.println("测试不通过");
        }
        Assertions.assertEquals(expected_title,cur_title);
        Assertions.assertEquals(expected_blog_title, cur_blog_title);

    }
    public class BlogCases extends InitAndEnd{
        public static Stream<Arguments> Generator() {
            return             
              Stream.of(Arguments.arguments("http://154.8.139.1:48080/blog_content.html",
                "博客正文","自动化测试","张帆"));

    }

 博客编辑页,文章发布完成之后进入博客列表页检测发布文章的标题和时间。

    /*
    * 博客编辑页
    * */
    @Order(5)
    @Test
    void EditBlog() throws InterruptedException {
        //打开博客列表页
        //webDriver.findElement(By.cssSelector("http://154.8.139.1:48080/myblog_list.html"));
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        //找到写博客按钮,点击
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        //通过JS进行输入
        ((JavascriptExecutor)webDriver).executeScript("document.getElementById(\"title\").value=\"自动化测试\"");
        sleep(3000);
        //点击发布
        webDriver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click();
        sleep(3000);
        String cur_text = webDriver.switchTo().alert().getText();
        webDriver.switchTo().alert().dismiss();
        String except_text = "恭喜:添加成功!是否继续添加文章?";
        Assertions.assertEquals(except_text,cur_text);
    }
    /*
    * 校验已发布博客标题
    * 校验已发布博客时间
    * */
    @Order(6)
    @Test
    void BlogInfoChecked(){
        webDriver.get("http://154.8.139.1:48080/blog_list.html");
        //获取第一篇博客标题
        String first_blog_title = webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > div.title")).getText();
        //获取第一篇博客发布时间
        String first_blog_time= webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > div.date")).getText();
        Assertions.assertEquals("自动化测试",first_blog_title);
        if(first_blog_time.contains("2023-11-02")){
            System.out.println("测试通过");
        }else{
            System.out.println("文章发布时间是:"+first_blog_time);
            System.out.println("测试不通过");
        }
   }

删除功能

    /*
    * 测试博客列表页上删除功能
    * */
    @Order(7)
    @Test
    void DeleteCases() throws InterruptedException {
        //进入个人列表页
        webDriver.get("http://154.8.139.1:48080/myblog_list.html");
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        //点击删除按钮
        webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > a:nth-child(6)")).click();
        sleep(3000);
        String text = webDriver.switchTo().alert().getText();
        webDriver.switchTo().alert().accept();
        String except_text = "恭喜:删除成功";
        sleep(3000);
        String first_blog_title = webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > div.title")).getText();
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        String except_title = "自动化测试";
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        Assertions.assertEquals(except_text,text);
        Assertions.assertEquals(first_blog_title,except_title);
    }

注销功能

    /*
    * 注销功能测试
    * */
    @Order(8)
    @Test
    void Logout(){
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        //获取alert()文字
        String text = webDriver.switchTo().alert().getText();
        String except_text = "是否确定注销?";
        webDriver.switchTo().alert().accept();
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        //校验URL(登录)
        String cur_url = webDriver.getCurrentUrl();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        //校验提交按钮
        WebElement webElement = webDriver.findElement(By.cssSelector("#submit"));
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        Assertions.assertEquals(except_text,text);
        Assertions.assertEquals("http://154.8.139.1:48080/login.html",cur_url);
        Assertions.assertNotNull(webElement);
    }

InitAndEnd类

package Blog;

import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

import java.util.concurrent.TimeUnit;

public class InitAndEnd {
    static WebDriver webDriver;
    @BeforeAll
    static void SetUp(){
        webDriver = new ChromeDriver();
    }
    @AfterAll
    static void TearDown(){
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        webDriver.quit();
    }
}

问题总结:

❓在测试程序执行报unexpected alert open: {Alert text : 恭喜:删除成功}这种异常,那么就是你没有将这个弹窗关闭掉

✨可以使用accept()方法接受或者dismiss()拒绝

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

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

相关文章

rhcsa-vim

命令行的三种模式 将ets下的passwd文件复制到普通用户下面 编辑模式的快捷方式 a--光标后插入 A--行尾插入 o--光标所在上一行插入 O--光标所在上一行插入 i--光标前插入 I--行首插入 s--删除光标所在位然后进行插入模式 S--删除光标所在行然后进行插入 命令模式的快捷…

社交媒体欺诈乱象 | 每15人就有1人遭遇过网络欺诈!

目录 社交媒体的欺诈现象 欧盟要求科技公司加强虚假信息处理 借助技术识别虚假社交账号 据英国劳埃德银行&#xff08;TSB&#xff09;5月份发布的一份报告披露&#xff0c;社交媒体平台上的金融欺诈正在以令人担忧的速度增加&#xff0c;消费者应对Facebook、Instagram和Wh…

嵌入式linux常用的文件传输方式

做嵌入式就避免不了移植工作&#xff0c;所谓移植就是将交叉编译生成的可执行程序&#xff0c;库&#xff0c;配置文件等传输到开发板上进行工作。 常用传输方式有以下几种&#xff1a;1.串口传输 就是使用串口传输工具rz/sz; 该工具通过串口传输在SRT串口工具…

openpnp - 74路西门子飞达控制板(主控板STM32_NUCLEO-144)实现

文章目录 openpnp - 74路西门子飞达控制板(主控板STM32_NUCLEO-144)实现概述飞达控制底板硬件电路程序的修改END openpnp - 74路西门子飞达控制板(主控板STM32_NUCLEO-144)实现 概述 现在调试自己的openpnp设备, 在收尾, 将飞达控制板弄好, 能正常控制设备飞达安装平台上装满…

【Qt】QMainWidget中的栏和菜单

默认结构最复杂的标准窗口 提供了菜单栏, 工具栏, 状态栏, 停靠窗口菜单栏: 只能有一个, 创建的最上方工具栏: 可以有多个, 默认提供了一个, 窗口的上下左右都可以停靠状态栏: 只能有一个, 窗口最下方停靠窗口: 可以有多个, 默认没有提供, 窗口的上下左右都可以停靠 菜单栏 在…

C语言--分段函数

要求&#xff1a;写一个程序&#xff0c;输入x的值&#xff0c;输出y的值 思路&#xff1a;定义两个变量&#xff0c;一个y&#xff0c;一个x&#xff0c;当x<1时&#xff0c;yx&#xff0c;当x>1&&x<10&#xff0c;y2x-1&#xff0c;当x>10,y3x-11.用一个…

osg三角带

案例1 #include <osg/Geode> #include <osg/Geometry> #include <osgDB/Registry> #include <osgDB/WriteFile> #include <osg/Notify> #include <osg/PrimitiveSet> #include <osgViewer/Viewer> #include <osgUtil/Optimizer&g…

服务器经常被攻击的原因

很多中小型企业都是选择虚拟主机服务器&#xff0c;是把一个服务器分成很多个给很多企业一起共用&#xff0c;可能同一个 IP服务器上就有很多个不同企业的网站&#xff0c;这个时候如果跟你同一个IP服务器的网站遭到DDoS攻击&#xff0c;就很有可能会影响到你的网站也无法正常访…

谁还在一个个私发成绩啊, 教你如何实现学生自助查询成绩

今天我们聊聊成绩查询那些事儿 得先说说&#xff0c;成绩查询到底是个啥东西。成绩查询系统&#xff0c;顾名思义&#xff0c;就是一个可以输入用户名和密码&#xff0c;然后查看自己成绩的系统。对于咱们老师来说&#xff0c;可以省去一个个私发成绩的繁琐&#xff0c;对于学生…

69 内网安全-域横向CobaltStrikeSPNRDP

目录 演示案例:域横向移动RDP传递-Mimikatz域横向移动SPN服务-探针,请求,导出,破解,重写域横向移动测试流程一把梭哈-CobaltStrike初体验 涉及资源 SPN主要是扫描技术&#xff0c;在渗透过程中结合kerberos协议&#xff0c;可以做一些事情 演示案例: 域横向移动RDP传递-Mimik…

第三章 栈和队列【数据结构与算法】【精致版】

第三章 栈和队列【数据结构与算法】【精致版】 前言版权第 3 章 栈和队列3.1 应用实例应用实例一 迷宫求解问题应用实例二“马”踏棋盘问题 3.2栈3.2.1 栈的概念及运算3.2.2栈的顺序存储结构1. 顺序栈**1-顺序栈.h**2. 多栈共享邻接空间**2-共享栈.c** 3.2.3栈的链式存储结构1&…

【错误解决方案】ModuleNotFoundError: No module named ‘torchvision.models.utils‘

1. 错误提示 在python程序&#xff0c;尝试导入一个名为torchvision.models.utils的模块&#xff0c;但Python提示找不到这个模块。 错误提示&#xff1a;ModuleNotFoundError: No module named torchvision.models.utils 2. 解决方案 1&#xff09;这可能是因为你还没有安装…

SolidWorks2022安装教程(正版)

网盘资源附文末 一.简介 SolidWorks软件是世界上第一个基于Windows开发的三维CAD系统&#xff0c;由于技术创新符合CAD技术的发展潮流和趋势&#xff0c;SolidWorks公司于两年间成为CAD/CAM产业中获利最高的公司。良好的财务状况和用户支持使得SolidWorks每年都有数十乃至数百…

学习笔记二十九:K8S配置管理中心Configmap实现微服务配置管理

Configmap概述 Configmap概述Configmap能解决哪些问题&#xff1f;Configmap应用场景局限性 Configmap创建方法命令行直接创建通过文件创建指定目录创建configmap 编写configmap资源清单YAML文件使用Configmap通过环境变量引入&#xff1a;使用configMapKeyRef通过环境变量引入…

关于单片机CPU如何控制相关引脚

目录 1、相关的单片机结构 2、通过LED的实例解释 1、相关的单片机结构 在寄存器中每一块都有一根导线与引脚对应&#xff0c;通过cpu改变寄存器内的数据&#xff08;0或1&#xff09;&#xff0c;通过驱动器来控制对于的引脚。 2、通过LED的实例解释 如图所示&#xff0c;芯片…

【云备份|| 日志 day3】服务端配置信息模块

云备份day3 使用文件配置加载一些程序的运行关键信息可以让程序的运行更加灵活&#xff0c;且当需要修改部分内容时&#xff0c;不需要在代码上修改&#xff0c;只需要修改配置文件&#xff0c;然后重启服务器即可。 配置信息 热点判断时间文件下载URL前缀路径压缩包后缀名称…

项目管理-采购管理过程讲解

项目采购管理是指在项目执行过程中&#xff0c;对项目所需的产品、服务或资源进行采购的过程。它涉及确定采购需求、编制采购计划、寻找供应商、进行招标或谈判、签订合同、监督供应商履约等一系列活动。 项目采购管理的目标是确保项目能够按时、按质、按预算获取所需的产品或…

fastapi-路由

FastAPI的APIRouter是一个用于将不同功能模块的端点进行划分的工具&#xff0c;类似于Flask中的蓝图&#xff08;Blueprint&#xff09;。通过APIRouter&#xff0c;你可以将应用程序的不同部分组织成独立的路由模块&#xff0c;从而提高代码的可读性和可维护性。 APIRouter允…

【Midjourney入门教程2】Midjourney的基础操作和设置

文章目录 Midjourney的常用命令和基础设置1、 /imagine2、 /blend3、 /info4、 /subscribe5、 /settings&#xff08;Midjourney的基础设置&#xff09;6、 /shorten 有部分同学说我不想要英文界面的&#xff0c;不要慌&#xff1a; 点击左下角个人信息的设置按钮&#xff0c;找…