博客系统web自动化测试

news2024/12/26 3:14:25

目录

一、项目简介

二、测试用例

三、测试过程

3.1 环境搭建

3.2 编写代码

3.2.1 博客登陆页面测试

3.2.2 博客列表页面测试

3.2.3 博客详情页面测试

3.2.4 博客编辑页面测试

四、测试评估


一、项目简介

        本项目是一个简易的个人博客系统,用户可以在登陆后查看其它用户的博客、编辑发布自己的博客、删除自己发布的博客等,用户只有在登录成功后,才可以使用该系统。

        项目主要功能:

                a) 用户登录、注销功能;

                b) 编辑、发布、查看、删除博客功能;

                c) 显示用户信息功能。

        主要技术栈:Java、MySQL、JDBC、Servlet、Tomcat、Jackson、单例模式

        本文主要针对该项目的UI编写测试用例,并进行自动化测试。

二、测试用例

三、测试过程

3.1 环境搭建

(1) 下载最新版本的Chrome浏览器、Chrome驱动

(2) 使用IDEA社区版(2021.3.2版本)创建Maven项目

(3) 在项目的pom.xml文件中引入selenium和Junit相关依赖:

    <dependencies>

        <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
        <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>

        <!--Junit依赖-->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.8.2</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-suite</artifactId>
            <version>1.8.2</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

(4) 创建目录结构:

  

3.2 编写代码

3.2.1 博客登陆页面测试

public class BlogLoginTest extends AutoTestUtils {
    private static final ChromeDriver driver = getDriver();

    @BeforeAll
    public static void driverGet(){
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.get("http://1.117.110.252:8080/blog_system2/blog_list.html");
    }

    /*
    检查登录页面打开是否正确
    检查点:用户名输入框、密码输入框、登录按钮元素是否存在
     */
    @Test
    public void testLoginPageLoadRight() throws IOException {
        driver.findElement(By.cssSelector("#username"));
        driver.findElement(By.cssSelector("#password"));
        driver.findElement(By.cssSelector("#login-btn"));
        getScreenShot(getClass().getName());
    }

    /*
    检查正常登录情况
    测试数据:
    1.账号:orange 密码:123
    2.账号:banana 密码:123
    检查点:是否跳转到博客列表页(查看全文按钮是否存在)
     */
    @ParameterizedTest
    @CsvSource({"orange,123","banana,123"})
    public void testLoginSuccess(String username,String password) throws IOException {
        //1.清空用户名输入框和密码输入框中的内容
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();
        //2.输入测试数据
        driver.findElement(By.cssSelector("#username")).sendKeys(username);
        driver.findElement(By.cssSelector("#password")).sendKeys(password);
        driver.findElement(By.cssSelector("#login-btn")).click();
        //3.检查登录成功后是否跳转到博客列表页
        driver.findElement(By.cssSelector("body > div.container > div.container-right > div:nth-child(1) > a"));
        getScreenShot(getClass().getName());
        //4.测试完一组数据后需要返回到登陆页面
        driver.navigate().back();
    }

    /*
    检查异常登录情况
    测试数据:
    1.账号:orange 密码:空字符串
    2.账号:空字符串 密码:123
    3.账号:apple 密码:666
    检查点:是否有登录失败的提示信息
     */
    @ParameterizedTest
    @CsvSource({"orange,\"\"","\"\",123","apple,666"})
    public void testLoginFail(String username,String password) throws IOException {
        //1.清空用户名输入框和密码输入框中的内容
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();
        //2.输入测试数据
        driver.findElement(By.cssSelector("#username")).sendKeys(username);
        driver.findElement(By.cssSelector("#password")).sendKeys(password);
        driver.findElement(By.cssSelector("#login-btn")).click();
        //3.检查登录失败后是否有登陆失败的提示信息
        String expect = "用户名或密码错误";
        String actual = driver.findElement(By.cssSelector("body")).getText();
        getScreenShot(getClass().getName());
        Assertions.assertEquals(expect,actual);
        //4.测试完一组数据后需要返回到登陆页面
        driver.navigate().back();
    }

//    @AfterAll
//    public static void driverQuit(){
//        driver.quit();
//    }
}

