博客系统测试用例设计之自动化测试

测试用例设计之自动化测试

  • 🌷 一 测试用例设计
    • 🌺 1 功能测试
      • 🌸 (1)登录功能
      • 🌸 (2)列表页功能
      • 🌸 (3)编辑博客功能
      • 🌸 (4)博客详情页功能
      • 🌸 (5)公共点击功能
    • 🌺 2 界面测试
    • 🌺 3 易用性测试
    • 🌺兼容性测试
    • 🌺 4 性能测试
    • 🌺 5 网络测试
    • 🌺 6 安全性测试
  • 🌷 二 完整测试用例
  • 🌷 三 自动化测试
    • 🌺 1 登录测试
    • 🌺 2 博客列表页测试
    • 🌺 3 详情页测试
    • 🌺 4 编写博客测试
    • 🌺 4 发布博客测试
    • 🌺 4 删除博客测试
    • 🌺 5注销用户测试

首先看看我的博客系统的界面如下:
(1)登录界面
在这里插入图片描述
(2)主列表页界面:
在这里插入图片描述
(3)博客详情页界面:
在这里插入图片描述
(4)博客编辑界面:
在这里插入图片描述

🌷 一 测试用例设计

测试用例一般从这几个方面进行设计:功能、界面、兼容、性能、易用性、安全性、网络。但由于是本人的一个小项目,所以涉及到的方面有限。

🌺 1 功能测试

博客系统分为四个主要功能:登录功能、列表页功能、编辑博客功能、博客详情页功能。

🌸 (1)登录功能

在这里插入图片描述

🌸 (2)列表页功能

在这里插入图片描述

🌸 (3)编辑博客功能

在这里插入图片描述

🌸 (4)博客详情页功能

在这里插入图片描述

🌸 (5)公共点击功能

因为导航栏是公共的,所以有这些功能是公共的:

在这里插入图片描述

🌺 2 界面测试

在这里插入图片描述

🌺 3 易用性测试

在这里插入图片描述

🌺兼容性测试

由于这是本人的一个小系统,所以兼容性测试涉及的比较少,通常情况下还会涉及的安卓/平板设备的兼容性,但此处涉及不到。

在这里插入图片描述

🌺 4 性能测试

在这里插入图片描述

🌺 5 网络测试

在这里插入图片描述

🌺 6 安全性测试

在这里插入图片描述
以上就是所有的测试用例了,完整的测试用例点击下方链接:

🌷 二 完整测试用例

👉🏻博客系统完整测试用例👈🏻

🌷 三 自动化测试

因为自动化测试是测试一些核心的并且重复性高的功能,所以此处对主要的核心功能进行了自动化测试。测试的主要功能有登录功能、博客列表页功能、详情页功能、删除功能等等。具体的测试用例查看下图:
首先需要创建一个类来初始化 webDriver:

public class InitAndEnd {
    static WebDriver webDriver;
    @BeforeAll
    static void SetUp() {
        // 加载浏览器驱动
        webDriver = new ChromeDriver();
    }
    @AfterAll
    static void TearDown() {
        // 退出浏览器
        webDriver.quit();
    }
}

🌺 1 登录测试

输入正确的账号以及密码会登陆成功,此处的账号为“zhangsan”,密码“123”,这里使用 CSV 来获取文件参数的方式进行传参,CSV文件内容如下:
在这里插入图片描述
第一个为用户名 username,第二个为用户密码 123,第三个参数为博客列表页 url(用于检测登录成功后是否会跳转到该页面)

/**
* 测试用例 1: 输入正确的账号,密码  ----> 登陆成功
*/
@Order(1)
@ParameterizedTest
@CsvFileSource(resources = "LoginSuccess.csv")
void LoginSuccess(String username, String password, String blog_list_url){
    System.out.println(username + password + blog_list_url);
    // 打开博客登录页面
    webDriver.get("http://localhost:8080/blog_system-2/login.html");
    webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

    // 输入账号 zhangsan
    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();
    webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

    // 跳转到列表页
    // 获取到当前页面的 cur_url
    String cur_url = webDriver.getCurrentUrl();
    // 如果 cur_url 等于列表页对应的值,则测试通过,否则不通过
    Assertions.assertEquals(blog_list_url, cur_url);
    webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

    // 如果列表页展示用户信息是 zhangsan,测试时通过,否则失败
    String cur_name = webDriver.findElement(By.cssSelector
            ("body > div.container > div.container-left > div > h3")).getText();
    Assertions.assertEquals(username, cur_name);
}

🌺 2 博客列表页测试

因为访问非登录页面时,都会跳转到其他页面,所以使用了 @Order() 注解对测试用例进行排序,按照一定的顺序测试,首先是登录页面,之后再访问其他页面时就不会进行跳转了。
通过校验发布的文章数量不为 0 来测试该页面的功能。

