学海记录项目测试报告

news2025/1/12 9:02:36

在这里插入图片描述

⭐️前言⭐️

本篇文章是博主基于学海记录的个人项目所做的测试报告,用于总结运用自动化测试技术,应用于自己的项目。

🍉欢迎点赞 👍 收藏留言评论 📝私信必回哟😁

🍉博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言

🍉博客中涉及源码及博主日常练习代码均已上传GitHub


请添加图片描述

📍内容导读📍

  • 🍅1.UI自动化测试用例
  • 🍅2.selenium4+JUnit5实现Web自动化测试
    • 2.1 测试工具类
    • 2.2 博客登录页测试
    • 2.3 博客列表页测试
    • 2.4 博客详情页测试
    • 2.5 博客编辑页测试
    • 2.6 驱动释放
    • 2.7 测试套件
    • 2.8 测试结果展示

🍅1.UI自动化测试用例

请添加图片描述

🍅2.selenium4+JUnit5实现Web自动化测试

针对上图中的UI自动化测试用例,挑选部分用例通过selenium4+JUnit5实现Web自动化测试,如下是具体实现:

2.1 测试工具类

因为每一步的测试都需要获取驱动对象,所以将获取驱动对象的方法抽象出来单独成类,用于其他类的使用;

便于检查测试结果,还需要在公共类中实现屏幕截图的方法,以下是测试工具类的具体代码:

public class Utils {
    public static ChromeDriver driver;

    // 创建驱动对象
    public static ChromeDriver createDriver() {
        // 设置无头模式
        ChromeOptions options=new ChromeOptions();
        options.addArguments("-headless");
        // 驱动对象已经创建好了/没有创建
        if(driver==null) {
            driver=new ChromeDriver(options);
            // 创建隐式等待(防止因页面加载过慢而导致错误)
            driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
        }
        return driver;
    }

    public static List<String> getTime() {
        // 文件按照天的维度按文件夹进行保存
        SimpleDateFormat sim1=new SimpleDateFormat("yyyyMMdd-HHmmssSS");
        SimpleDateFormat sim2=new SimpleDateFormat("yyyyMMdd");
        String fileName=sim1.format(System.currentTimeMillis());
        String dirName=sim2.format(System.currentTimeMillis());
        List<String> list=new ArrayList<>();
        list.add(dirName);
        list.add(fileName);
        return list;
    }
    /**
     * 获取屏幕截图,把所有的用例执行结果保存下来
     */
    public static void getScreenShot(String str) throws IOException {
        List<String> list=getTime();
        String fileName="./src/test/java/screenshot/"+list.get(0)+"/"+str+"_"+list.get(1)+".png";
        File srcFile=driver.getScreenshotAs(OutputType.FILE);
        // 把屏幕截图生成的文件放到指定的路径
        FileUtils.copyFile(srcFile,new File(fileName));
    }
}

2.2 博客登录页测试

首先先获取到驱动对象,然后通过@Before注解方法,访问到登录页面的URL。

public static ChromeDriver driver= Utils.createDriver();
    // 如果要测试登录页面,以下所有的用例都有一个共同的步骤
    // 1、要有浏览器对象  2、访问登录页面的URL
    @BeforeAll
    static void baseControl() {
        driver.get("http://162.14.74.192:8081/login.html");
    }

通过检查跳转后的博客列表页的元素是否存在,检查登录页面打开是否正确

/*
    检查登录页面打开是否正确
    检查点:公共主页 注册元素是否存在
     */
    @Test
    @Order(1)
    void loginLoad() throws IOException {
        driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)"));
        driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)"));
        Utils.getScreenShot(getClass().getName());
    }