3.2.2 博客列表页面测试

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogListTest extends AutoTestUtils {
    private static final ChromeDriver driver = getDriver();

    @BeforeAll
    public static void driverGet(){
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.get("http://1.117.110.252:8080/blog_system2/blog_list.html");
    }

    /*
    检查登录成功后博客列表页是否加载正确
    检查点:是否有个人信息模块、查看全文按钮、写博客按钮
     */
    @Test
    @Order(1)
    public void testListPageLoadRight() throws IOException {
        driver.findElement(By.cssSelector("body > div.container > div.container-left > div"));
        driver.findElement(By.cssSelector("body > div.container > div.container-right > div:nth-child(1) > a"));
        driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)"));
        getScreenShot(getClass().getName());
    }

    /*
    检查在登录状态下能否从博客列表页进入博客详情页
    检查点:是否有博客详情模块
     */
    @Test
    @Order(2)
    public void testListToDetail() throws IOException {
        //1.找到查看全文按钮元素并点击
        driver.findElement(By.cssSelector("body > div.container > div.container-right > div:nth-child(1) > a")).click();
        //2.查看是否有博客详情模块
        driver.findElement(By.cssSelector("body > div.container > div.container-right"));
        getScreenShot(getClass().getName());
        //3.返回博客列表页
        driver.navigate().back();
    }

    /*
    检查在登录状态下能否从博客列表页进入博客编辑页
    检查点:是否有发布文章按钮元素
     */
    @Test
    @Order(3)
    public void testListToEdit() throws IOException {
        //1.找到写博客按钮元素并点击
        driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
        //2.查看是否有发布文章按钮元素
        driver.findElement(By.cssSelector("#submit"));
        getScreenShot(getClass().getName());
        //3.返回博客列表页
        driver.navigate().back();
    }

    /*
    检查未登录时访问博客列表页情况
    检查点:是否返回到博客登录页(是否有登录输入框、密码输入框、登录按钮)
     */
    @Test
    @Order(4)
    public void testLogOutToList() throws IOException {
        //1.先注销当前登录用户
        driver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();
        //2.在浏览器中直接输入博客列表页的URL
        driver.get("http://1.117.110.252:8080/blog_system2/blog_list.html");
        //3.检查是否返回到博客登录页
        driver.findElement(By.cssSelector("#username"));
        driver.findElement(By.cssSelector("#password"));
        driver.findElement(By.cssSelector("#login-btn"));
        getScreenShot(getClass().getName());
        //注销后需要重新登录,用于其他类中的测试用例正常进行
        //a.清空用户名输入框和密码输入框中的内容
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();
        //b.输入正确的账号、密码
        driver.findElement(By.cssSelector("#username")).sendKeys("orange");
        driver.findElement(By.cssSelector("#password")).sendKeys("123");
        driver.findElement(By.cssSelector("#login-btn")).click();
    }

//    @AfterAll
//    public static void driverQuit(){
//        driver.quit();
//    }
}