/**
* 测试用例 2:测试 博客列表博客数量 已经发布的博客数量不为 0
*/
@Order(2)
@Test
void BlogList() throws InterruptedException {
    // 打开博客列表页
    webDriver.get("http://localhost:8080/blog_system-2/blog_list.html");
    // 获取页面上所有博客标题对应的元素
    webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
    int title_num = webDriver.findElements(By.cssSelector(".title")).size();
    System.out.println(title_num);
    // 如果元素数量不为 0,测试通过
    Assertions.assertNotEquals(0, title_num);
}

🌺 3 详情页测试

此处使用到了方法传参,方法名为 Generator_detail,,该方法设计了 3 个参数,第一个参数方法为第 1 篇博客详情页的 url,第 2 个参数为详情页的标题,第 3 个为文第一篇文章的标题。

public static Stream<Arguments> Generator_detail() {
    return Stream.of(Arguments.arguments(
            "http://localhost:8080/blog_system-2/blog_detail.html?blogId=12",
            "博客详情页",
            "自动化测试"));
}

测试用例如下:通过 webDriver 分别获取到博客详情页的 url、标题、文章的题目,并与预期的进行对比,如果一致则测试通过,否则便失败。

/**
  * 测试用例 3:博客详情页的校验
  * url、博客标题、页面的 title是 “博客详情页”
  */
 @Order(3)
 @ParameterizedTest
 @MethodSource("Generator_detail")
 void BlogDetail(String expected_url, String expected_title, String expected_blog_title) throws InterruptedException {
     webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

     // 找到第一篇博客对应的 查看全文 的按钮
     webDriver.findElement(By.xpath("/html/body/div[2]/div[2]/div[1]/a")).click();
     webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

     // 获取当前页面 url
     String cur_url = webDriver.getCurrentUrl();
     webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

     // 获取当前页面 title
     String cur_title = webDriver.getTitle();
     webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

     // 获取博客页面 标题
     String cur_blog_title = webDriver.findElement(
             By.cssSelector("body > div.container > div.container-right > h3")).getText();
     webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
     Assertions.assertEquals(expected_url, cur_url);
     Assertions.assertEquals(expected_title, cur_title);
     Assertions.assertEquals(expected_blog_title, cur_blog_title);
     if(cur_blog_title.contains(expected_blog_title)) {
         System.out.println("测试通过");
     } else {
         System.out.println("测试不通过");
     }
 }

🌺 4 编写博客测试

在此用例中,编写完文章并发布之后,页面会跳转到博客列表页,所以判断跳转的页面 url 与预期的 url 是否一致。

/**
  * 测试用例 4:写博客
  */
 @Test
 @Order(4)
 void EditBlog() throws InterruptedException {
     // 打开博客列表页,找到写博客按钮,点击
     webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
     webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
     // 通过 js 将标题进行输入,需要将 webDriver 进行强制转换为 JavascriptExecutor 类型
     ((JavascriptExecutor)webDriver).executeScript(
             "document.getElementById(\"title\").value=\"自动化测试\"");
     sleep(3000);
     // 点击发布
     webDriver.findElement(By.cssSelector("#submit")).click();
     sleep(3000);
     // 进行校验
     // 获取当前的 url
     String cur_url = webDriver.getCurrentUrl();
     Assertions.assertEquals(
             "http://localhost:8080/blog_system-2/blog_list.html", cur_url);
 }

🌺 4 发布博客测试

对已经发布的文章的标题和时间进行校验,用第一篇文章进行校验。

/**
 * 测试用例 5:校验已发布博客的标题
 *           校验已发布博客的时间
 */
@Test
@Order(5)
void BlogInfoChecked() {
    webDriver.get("http://localhost:8080/blog_system-2/blog_list.html");
    // 获取第 1篇博客的标题
    String first_blog_title = webDriver.findElement(By.cssSelector("body > div.container > div.container-right > div:nth-child(1) > div.title"))
            .getText();
    // 获取第 1 篇博客的时间
    String cur_time = webDriver.findElement(By.xpath("/html/body/div[2]/div[2]/div[1]/div[2]")).getText();
    // 校验博客标题
    Assertions.assertEquals("自动化测试", first_blog_title);
    // 如果时间是 2023-06-08,则测试通过
//        Assertions.assertEquals("2023-06-08", cur_time);
    if (cur_time.contains("2023-06-08")) {
        System.out.println("测试通过");
    } else {
        System.out.println("当前时间是:" + cur_time);
        System.out.println("测试不通过");
    }
}

🌺 4 删除博客测试

删除文章之后,会跳转到列表页面,并且此时的第一篇文章的标题不再是刚才的标题了,所以可以针对这个点进行校验。

 /**
 * 测试用例 6:删除刚才发布的博客
 */
