博客系统--自动化测试

news2024/9/23 21:30:16
  • 项目体验地址(账号:123,密码:123)http://120.53.20.213:8080/blog_system/login.html

  • 项目后端说明:http://t.csdn.cn/32Nnv

  • 项目码云Gitee地址:https://gitee.com/GoodManSS/project/tree/master/blog_system

  • 项目测试说明:http://t.csdn.cn/LtWYJ

脑图分析:

AutoTestUtil类

存放一些公共方法,比如单例模式创建ChromeDriver对象,截图功能。
//单例模式创建ChromeDrive
public static ChromeDriver createDriver() {
    if (driver == null) {
        synchronized (AutoTestUtil.class) {
            if (driver == null) {
                driver = new ChromeDriver();
                //创建隐式等待
                driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(20));
            }
        }
    }
    return driver;
}
//截图功能
public static void getScreen(String location) throws IOException {
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
    String time = simpleDateFormat.format(System.currentTimeMillis());
    String saveFileName = "./src/test/java/com/screenPicture/"+location+"/"+time+".png";
    File srcFile = driver.getScreenshotAs(OutputType.FILE);
    FileUtils.copyFile(srcFile,new File(saveFileName));
}

1.LoginTest登录页测试

登录页面加载测试,登录成功/登陆失败的功能测试
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class LoginTest extends AutoTestUtil {
    private static ChromeDriver driver = createDriver();

//进入到登录页面
@BeforeAll
static void baseControl() {
    //注意这里可能没有登录记录  注意前面的登录测试要有记录
    driver.get("http://120.53.20.213:8080/blog_system/login.html");
}


// 1.判断页面元素是否正常加载
// 检查点:是否存在 注册和登录按钮
@Test
@Order(1)
public void loginPageLoadRight() {
    //注册按钮
    String expect1 = driver.findElement(By.cssSelector("body > div.nav > a")).getText();
    Assertions.assertEquals(expect1, "注册");
    //登录按钮
    String expect2 = driver.findElement(By.xpath("//*[@id=\"login-btn\"]")).getAttribute("value");
    Assertions.assertEquals(expect2, "确认登陆");
}


//2.错误的登录测试
@ParameterizedTest
@CsvSource({"11,1", "22,333"})
@Order(2)
public void loginError(String userId, String passWord) {
    //①.进行登录
    driver.findElement(By.cssSelector("#userid")).sendKeys(userId);
    driver.findElement(By.cssSelector("#password")).sendKeys(passWord);
    driver.findElement(By.xpath("//*[@id=\"login-btn\"]")).click();
    //②.判断是否登陆成功--通过看是否出现用户名
    String expect1 = driver.findElement(By.cssSelector("body")).getText();
    Assertions.assertNotEquals(expect1, "用户名或密码为空! 登陆失败!");
    //③.返回页面
    driver.navigate().back();
    driver.findElement(By.cssSelector("#userid")).clear();
    driver.findElement(By.cssSelector("#password")).clear();
}


//3.正常登录的测试
@ParameterizedTest
@CsvSource({"123,123"})
@Order(3)
public void loginRight(String userId, String passWord) {
    //①.进行登录
    driver.findElement(By.cssSelector("#userid")).sendKeys(userId);
    driver.findElement(By.cssSelector("#password")).sendKeys(passWord);
    driver.findElement(By.xpath("//*[@id=\"login-btn\"]")).click();
    //②.判断是否登陆成功--通过看是否出现用户名
    driver.findElement(By.cssSelector("body > div.container > div.container-left > div > h3"));
    //③.返回页面
    driver.navigate().back();
}

2.ListTest列表页测试

测试列表页是否能够正常加载
public class ListTest extends AutoTestUtil {
    private static ChromeDriver driver = createDriver();

    public static void baseControl() {
        driver.get("http://120.53.20.213:8080/blog_system/blog_list.html");
    }
    //测试列表页是否能正常加载
    @Test
    public void listPageLoadRight() {
        baseControl();
        String expect1 = driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).getText();
        Assertions.assertEquals(expect1, "写博客");
        String expect2 = driver.findElement(By.cssSelector("body > div.nav > span")).getText();
        Assertions.assertEquals(expect2, "我的博客系统");
    }
}

3.EditTest编辑页测试

主要测试博客编辑页是否能够正常加载、博客编辑功能是否能够正常使用
public class EditTest extends AutoTestUtil {
    public static ChromeDriver driver;

    @BeforeAll
    private static void baseControl() {
        driver = createDriver();
        driver.get("http://120.53.20.213:8080/blog_system/blog_edit.html");
    }