3.2.3 博客详情页面测试

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogDetailTest extends AutoTestUtils {
    private static final ChromeDriver driver = getDriver();

    @BeforeAll
    public static void driverGet(){
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.get("http://1.117.110.252:8080/blog_system2/blog_detail.html?blogId=4");
    }

    /*
    检查在登录状态下查看博客详情,打开的页面是否正确
    检查点:是否有博客详情模块
     */
    @Test
    @Order(1)
    public void testDetailLoadRight() throws IOException {
        driver.findElement(By.cssSelector("#content"));
        getScreenShot(getClass().getName());
    }

    /*
    检查在登录状态下能否从博客详情页进入博客列表页
    检查点:是否有用户信息模块、博客列表模块
     */
    @Test
    @Order(2)
    public void testDetailToList() throws IOException {
        //1.找到并点击主页按钮进入博客列表页
        driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)"));
        //2.检查是否有用户信息模块、博客列表模块
        driver.findElement(By.cssSelector("body > div.container > div.container-left > div"));
        driver.findElement(By.cssSelector("body > div.container > div.container-right"));
        getScreenShot(getClass().getName());
        //3.返回博客详情页
        driver.navigate().back();
    }

    /*
    检查在未登录状态访问博客详情页情况
    检查点:是否返回到博客登录页(是否有用户名输入框、密码输入框、登录按钮)
     */
    @Test
    @Order(3)
    public void testLogOutToDetail() throws IOException {
        //1.找到并点击注销按钮
        driver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();
        //2.通过输入博客详情页URL来访问博客列表页
        driver.get("http://1.117.110.252:8080/blog_system2/blog_detail.html?blogId=4");
        //3.查找是否有用户名输入框、密码输入框、登录按钮
        driver.findElement(By.cssSelector("#username"));
        driver.findElement(By.cssSelector("#password"));
        driver.findElement(By.cssSelector("#login-btn"));
        getScreenShot(getClass().getName());
        //注销后需要重新登录,用于其他类中的测试用例正常进行
        //a.清空用户名输入框和密码输入框中的内容
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();
        //b.输入正确的账号、密码
        driver.findElement(By.cssSelector("#username")).sendKeys("orange");
        driver.findElement(By.cssSelector("#password")).sendKeys("123");
        driver.findElement(By.cssSelector("#login-btn")).click();
    }

//    @AfterAll
//    public static void driverQuit(){
//        driver.quit();
//    }
}

3.2.4 博客编辑页面测试

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogEditTest extends AutoTestUtils {
    private static final ChromeDriver driver = getDriver();

    @BeforeAll
    public static void driverGet(){
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.get("http://1.117.110.252:8080/blog_system2/blog_edit.html");
    }

    /*
    检查登录状态下进入博客编辑页情况
    检查点:是否有编辑博客模块、发布文章按钮
     */
    @Test
    @Order(1)
    public void testEditLoadRight() throws IOException {
        driver.findElement(By.cssSelector("#editor"));
        driver.findElement(By.cssSelector("#submit"));
        getScreenShot(getClass().getName());
    }

    /*
    检查登录状态下能否从博客编辑页进入博客列表页
    检查点:是否有用户信息模块、博客列表模块
     */
    @Test
    @Order(2)
    public void testEditToList() throws IOException {
        //1.找到并点击主页按钮回到博客列表页
        driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")).click();
        //2.查看是否有用户信息模块、博客列表模块
        driver.findElement(By.cssSelector("body > div.container > div.container-left > div"));
        driver.findElement(By.cssSelector("body > div.container > div.container-left > div"));
        getScreenShot(getClass().getName());
        //3.返回博客编辑页
        driver.navigate().back();
    }

    /*
    查看在未登录状态进入博客编辑页情况
    检查点:是否回到博客列表也(是否有用户名输入框、密码输入框、登录按钮)
     */
    @Test
    @Order(3)
    public void testLogOutToEdit() throws IOException {
        //1.找到并点击注销按钮
        driver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();
        //2.通过输入博客编辑URL来访问博客列表页
        driver.get("http://1.117.110.252:8080/blog_system2/blog_edit.html");
        //3.查找是否有用户名输入框、密码输入框、登录按钮
        driver.findElement(By.cssSelector("#username"));
        driver.findElement(By.cssSelector("#password"));
        driver.findElement(By.cssSelector("#login-btn"));
        getScreenShot(getClass().getName());
        //注销后需要重新登录,用于其他类中的测试用例正常进行
        //a.清空用户名输入框和密码输入框中的内容
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();
        //b.输入正确的账号、密码
        driver.findElement(By.cssSelector("#username")).sendKeys("orange");
        driver.findElement(By.cssSelector("#password")).sendKeys("123");
        driver.findElement(By.cssSelector("#login-btn")).click();
    }

//    @AfterAll
//    public static void driverQuit(){
//        driver.quit();
//    }
}

四、测试评估

测试用例执行情况分析:

模块名称总用例实际执行用例通过失败未执行
博客登录页面66600
博客列表页面44400
博客详情页面33300
博客编辑页面33300