@Test
@Order(6)
void DeleteBlog() {
    // 打开博客列表页面
    webDriver.get("http://localhost:8080/blog_system-2/blog_list.html");
    // 点击全文按钮
    webDriver.findElement(By.xpath("/html/body/div[2]/div[2]/div[1]/a")).click();
    // 点击删除按钮,删除之后页面跳转到博客列表页
    webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(7)")).click();
    // 博客列表页第一篇博客标题不是“自动化测试”
    String cur_blog_title = webDriver.findElement(By.xpath("/html/body/div[2]/div[2]/div[2]/div[1]")).getText();
    Assertions.assertNotEquals(cur_blog_title, "自动化测试");
}

🌺 5注销用户测试

点击注销,会返回到登录页面,并且此时的账号和密码会为空,所以校验注销之后的账号和密码的输入框是否为空。

/**
     * 测试用例 7:针对 “注销” 功能进行测试。
     * 点击注销用户就会退出,页面跳转到登录页面,登录页面的账号和密码为空
     */
    @Test
    @Order(7)
    void Logout() {
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();
        // 校验 1: url(登录的)
        String cur_url = webDriver.getCurrentUrl();
        Assertions.assertEquals("http://localhost:8080/blog_system-2/login.html", cur_url);
        // 校验 2: 校验提交按钮
        WebElement webElement = webDriver.findElement(By.cssSelector("#submit"));
        Assertions.assertNotNull(webElement);
    }

📢完结撒🌸
以上便是完整的测试用例以及自动化测试啦~~~
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DC LAB8SDC约束四种时序路径分析