多参数实现正常登录的测试

    /*
    检查正常登录情况
     */
    @ParameterizedTest
    @CsvSource({"admin,admin","zhangsan,123"})
    @Order(2)
    void loginSuccess(String name,String password) throws IOException, InterruptedException {
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();

        driver.findElement(By.cssSelector("#username")).sendKeys(name);
        driver.findElement(By.cssSelector("#password")).sendKeys(password);
        driver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(500);
        // 对登陆结果进行检测,
        Alert alert=driver.switchTo().alert();
        String expect="登录成功!";
        Assertions.assertEquals(expect,alert.getText());
        alert.accept();
        Utils.getScreenShot(getClass().getName());
        driver.navigate().back();
    }

检验异常登录的情况

 /*
    检查异常登录情况
     */
    @ParameterizedTest
    @CsvSource({"admin,123"})
    @Order(3)
    void loginFail(String name,String password) throws InterruptedException, IOException {
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();

        driver.findElement(By.cssSelector("#username")).sendKeys(name);
        driver.findElement(By.cssSelector("#password")).sendKeys(password);
        driver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(500);
        // 对异常登录结果进行检测
        Alert alert=driver.switchTo().alert();
        String expect="抱歉:用户名或密码错误,请重新输入!";
        Assertions.assertEquals(expect,alert.getText());
        alert.accept();
        Utils.getScreenShot(getClass().getName());
    }

注意以上的测试用例需要按指定顺序来执行,必须得先检验完成登录页面能正常打开,才能进行下一步正常登录、异常登录的测试。

以下是登录页面自动化测试用例的总代码。

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogLoginTest {
    public static ChromeDriver driver= Utils.createDriver();
    // 如果要测试登录页面,以下所有的用例都有一个共同的步骤
    // 1、要有浏览器对象  2、访问登录页面的URL
    @BeforeAll
    static void baseControl() {
        driver.get("http://162.14.74.192:8081/login.html");
    }

    /*
    检查登录页面打开是否正确
    检查点:公共主页 注册元素是否存在
     */
    @Test
    @Order(1)
    void loginLoad() throws IOException {
        driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)"));
        driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)"));
        Utils.getScreenShot(getClass().getName());
    }

    /*
    检查正常登录情况
     */
    @ParameterizedTest
    @CsvSource({"admin,admin","zhangsan,123"})
    @Order(2)
    void loginSuccess(String name,String password) throws IOException, InterruptedException {
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();

        driver.findElement(By.cssSelector("#username")).sendKeys(name);
        driver.findElement(By.cssSelector("#password")).sendKeys(password);
        driver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(500);
        // 对登陆结果进行检测,
        Alert alert=driver.switchTo().alert();
        String expect="登录成功!";
        Assertions.assertEquals(expect,alert.getText());
        alert.accept();
        Utils.getScreenShot(getClass().getName());
        driver.navigate().back();
    }

    /*
    检查异常登录情况
     */
    @ParameterizedTest
    @CsvSource({"admin,123"})
    @Order(3)
    void loginFail(String name,String password) throws InterruptedException, IOException {
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();

        driver.findElement(By.cssSelector("#username")).sendKeys(name);
        driver.findElement(By.cssSelector("#password")).sendKeys(password);
        driver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(500);
        // 对异常登录结果进行检测
        Alert alert=driver.switchTo().alert();
        String expect="抱歉:用户名或密码错误,请重新输入!";
        Assertions.assertEquals(expect,alert.getText());
        alert.accept();
        Utils.getScreenShot(getClass().getName());
    }
}

2.3 博客列表页测试

首先先访问到博客列表页,对博客列表页中的元素检查是否存在来检验博客列表页的加载。

public class BlogListTest {
    public static ChromeDriver driver= Utils.createDriver();

    @BeforeAll
    static void baseControl() {
        driver.get("http://162.14.74.192:8081/myblog_list.html");
    }

    /**
     * 博客列表页可以正常显示
     */
    @Test
    void listPageLoadTest() throws IOException {
        driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)"));
        driver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)"));
        Utils.getScreenShot(getClass().getName());
    }
}

2.4 博客详情页测试