本次测试一共使用了16个测试用例,所有测试用例均正常通过,未发现bug

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

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

相关文章

W800开发板|SDK| HLK-W800-KIT-PRO|工具链|本地命令行编译|Windows11|WSL|(5)、海凌科W800开发板命令行编译指南

概况 海凌科W800开发板&#xff08;HLK-W800-KIT&#xff09;是海凌科电子面向开发者针对联盛德W800 芯片推出的一款多功能开发板。全功能版本与联盛德W800开发板相比&#xff0c;增加了温湿度传感器、RGB 灯以及音频解码器、功放可以直接在开发版验证功能。联盛德W800的csdk也…

java虚拟机内存分布

java虚拟机内存分布 Java虚拟机在执行java程序的过程中会把它所管理的内存划分为如下若干个不同的数据区域。 1.程序计数器 程序计数器是线程私有的&#xff0c;它占用的空间相对较小&#xff0c;用来记录当前线程字节码执行到哪一步。字节码解释器通过改变这个计数器的值来获…

Portraiture2023最新版人像图像后期处理软件

2023全新发布Portraiture 4是专注于图像后期处理软件研发的 Imagenomic, LLC产品之一&#xff0c;在摄影爱好者中有点影响力。Portraiture可以将繁琐复杂的人像磨皮操作极致简化&#xff0c;不论是普通爱好者或专业后期处理人员&#xff0c;均能一键完成。凭借优秀的AI算法和多…

uniapp 悬浮窗(应用内、无需授权) Ba-FloatWindow2

简介&#xff08;下载地址&#xff09; Ba-FloatWindow2 是一款应用内并且无需授权的悬浮窗插件。支持多种拖动&#xff1b;自定义位置、大小&#xff1b;支持动态修改。 支持自动定义起始位置支持自定义悬浮窗大小支持贴边显示支持多种拖动方效果&#xff1a;不可拖动、任意…

python--matplotlib(1)

前言 Matplotlib画图工具的官网地址是 http://matplotlib.org/ Python环境下实现Matlab制图功能的第三方库&#xff0c;需要numpy库的支持&#xff0c;支持用户方便设计出二维、三维数据的图形显示。 正文 1.arange函数 arange函数需要三个参数&#xff0c;分别为起始点、终止…

MyBatisPlus ---- 多数据源

MyBatisPlus ---- 多数据源1. 创建数据库及表2. 引入依赖3. 配置多数据源4. 创建用户service5. 创建商品service6. 测试适用于多种场景&#xff1a;纯粹多库、读写分离、一主多从、混合模式等 目前我们就来模拟一个纯粹多库的一个场景&#xff0c;其他场景类似 场景说明&#x…

一文了解Hotspot虚拟机下JAVA对象从创建到回收的生命周期

Java虚拟机是Java的核心和基础&#xff0c;他是Java编译器和操作系统平台之间处理器&#xff0c;能实现跨平台运行Java程序。本文主要讲解的是虚拟机如何管理对象&#xff0c;即Java对象在JVM虚拟机中被创建到回收的流程 Java对象从创建到回收的生命周期对象创建流程1.类加载检…

MyBatis 的一级、二级缓存机制

目录标题缓存什么是缓存为什么使用缓存什么样的数据能使用缓存&#xff0c;什么样的数据不能使用适用于缓存不适用于缓存MyBatis 一级缓存、二级缓存关系1. 一级缓存1.1 什么是一级缓存mybatis1.2 一级缓存配置1.3 什么情况下会命中一级缓存mybatis清除一级缓存的几种方法1.4 内…

Delphi 10.4.2使用传统代码提示方案(auto complete)(转)

Delphi 10.4重点是实现了LSP&#xff0c;但现在最新的10.4.2还是不成熟&#xff0c;无法满足日常需要&#xff0c;不过没关系&#xff0c;可以设置为原有的方案&#xff0c;如下图&#xff1a;具体操作&#xff1a;Tools->Options->Editor->language->Code Insight…

迷宫问题图解 : 基于骨架提取、四邻域