    //1.测试编辑页导航栏是否正常加载
    @Test
    void editPageLoadRight() throws IOException {
        String expect1 = driver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).getText();
        Assertions.assertEquals(expect1, "注销");
        String expect2 = driver.findElement(By.cssSelector("body > div.nav > span")).getText();
        Assertions.assertEquals(expect2, "我的博客系统");
        getScreen("editPageLoadRight");
    }

    //2.测试编辑文章 发布文章功能是否ok
    @Test
    void editAndSubimitBlog() throws IOException {
        String expect = "test";
        driver.findElement(By.cssSelector("#blog-title")).sendKeys(expect);
        //因博客系统使用到的编辑是第三方软件,所以不能直接使用sendKeys向编辑模块发送文本
        driver.findElement(By.cssSelector("#editor > div.editormd-toolbar > div > ul > li:nth-child(21) > a")).click();
        driver.findElement(By.cssSelector("#editor > div.editormd-toolbar > div > ul > li:nth-child(5) > a")).click();
        driver.findElement(By.cssSelector("#submit")).click();
        //获取列表页第一条博客的标题文本,检查是否跟预期相符
        String actual = driver.findElement(By.cssSelector("body > div.container > div.container-right > div:nth-child(1) > div.title")).getText();
        Assertions.assertEquals(expect,actual);

    }
}

4.DetailTest详情页测试

测试了博客详情页是否可以正常加载显示
测试删除功能是否正常

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class DetailTest extends AutoTestUtil {
    private static ChromeDriver driver;

    @BeforeAll
    public static void baseControl() {
        driver = createDriver();
        driver.get("http://120.53.20.213:8080/blog_system/blog_list.html");
    }

    @Test
    @Order(1)
    void detailLoadRight() throws IOException {
        driver.findElement(By.cssSelector("body > div.container > div.container-right > div:nth-child(1) > a")).click();
        driver.findElement(By.cssSelector("#content"));
        getScreen("detailTest");
    }

    @Test
    @Order(2)
    void blogDelete(){
        String expect = driver.findElement(By.cssSelector("body > div.container > div.container-right > div > div.date")).getText();
        //删除 在测试博客编辑功能时候发布的文章
        driver.findElement(By.cssSelector("#delete-btn")).click();
        //确定返回到博客列表页 第一篇文章不再是测试发布的
        String actual = driver.findElement(By.cssSelector("body > div.container > div.container-right > div:nth-child(1) > div.date")).getText();
        Assertions.assertNotEquals(expect,actual);
    }
}

最终测试结果:

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

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

相关文章

【极狐 GitLab】在 web 端合并分支

一、概述 极狐GitLab是GitLab DevOps平台的中国发行版,一套完备的一站式DevOps平台,从根本上改变了开发、安全和运维团队协作和软件构建方式。极狐GitLab从构思到生产发布,帮助团队提高生产效率,将迭代周期从数周缩短至几分钟&am…

【Spring事物三千问】Spring的事务管理与MyBatis事物管理结合的原理

Spring的事务管理与MyBatis事物管理结合的原理前言正文原生的 MyBatis 的事务处理SqlSessionTransactionMyBatis 事务管理 与 Spring 事务管理的融合SpringManagedTransactionSqlSessionTemplateSqlSessionInterceptormybatis-spring 融合的原理连接获取 & 开启事务连接的关…

【Linux】理解进程地址空间

🍎作者:阿润菜菜 📖专栏:Linux系统编程 ​我们在学习C语言的时候,都学过内存区域的划分如栈、堆、代码区、数据区这些。但我们其实并不真正理解内存 — 我们之前一直说的内存是物理上的内存吗? 前言 我们…

18- TensorFlow实现CIFAR10分类 (tensorflow系列) (项目十八)

项目要点 导入cifar图片集: (train_image, train_label), (test_image, test_label) cifar.load_data() # cifar keras.datasets.cifar10图片归一化处理: train_image train_image / 255定义模型: model keras.Sequential() 输入层: model.add(layers.Conv2D(64, (3, 3…

HTML基础语法

一 前端简介构成语言说明结构HTML页面元素和内容表现CSS网页元素的外观和位置等页面样式(美化)行为JavaScript网页模型的定义和页面交互二 HTML1.简介HTML(Hyper Text Markup Language):超文本标记语言。网页结构整体&…

Kubernetes05: Pod