首先先访问到博客详情页,对博客详情页中的元素检查是否存在来检验博客详情页的加载。

public class BlogDetailTest {
    public static ChromeDriver driver= Utils.createDriver();
    @BeforeAll
    static void baseControl() {
        driver.get("http://162.14.74.192:8081/blog_content.html?blogId=1");
    }

    @Test
    void blogDetailLoadTest() throws IOException {
        driver.findElement(By.xpath("//*[@id=\"title\"]"));
        Utils.getScreenShot(getClass().getName());
    }
}

2.5 博客编辑页测试

首先先访问到博客编辑页,对博客编辑页中的元素检查是否存在来检验博客编辑页的加载。

 public static ChromeDriver driver= Utils.createDriver();

    @BeforeAll
    static void baseControl() {
        driver.get("http://162.14.74.192:8081/blog_edit.html");
    }
    /*
    检查博客编辑页是否可以正常打开
     */
    @Test
    @Order(1)
    void editPageLoadTest() throws IOException {
        driver.findElement(By.cssSelector("#title"));
        driver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button"));
        Utils.getScreenShot(getClass().getName());
    }

博客编辑页的测试中,还需要对是否能够正常编辑并发布文章进行测试。

 /*
    检查能不能正常编辑并发布文章
     */
    @Test
    @Order(2)
    void editAndSubmitBlogTest() throws IOException, InterruptedException {
        String title="测试文章";
        driver.findElement(By.cssSelector("#title")).sendKeys(title);
        // 因博客系统使用到的编辑器是第三方库,所以不能直接使用sendKeys向编辑模块发送文本
        driver.findElement(By.cssSelector("#editorDiv > div.editormd-toolbar > div > ul > li:nth-child(20) > a > i")).click();
        driver.findElement(By.cssSelector("#editorDiv > div.editormd-toolbar > div > ul > li:nth-child(21) > a > i")).click();
        driver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click();
        Thread.sleep(500);
        // 对异常登录结果进行检测
        Alert alert=driver.switchTo().alert();
        String expect="恭喜:发布成功!";
        Assertions.assertEquals(expect,alert.getText());
        alert.accept();
        Utils.getScreenShot(getClass().getName());
    }

总代码:

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogEditTest {
    public static ChromeDriver driver= Utils.createDriver();

    @BeforeAll
    static void baseControl() {
        driver.get("http://162.14.74.192:8081/blog_edit.html");
    }
    /*
    检查博客编辑页是否可以正常打开
     */
    @Test
    @Order(1)
    void editPageLoadTest() throws IOException {
        driver.findElement(By.cssSelector("#title"));
        driver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button"));
        Utils.getScreenShot(getClass().getName());
    }
    /*
    检查能不能正常编辑并发布文章
     */
    @Test
    @Order(2)
    void editAndSubmitBlogTest() throws IOException, InterruptedException {
        String title="测试文章";
        driver.findElement(By.cssSelector("#title")).sendKeys(title);
        // 因博客系统使用到的编辑器是第三方库,所以不能直接使用sendKeys向编辑模块发送文本
        driver.findElement(By.cssSelector("#editorDiv > div.editormd-toolbar > div > ul > li:nth-child(20) > a > i")).click();
        driver.findElement(By.cssSelector("#editorDiv > div.editormd-toolbar > div > ul > li:nth-child(21) > a > i")).click();
        driver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click();
        Thread.sleep(500);
        // 对异常登录结果进行检测
        Alert alert=driver.switchTo().alert();
        String expect="恭喜:发布成功!";
        Assertions.assertEquals(expect,alert.getText());
        alert.accept();
        Utils.getScreenShot(getClass().getName());
    }
}

2.6 驱动释放

当完成上述所有的测试后,需要对驱动进行释放:

public class DriverQuitTest {
    public static ChromeDriver driver= Utils.createDriver();

    // 最后需要关闭driver
    @Test
    void driverQuit() {
        driver.quit();
    }
}