目录 1. 迷宫的连通域 2. How to remove branch &#xff1f; 3. 基于4邻域的 remove 分支 3.1 找到分支的端点 3.2 4邻域的 remove 分支 3.3 循环移除分支 3.4 code 4. 迷宫路线 4.1 预处理 4.2 提取骨架 4.3 分支的端点 4.4 去除分支的端点 4.5 循环去除分支 4…

Java-合并两个链表

每日一题 Java-合并两个链表 给你两个链表 list1 和 list2 &#xff0c;它们包含的元素分别为 n 个和 m 个。 请你将 list1 中下标从 a 到 b 的全部节点都删除&#xff0c;并将list2 接在被删除节点的位置。 下图中蓝色边和节点展示了操作后的结果&#xff1a; 请你返回结果…

linux下redis安装 及常用命令

安装及常用命令 redis的yum方式安装 先查看是否已经安装redis执行命令 rpm -qa | grep redis如果存在&#xff0c;将存在的卸载&#xff1a;(-y 代表自动选择) yum remove xxx -y在线安装redis yum install redis安装本地已经下载好的redis安装包 yum localinstall redis6.2…

基于Spring、Spring MVC、MyBatis的招聘管理系统

文章目录项目介绍主要功能截图&#xff1a;首页账户管理招聘建议部分代码展示设计总结项目获取方式&#x1f345; 作者主页&#xff1a;Java韩立 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 …

流程引擎之Camunda简介

背景Camunda 是支持 BPMN&#xff08;工作流和流程自动化&#xff09;、CMMN&#xff08;案例管理&#xff09; 和 DMN&#xff08;业务决策管理&#xff09; java 框架。Camunda 基于Activiti5 保留了 PVM&#xff0c;其开发团队也是从 activiti 中分裂出来的。Camunda 来自拉…

KubeSphere实战

文章目录一、KubeSphere平台安装1、Kubernetes上安装KubeSphere1.1 安装docker1.2 安装Kubernetes1.3 前置环境之nfs存储1.4 前置环境之metrics-server1.5 安装KubeSphere2、Linux单节点部署KubeSphere3、Linux多节点部署KubeSphere(推荐)二、KubeSphere实战1、多租户实战2、中…

Spring中的数据校验--进阶

分组校验 场景描述 在实际开发中经常会遇到这种情况&#xff1a;添加用户时&#xff0c;id是由后端生成的&#xff0c;不需要校验id是否为空&#xff0c;但是修改用户时就需要校验id是否为空。如果在接收参数的User实体类的id属性上添加NotNull&#xff0c;显然无法实现。这时…

【飞桨AI-Python小白逆袭大神课程】作业3-《青春有你2》选手数据分析

目录 一、数据准备 1、文件数据以json文件格式保存&#xff1a; 二、数据分析 2、数据分析四剑客&#xff1a; &#xff08;1&#xff09;Numpy &#xff08;2&#xff09;pandas &#xff08;3&#xff09;Matplotlib &#xff08;4&#xff09;PIL &#xff08;5&#x…

操作系统题目收录(十一)

1、操作系统采用分页存储管理方式&#xff0c;要求&#xff08;&#xff09;。 A&#xff1a;每个进程拥有一张页表&#xff0c;且进程的页表驻留在内存中B&#xff1a;每个进程拥有一张页表&#xff0c;但只有执行进程的页表驻留在内存中C&#xff1a;所有进程共享一张页表&a…

django项目实战(django+bootstrap实现增删改查)

目录 一、创建django项目 二、修改默认配置 三、配置数据库连接 四、创建表结构 五、在app当中创建静态文件 六、页面实战-部门管理 1、实现一个部门列表页面 2、实现新增部门页面 3、实现删除部门 4、实现部门编辑功能 七、模版的继承 1、创建模板layout.html 1&…

Django框架之模型视图--Session

Session 1 启用Session Django项目默认启用Session。 可以在settings.py文件中查看&#xff0c;如图所示 如需禁用session&#xff0c;将上图中的session中间件注释掉即可。 2 存储方式 在settings.py文件中&#xff0c;可以设置session数据的存储方式&#xff0c;可以保存…