Kubernetes05: Pod 1、概述 1)最小部署的单元 2)K8s不会处理容器,而是Pod,Pod里边包含多个容器(一组容器的集合) 3)一个Pod中的容器共享一个网络命名空间 4) Pod是短暂存在的东西(重…

使用shiroshiro整合其他组件

什么是shiro? 一款apache公司出品的Java安全框架,主要用于设计针对应用程序的保护,使用shiro可以完成认证、授权、加密、会话管理等。保证系统稳定性、数据安全性 优势:易于使用、易于理解、兼容性强(可以与其他框架集…

SE-SSD论文阅读

摘要 本文提出了一种基于自集成单级目标检测器(SE-SSD)的室外点云三维目标检测方法。我们的重点是利用我们的公式约束开发软目标和硬目标来联合优化模型,而不引入额外的计算在推理中。具体来说,SE-SSD包含一对teacher 和student ssd,在其中我…

Mac 安装 Java 反编译工具 JD-GUI

Mac 安装 Java 反编译工具 JD-GUI JD-GUI 是一款 Java 反编译工具,可以方便的将编译好的 .class 文件反编译为 .java 源码文件,用于开发调试、源码学习等。 官网地址:http://java-decompiler.github.io Git 地址:https://github…

直播美颜sdk是什么?它是怎么让用户”变美“的?

如今,直播美颜sdk、手机摄影、短视频以及社交软件的盛行,让“拍照”成为人们日常生活中不可或缺的一部分。随着直播美颜sdk技术的不断升级,手机摄影的质量也越来越高。有统计数据显示,2018年中国智能手机用户已经达到了7亿人&…

美国最新调查显示 50% 企业已在用 ChatGPT,其中 48% 已让其代替员工,你怎么看?

美国企业开始使用ChatGPT,我认为这不是什么新闻。 如果美国的企业现在还不使用ChatGPT,那才是个大新闻。 据新闻源显示,已经使用chatGPT的企业中,48%已经让其代替员工工作。 ChatGPT的具体职责包括:客服、代码编写、招…

HTB-remote

HTB-remote信息搜集开机提权信息搜集 nmap 较为感兴趣的端口: 2180nfs 首先尝试21端口,可以看到并没有文件在ftp服务器里面,而且也无法上传文件。 80端口。 在contact里面找到了能够登录的网站。 经过简单的测试发现可能不存在sql注…

逆向、安全、工具集

0、安卓逆向环境 r0env 原味镜像介绍文章:https://mp.weixin.qq.com/s/gBdcaAx8EInRXPUGeJ5ljQ 原味镜像介绍视频:https://www.bilibili.com/video/BV1qQ4y1R7wW/ 百度盘:链接:https://pan.baidu.com/s/1anvG0Ol_qICt8u7q5_eQJw 提取码:3x2a …

【Spring源码】Spring AOP的核心概念

废话版什么是AOP关于什么是AOP,这里还是要简单介绍下AOP,Aspect Oriented Programming,面向切面编程,通过预编译和运行期间提供动态代理的方式实现程序功能的统一维护,使用AOP可以降低各个部分的耦合度,提高…

openfeign负载均衡策略 | Spring Cloud 5

一、Spring Cloud LoadBalancer介绍 Spring Cloud LoadBalancer是Spring Cloud官网提供的一个客户端负载均衡器,功能类似于Ribbon。在Spring Cloud Nacos 2021移除了中Ribbon组件,Spring Cloud在Spring Cloud Commons项目中,添加了Spring Cl…

华为OD机试题,用 Java 解【N 进制减法】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…

Linux | 分布式版本控制工具Git【版本管理 + 远程仓库克隆】

文章目录一、前言二、有关git的相关历史介绍三、Git版本管理1、感性理解 —— 大学生实验报告2、程序员与产品经理3、张三的CEO之路 —— 版本管理工具的诞生四、如何在Linux上使用Git1、创建仓库2、将仓库克隆到本地3、git三板斧① git add② git commit③ git push4、有关git…

yarn run serve报错Error: Cannot find module ‘@vue/cli-plugin-babel‘ 的解决办法

问题概述 关于这个问题,是在构建前端工程的时候遇到的,项目构建完成后,“yarn run serve”启动项目时,出现的问题:“ Error: Cannot find module ‘vue/cli-plugin-babel‘ ” 如下图: 具体信息如下&…

(24秋招笔试准备)回溯专题--代码随想录刷题记录

回溯算法理论基础回溯三部曲:编辑切换为居中添加图片注释,不超过 140 字(可选)组合问题https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ组合总和https://mp.weixin.qq.com/s/HX7WW6ixbFZJASkRnCTC3whttps://mp.weixin.qq.com/…

Linux系统认知——驱动认知

文章目录一、驱动相关概念1.什么是驱动2.被驱动设备分类3.设备文件的主设备号和次设备号4.设备驱动整体调用过程二、基于框架编写驱动代码1.驱动代码框架2.驱动代码的编译和测试三、树莓派I/O口驱动的编写1.微机的总线地址、物理地址、虚拟地址介绍2.通过树莓派芯片手册确定需要…