博客系统之自动化测试

news2025/2/26 2:57:19

背景:针对个人博客项目进行测试,个人博客主要由四个页面构成:登录页、列表页、详情页和编辑页,主要功能包括:用户登录功能、发布博客功能、查看文章详情功能、查看文章列表功能、删除文章功能、退出功能。对于个人博客的测试主要就是针对主要功能进行测试,然后按照页面书写测试类。

自动化测试一般步骤
1)使用脑图编写web自动化测试用例
2)创建自动化项目,根据用例来实现脚本

 一、脑图

对主要功能进行测试:

 

 二、代码编写

  1. 根据脑图进行测试用例的编写:每个页面一个测试类,然后再各个测试类中进行测试用例的编写。
  2. 使用测试套件便于运行以及修改。
  3. 创建启动会频繁进行复用,所以单独创建一个类进行存储。
  4. 添加隐式等待,为了确保页面正确加载渲染。

1. 添加相关依赖pom.xml 

<dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.141.59</version>
        </dependency>

2. 新建包并在包下创建测试类

2.1公共类InitAndEnd

1.在所有测试开始之前加载驱动

2.在所有测试结束后关闭驱动

public class InitAndEnd {
    static WebDriver webDriver;
    @BeforeAll
    static void Init(){
        webDriver = new ChromeDriver();
    }

    @AfterAll
    static void End(){
        webDriver.quit();
    }
}

 2.2  BlogCases 类

1.测试用户登录功能

2.测试发布博客功能

3.测试查看文章详情功能

4.测试查看文章列表功能

5.测试删除文章功能

6.测试退出功能