2.7 测试套件

通过测试套件,指定按顺序的类中的所有测试用例开始执行:

@Suite
@SelectClasses({BlogLoginTest.class,BlogListTest.class,BlogDetailTest.class,BlogEditTest.class,DriverQuitTest.class})
public class RunSuite {
}

2.8 测试结果展示

测试结果如下图:
在这里插入图片描述


⭐️最后的话⭐️
总结不易,希望uu们不要吝啬你们的👍哟(^U^)ノ~YO!!如有问题,欢迎评论区批评指正😁

请添加图片描述

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

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

相关文章

【查找算法】解析学习四大常用的计算机查找算法 | C++

第二十二章 四大查找算法 目录 第二十二章 四大查找算法 ●前言 ●查找算法 ●一、顺序查找法 1.什么是顺序查找法&#xff1f; 2.案例实现 ●二、二分查找法 1.什么是二分查找法&#xff1f; 2.案例实现 ●三、插值查找法 1.什么是插值查找法&#xff1f; 2…

数据结构:基数排序

基数排序(radix sorting) 实现排序主要是通过关键字之间的比较和移动记录这两种操作来完成的,而实现基数排序不需要进行关键字间的比较,而是利用“分配”和“收集”两种基本操作。 例如,我们可以用分配和收集的方法来对扑克牌进行“排序” 已知扑克牌中 52 张牌面的次序关系为…

Time-distributed 的理解

前言 今天看到论文中用到 Time-distributed CNN&#xff0c;第一次见到 Time-distributed&#xff0c;不理解是什么含义&#xff0c;看到代码实现也很懵。不管什么网络结构&#xff0c;外面都能套一个TimeDistributed。看了几个博客&#xff0c;还是不明白&#xff0c;问了问C…

Python数据挖掘基础

一、Matplotlib 画二维图表的python库&#xff0c;实现数据可视化 &#xff0c; 帮助理解数据&#xff0c;方便选择更合适的分析方法1、折线图1.1引入matplotlibimport matplotlib.pyplot as plt %matplotlib inlineplt.figure() plt.plot([1, 0, 9], [4, 5, 6]) plt.show()1.2…

知识探索项目测试报告

⭐️前言⭐️ 本篇文章是博主基于知识探索项目所做的测试报告&#xff0c;主要涉及到的测试知识有设计测试用例、自动化测试等测试知识。 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主将持续更新学习记录收获…

基于springboot+vue的药物咨询平台

基于springbootvue的药物咨询平台 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&…

二阶段提交事务的实现和缺点

背景 说起分布式事务&#xff0c;我们最绕不开的一个话题就是该不该使用分布式事务&#xff0c;而要理解为什么做出使用与否的决定&#xff0c;就必须要提到分布式事务中的最经典的实现&#xff1a;两阶段提交事务,本文我们就简答介绍下这个两阶段提交事务以及它的优缺点 技术…

【Opencv 系列】 第6章 人脸检测(Haar/dlib) 关键点检测

本章内容 1.人脸检测&#xff0c;分别用Haar 和 dlib 目标&#xff1a;确定图片中人脸的位置&#xff0c;并画出矩形框 Haar Cascade 哈尔级联 核心原理 &#xff08;1&#xff09;使用Haar-like特征做检测 &#xff08;2&#xff09;Integral Image : 积分图加速特征计算 …

SpringSecurity的权限校验详解说明(附完整代码)

说明 SpringSecurity的权限校是基于SpringSecurity的安全认证的详解说明(附完整代码) &#xff08;https://blog.csdn.net/qq_51076413/article/details/129102660&#xff09;的讲解&#xff0c;如果不了解SpringSecurity是怎么认证&#xff0c;请先看下【SpringSecurity的安…