DC LAB 1.启动DC2.读入设计3. 查看所有违例的约束报告3.1 report_constraint -all_violators (alias rc)3.2 view report_constraint -all_violators -verbose -significant_digits 4 (打印详细报告) 4.查看时序报告 report_timing -significant_digits 45. 约束组合逻辑(adr_i…

17 条件随机场

文章目录 17 条件随机场——CRF&#xff08;Condition Random Field&#xff09;17.1 背景介绍17.2 HMM与MEMM的区别17.3 MEMM与CRF的区别17.4 CRF模型17.4.1 CRF的概率密度函数17.4.2 CRF概率密度函数简化&#xff08;向量形式&#xff09; 17.5 CRF需要解决的问题17.6 边缘概…

测试者必知—如何做Web测试?常见测试点总结

目录 前言&#xff1a; 一、Web应用程序 二、功能测试 三、易用性测试&#xff08;界面测试&#xff09; 四、兼容性测试 五、安全性测试 六、性能测试 前言&#xff1a; Web测试是指对基于Web技术的应用程序进行测试&#xff0c;以测试其功能、性能、安全和稳定性等方面的表…

【图书推荐 | 12】前端系列

【赠书活动第十二期 】 图书推荐 本期书籍&#xff1a;前端系列 图书列表&#xff1a; Vue.js核心技术解析Nuxt.js实战Nuxt.js Web开发实战HTML5CSS 从入门到精通Flutter2 开发实例精解Electron项目开发实战 Vue.js核心技术解析 Nuxt.js实战 Nuxt.js Web开发实战 HTML5CSS 从入…

【业务功能篇20】Springboot java逻辑实现动态行转列需求

在此前&#xff0c;我也写过一个行转列的文章&#xff0c;是用存储过程sql处理的一个动态的逻辑 Mysql 存储过程\Mybatis框架call调用 实现动态行转列 那么后面我们同样又接收了业务的一个新需求&#xff0c;针对的是不同的业务数据&#xff0c;做的同样的一个展示数据报表&…

VueX使用简明笔记

1、作用&#xff1a; vuex是使用vue中必不可少的一部分&#xff0c;基于父子、兄弟组件&#xff0c;我们传值可能会很方便&#xff0c;但是如果是没有关联的组件之间要使用同一组数据&#xff0c;就显得很无能为力&#xff0c;那么vuex就很好的解决了我们这种问题&#xff0c;…

MySQL数据库 – node使用

1 MySQL查询对象 2 MySQL查询数组 3 mysql2库介绍使用 4 mysql2预处理语句 5 mysql2连接池使用 6 mysql2的Promi 这里仅说明如何使用服务器连接数据库并进行操作。 预处理语句就是可以输入变量的语句&#xff08;表现形式是有符号&#xff1a;&#xff1f;&#xff09;。需…

portraiture宿主插件最新v4中文版本下载及使用教程

自拍怎么可以不修图呢&#xff1f;如果要修图的话&#xff0c;磨皮就是其中非常重要的一环。皮肤看起来细腻光滑了&#xff0c;整个人的颜值都会瞬间拉高。下面就让我们介绍一下磨皮用什么软件好用&#xff0c;什么软件可以手动磨皮的相关内容。portraiture是ps人像修图中常用的…

为何唐宋诗词鼎盛,而到了明清变成了小说

我国是一个历史悠久的国家&#xff0c;在漫长的历史长河中&#xff0c;随着朝代的更替&#xff0c;很多事也发生了有趣的变化。 例如唐宋时期盛行的是诗词&#xff0c;而到了明清时代&#xff0c;小说又开始盛行了起来&#xff0c;那么造成这种文风改变的原因是什么呢&#xf…

Java版本spring cloud 工程管理系统软件 系统源代码 自主研发,工程行业适用

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…

实战案例|黑灰产肆虐,腾讯ACE一键打造清朗游戏世界

随着游戏行业的快速发展&#xff0c;相关黑色产业链的问题日益严重&#xff0c;各种外挂、违规内容、非法交易现象的出现破坏着游戏的生态&#xff0c;为行业带来诸多安全挑战&#xff0c;也影响着玩家们的游戏体验。越来越多游戏厂商开始重视游戏安全问题&#xff0c;并探索全…

华为OD机试真题 JavaScript 实现【最远足迹】【2022Q4 100分】,附详细解题思路

一、题目描述 某探险队负责对地下洞穴进行探险。探险队成员在进行探险任务时&#xff0c;随身携带的记录器会不定期地记录自身的坐标&#xff0c;但在记录的间隙中也会记录其他数据。探索工作结束后&#xff0c;探险队需要获取到某成员在探险过程中相对于探险队总部的最远的足…

Mujoco210 Ubuntu 22.04配置安装(一)

目录 .1 下载 1.1 解压 1.2 许可问题 1.3 环境配置 1.4 测试mujoco .2 安装mujoco-py 2.1 conda激活虚拟环境\或新创建一个环境 2.2 下载mujoco-py ​编辑 2.3 配置环境变量 2.4 测试mujoco-py 2.5 测试时的一些报错处理 2.5.0 command /usr/bin/gcc failed with…

读写ini配置文件(C++)

文章目录 1、为什么要使用ini或者其它(例如xml,json)配置文件&#xff1f;2、ini文件基本介绍3、ini配置文件的格式4、C读写ini配置文件5、 代码示例6、 配置文件的解析库 文章转载于&#xff1a;https://blog.csdn.net/weixin_44517656/article/details/109014236 1、为什么要…

docker harbor私有仓库部署

docker harbor私有仓库部署 docker system prune -a 删除停掉的服务&#xff0c;自定义网络等。 docker 私有仓库 docker配置文件 vim /etc/docker.daemon.josn { “insecury-registries”: ["192.168.232.10:5000]&#xff0c;#指定私有仓库 } docker pull/push 19…

防雪崩利器之Hystrix

Hystrix作为一个容错组件&#xff0c;本文从它的作用、熔断设计、工作流程和应用方面一一道来&#xff0c;帮助大家了解如何使用。 1、什么是灾难性雪崩效应 要讲Hystrix&#xff0c;我们就要讲一种场景&#xff0c;在微服务架构中&#xff0c;如果底层服务出现故障&#xff0…

BBA EDI 项目数据库方案开源介绍

近期为了帮助广大用户更好地使用 EDI 系统&#xff0c;我们根据以往的项目实施经验&#xff0c;将成熟的 EDI 项目进行开源。用户安装好知行之桥EDI系统之后&#xff0c;只需要下载我们整理好的示例代码&#xff0c;并放置在知行之桥指定的工作区中&#xff0c;即可开始使用。 …

Linux操作系统——第三章 基础IO

目录 接口介绍 open 文件描述符fd 0 & 1 & 2 文件描述符的分配规则 重定向 FILE 理解文件系统 inode ​编辑 理解硬链接 软链接 动态库和静态库 静态库与动态库 生成静态库 库搜索路径 生成动态库 使用动态库 运行动态库 使用外部库 接口介绍 o…

让小白也能看懂,ChatGPT入门级科普“十问十答”

由于现在GPT火热&#xff0c;360老板已经开始总动员. 白领的日常工作肯定是要发生颠覆性变化的。下面我们就通过自问自答的方式带领小白用户了解一下ChatGPT. 1、ChatGPT到底是什么&#xff1f; ChatGPT 是一个由美国人工智能公司 OpenAI 开发的自然语言处理&#xff08;NLP&…

湖南大学OS-2019期末考试解析

【特别注意】 答案来源于@wolf以及网络 是我在备考时自己做的,仅供参考,若有不同的地方欢迎讨论。 【试卷评析】 这张卷子有点老了,部分题目可能有用。如果仔细研究应该会有所收获。 【试卷与答案】 一、选择题(15%) 1、下面哪些行为会导致CPU进入内核模式 C (1)…