@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogCases extends InitAndEnd{
    /**
     * 登录
     */
    @Order(1)
    @ParameterizedTest
    @CsvSource(value = "张三,123456")
    void Login(String username,String password){
        //打开登录页面
        webDriver.get("http://localhost:8080/blog_war/blog_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("#btn_login_submit")).click();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        //校验当前登录的用户是不是张三,如果是测试通过,否则测试不通过
        String user_name = webDriver.findElement(By.cssSelector("h3")).getText();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        Assertions.assertEquals(username,user_name);
        System.out.println("成功登录");
    }

    /**
     * 博客列表
     */
    @Order(2)
    @Test
    void BlogList() {
        webDriver.get("http://localhost:8080/blog_war/blog_login.html");
        webDriver.manage().timeouts().implicitlyWait(3000, TimeUnit.SECONDS);
        int blog_num = webDriver.findElements(By.cssSelector(".title")).size();
        Assertions.assertNotEquals(0, blog_num);
        String page_title = webDriver.getTitle();
        Assertions.assertEquals(page_title, "用户登录");
        System.out.println("博客列表加载成功");
    }
    /**
     *
     * 博客详情页校验
     */
    @Order(3)
    @Test
    void BlogDetail() {
        // 打开列表页
        webDriver.get("http://localhost:8080/blog_war/blog_list.html");
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 找到查看全文按钮,点击
        webDriver.findElement(By.xpath("/html/body/div[2]/div[2]/div[1]/div[4]/a")).click();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 获取博客标题
        String blog_title = webDriver.findElement(By.cssSelector("#div_detals_title")).getText();
        // 如果博客正文不为空,测试通过
        // 否则测试不通过
        Assertions.assertNotNull(blog_title);
        System.out.println("博客详情页校验");
    }

    /**
     * 写博客
     */
    @Order(4)
    @Test
    void EditBlog() throws IOException, InterruptedException {
        // 找到写博客按钮,点击
        webDriver.findElement(By.cssSelector("body > div.nav > div > div > a:nth-child(2)")).click();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 执行js(选中标题输入框,输入字符串)
        ((JavascriptExecutor)webDriver).executeScript("document.querySelector(\"#title\").value=\"自动化测试\"");
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        //编辑页的md是第三方插件,所以不可以直接使用sendkeys像编辑板块写入内容,可以先点击上方按钮,然后进行插入
        webDriver.findElement(By.cssSelector("#blog_edit > div.editormd-toolbar > div > ul > li:nth-child(20)")).click();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        ((JavascriptExecutor)webDriver).executeScript("document.querySelector(\"#text_edit_content\").value=\"自动化测试\"");
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        webDriver.findElement(By.cssSelector("#submit")).click();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        sleep(3000);
        //对弹出框校验
        webDriver.switchTo().alert().accept();
        // 校验页面跳转到列表页
        sleep(3000);
        String cur_url = webDriver.getCurrentUrl();
        Assertions.assertEquals("http://localhost:8080/blog_war/blog_list.html", cur_url);
        // 校验第一条博客标题是不是刚刚发布的博客标题
        String first_blog_titlt = webDriver.findElement(By.xpath("/html/body/div[2]/div[2]/div[1]/div[1]")).getText();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        Assertions.assertEquals("自动化测试", first_blog_titlt);
        System.out.println("写博客校验");
    }
    /**
     * 删除博客
     */
    @Order(5)
    @Test
    void DeleteBolg() throws InterruptedException {
        // 找到查看全文按钮,点击
        webDriver.findElement(By.xpath("/html/body/div[2]/div[2]/div[1]/div[4]/a")).click();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 找到删除按钮,点击
        webDriver.findElement(By.cssSelector("body > div.nav > div > div > a:nth-child(4)")).click();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        sleep(3000);
        //对弹出框进行处理
        webDriver.switchTo().alert().accept();
        sleep(3000);
        // 校验当前页面是否跳转到博客列表页面
        String cur_url = webDriver.getCurrentUrl();
        Assertions.assertEquals("http://localhost:8080/blog_war/blog_list.html", cur_url);
        // 获取博客发布是时间
        String blog_release_time = webDriver.findElement(By.xpath("/html/body/div[2]/div[2]/div[1]/div[2]")).getText();
        // 如果博客发布时间包括2023-08-18测试 不通过
        // 否则测试通过
        if(blog_release_time.contains("2023-08-18")) {
            System.out.println("博客发布时间:" + blog_release_time);
            System.out.println("测试不通过");
        } else {
            System.out.println("测试通过");
        }
    }
    /**
     * 退出博客
     */
    @Order(6)
    @Test
    void LogOut() throws InterruptedException {
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 找到退出按钮,点击
        webDriver.findElement(By.cssSelector("#a_list_logout")).click();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 校验页面是否有登录文案
        String login_text = webDriver.findElement(By.cssSelector("body > div.login-container > form > div > div.title")).getText();
        // 如果有登录文案,退出成功(测试用例通过)
        // 否则,退出失败(测试不通过)
        sleep(3000);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        if(login_text.equals("用户登录")) {
            System.out.println("测试通过");
        } else {
            System.out.println("测试不通过");
        }
    }

}

3.测试结果

所有测试用例通过,如图所示

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

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

相关文章

mysql全文检索使用

数据库数据量10万左右&#xff0c;使用like %test%要耗费30秒左右&#xff0c;放弃该办法 使用mysql的全文检索 第一步:建立索引 首先修改一下设置: my.ini中ngram_token_size 1 可以通过 show variables like %token%;来查看 接下来建立索引:alter table 表名 add f…

C#与西门子PLC1500的ModbusTcp服务器通信1--项目背景

最近在一个120万元的项目中&#xff0c;涉及到modbustcp通信&#xff0c;我作为软件总工负责项目的通信程序开发&#xff0c;modbus是一个在工业自动化领域中的通信协议&#xff0c;可以是modbusrtu&#xff0c;modbusascii&#xff0c;modbustcp三个形式&#xff0c;具体来说是…

QT VS编译环境无法打开包括文件type_traits

这问题&#xff0c;别人给的处理方法都是&#xff1a; 添加环境变量执行vsvars32.bat/vcvarsall.bat/vsdevcmd.bat重新安装QT项目&#xff1a;执行qmake。。。。 个人不推荐配置环境编译&#xff0c;除非你非常熟&#xff0c;因为配置环境变量需要你知道有哪些路径需要添加&a…

SpringBoo t+ Vue 微人事 (十一)

职位修改操作 在对话框里面做编辑的操作 添加对话框 <el-dialogtitle"修改职位":visible.sync"dialogVisible"width"30%"><div><el-tag>职位名称</el-tag><el-input size"small" class"updatePosIn…

Vue2-全局事件总线、消息的订阅与发布、TodoList的编辑功能、$nextTick、动画与过渡

&#x1f954;&#xff1a;高度自律即自由 更多Vue知识请点击——Vue.js VUE2-Day9 全局事件总线1、安装全局事件总线2、使用事件总线&#xff08;1&#xff09;接收数据&#xff08;2&#xff09;提供数据&#xff08;3&#xff09;组件销毁前最好解绑 3、TodoList中的孙传父&…

Jenkins改造—nginx配置鉴权

先kill掉8082的端口进程 netstat -natp | grep 8082 kill 10256 1、下载nginx nginx安装 EPEL 仓库中有 Nginx 的安装包。如果你还没有安装过 EPEL&#xff0c;可以通过运行下面的命令来完成安装 sudo yum install epel-release 输入以下命令来安装 Nginx sudo yum inst…

Flutter 测试小结

Flutter 项目结构 pubspec.yaml 类似于 RN 的 package.json&#xff0c;该文件分别在最外层及 example 中有&#xff0c;更新该文件后&#xff0c;需要执行的 Pub get lib 目录下的 dart 文件为 Flutter 插件封装后的接口源码&#xff0c;方便在其他 dart 文件中调用 example 目…

vue 如何适配 web 夜间模式、暗黑模式、黑色主题 prefers-color-scheme: dark

vue 如何适配 web 夜间模式、暗黑模式、黑色主题 prefers-color-scheme: dark 一、暗黑模式越来越普遍 自苹果推出暗黑模式之后&#xff0c;Web 也有了对应的暗黑模式&#xff0c;默认情况下 Web 的暗黑模式是跟随系统的。 你只需要将暗黑模式的样式写到下面这样的媒体选择器中…

Ubuntu软件源、pip源大全,国内网站网址,阿里云、网易163、搜狐、华为、清华、北大、中科大、上交、山大、吉大、哈工大、兰大、北理、浙大

文章目录 一、企业镜像源1、阿里云2、网易1633、搜狐镜像4、华为 二&#xff1a;高校镜像源1、清华源2、北京大学3、中国科学技术大学源 &#xff08;USTC&#xff09;4、 上海交通大学5、山东大学6、 吉林大学开源镜像站7、 哈尔滨工业大学开源镜像站8、 西安交通大学软件镜像…

使用ChatGPT进行创意写作的缺点

Open AI警告ChatGPT的使用者要明白此工具的局限性&#xff0c;更不应完全依赖。作为一位创作者&#xff0c;这一点非常重要&#xff0c;应尽可能地避免让版权问题或不必要的文体问题出现在自己的作品中。[1] 毕竟使用ChatGPT进行创意写作目前还有以下种种局限或缺点[2]&#xf…

prompt工程(持续更新ing...)

诸神缄默不语-个人CSDN博文目录 我准备想办法把这些东西整合到我的ScholarEase项目里。 其实以现在GPT-4的能力来说&#xff0c;直接就当日常对话随便直接说、直接问&#xff0c;基本没有太大的问题。 有时使用更复杂、详细、明确的prompt可能会起到提升作用。 有一些简单的…

Open cv C++安装

注意;要退出conda的虚拟环境 依赖 1.更新系统 sudo apt-get update sudo apt-get upgrade 2.安装相关的依赖 sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt-get install libjpeg-de…

【组合数学】CF1312 D

Problem - 1312D - Codeforces 题意&#xff1a; 思路&#xff1a; Code&#xff1a; #include <bits/stdc.h>#define int long longusing i64 long long;constexpr int N 2e5 10; constexpr int M 2e5 10; constexpr int mod 998244353; constexpr int Inf 1e1…

小记std::unique_copy使用方法

因博主工作经验有限&#xff0c;只能通过有限的使用场景来介绍该特性 https://en.cppreference.com/w/cpp/algorithm/unique_copy 使用场景 将一些元素拷贝到另一个地方&#xff0c;可以定义重复的规则&#xff0c;拷贝出来之后是不带有连续相同元素的元素集合 如果需要使用…

azure VM完全复制

创建虚拟机&#xff0c;并创建linux服务&#xff0c;可以参考 https://blog.csdn.net/m0_48468018/article/details/132267096 &#xff0c; https://blog.csdn.net/m0_48468018/article/details/132267315在虚拟机中点击磁盘快照&#xff0c;创建磁盘快照 通过磁盘快照创建磁盘…

【LeetCode75】第三十二题 链表最大孪生和

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目让我们求出链表的最大孪生和&#xff0c;那么什么是孪生和呢&#xff0c;就是对称的节点就是孪生节点&#xff0c;他们的和就是孪生和。 比如第一个节点的孪生节点就是最后一个节点&#xff0c;第二个节点的孪生节点…

【Docker】已经创建好的Docker怎么设置开机自启

已经创建好的Docker怎么设置开机自启 1.使用命令Docker update来完成2.查看是否开启3.验证是否开启 1.使用命令Docker update来完成 操作步骤&#xff1a; docker update --restartalways 容器ID2.查看是否开启 docker inspect 容器Id看到这里RestartPolicy设置为如图&#…

Verilog 入门

Verilog 入门 本内容来自 牛客网Verilog入门特别版 1、一个没有输入和一个输出常数1的输出的电路&#xff0c;输出信号为one module top_module(one);output wire one;assign one 1b1; endmodule2、创建一个具有一个输入和一个输出的模块&#xff0c;其行为类似于电路上的连…

回归预测 | MATLAB实现FA-BP萤火虫算法优化BP神经网络多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现FA-BP萤火虫算法优化BP神经网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现FA-BP萤火虫算法优化BP神经网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本介绍程…

CRYPTO 密码学-笔记

一、古典密码学 1.替换法&#xff1a;用固定的信息&#xff0c;将原文替换成密文 替换法的加密方式&#xff1a;一种是单表替换&#xff0c;另一种是多表替换 单表替换&#xff1a;原文和密文使用同一张表 abcde---》sfdgh 多表替换&#xff1a;有多涨表&#xff0c;原文和密文…