【1792. 最大平均通过率】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 一所学校里有一些班级&#xff0c;每个班级里有一些学生&#xff0c;现在每个班都会进行一场期末考试。给你一个二维数组 classes &#xff0c;其中 classes[i] [passi, totali] &#xff0c;表示你…

0xL4ugh 2023

这回跟着个队伍跑&#xff0c;不过还是2X以后的成绩&#xff0c;前边太卷了。自己会的部分&#xff0c;有些是别人已经提交了的。记录一下。Cryptocrypto 1给了一些数据&#xff0c;像这样就没有别的了ct [0, 1, 1, 2, 5, 10, 20, 40, 79, 159, 317, 635, 1269, 2538, 5077, 1…

2023.02.19 学习周报

文章目录摘要文献阅读1.题目2.摘要3.介绍4.本文贡献5.方法5.1 Local Representation Learning5.2 Global Representation Learning5.3 Item Similarity Gating6.实验6.1 数据集6.2 结果7.结论深度学习1.对偶问题1.1 拉格朗日乘数法1.2 强对偶性2.SVM优化3.软间隔3.1 解决问题3.…

尚医通 (十八)微信登录

目录一、生成微信登录二维码1、准备工作2、后端开发service_user3、前端显示登录二维码4、二维码出现不了进行调试二、开发微信扫描回调1、准备工作2、后台开发3、前台开发三、分析代码四、bug一、生成微信登录二维码 1、准备工作 1、注册 2、邮箱激活 3、完善开发者资料 4、…

JSP中http与内置对象学习笔记

本博文讲述jsp客户端与服务器端的http、jsp内置对象与控制流和数据流实现 1.HTTP请求响应机制 HTTP协议是TCP/IP协议中的一个应用层协议&#xff0c;用于定义客户端与服务器之间交换数据的过程 1.1 HTTP请求 HTTP请求由请求行、消息报头、空行和请求数据4部分组成。 请求行…

ThreeJS 之界面控制

文章目录参考描述界面自适应问题resize 事件修改画布大小修改视锥体的宽高比全屏显示dblclick 事件检测全屏显示状态进入全屏显示状态退出全屏显示状态尾声参考 项目描述ThreeJS官方文档哔哩哔哩老陈打码搜索引擎BingMDN 文档document.mozFullScreenElementMDN 文档Element.re…

LeetCode题目笔记——6359. 替换一个数字后的最大差值

文章目录题目描述题目链接题目难度——简单方法一&#xff1a;替换代码/Python代码优化总结题目描述 给你一个整数 num 。你知道 Danny Mittal 会偷偷将 0 到 9 中的一个数字 替换 成另一个数字。 请你返回将 num 中 恰好一个 数字进行替换后&#xff0c;得到的最大值和最小值…

CTK学习:(一)编译CTK

CTK插件框架简介 CTK Plugin Framework是用于C++的动态组件系统,以OSGi规范为模型。在此框架下,应用程序由不同的组件组成,遵循面向服务的方法。 ctk是一个开源项目,Github 地址:https://github.com/commontk。 源码地址commontk/CTK: A set of common support code for…

信小程序点击按钮绘制定制转发分享图

1. 说明 先上代码片断分享链接&#xff1a; https://developers.weixin.qq.com/s/vl3ws9mA72GG 使用 painter 画图 按钮传递定制化信息 效果如下&#xff1a; 2. 关键代码说明 文件列表如下&#xff1a; {"usingComponents": {"painter": "/com…

基于springboot的停车场管理系统(程序+文档)

大家好✌&#xff01;我是CZ淡陌。将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。 &#x1f345;更多优质项目&#x1f447;&#x1f…

Android实例仿真之二

目录 三 从无入手 第一阶段 第二阶段 第三阶段 第四阶段 第五阶段 第六阶段 第七阶段 八 举两个典型例子&#xff1a; 九 逆向工程 三 从无入手 这节标题叫从无入手&#xff0c;什么意思呢&#xff1f;如果没有Android这个实例存在&#xff0c;你要做一个类似Android…