对个人博客系统进行web自动化测试(包含测试代码和测试的详细过程)(下)

简介: 对个人博客系统进行web自动化测试(包含测试代码和测试的详细过程)(下)

四、博客列表页测试

a0c859d458d545eda2e493e41b247836.png

首先对于博客列表页面来说,分为登录情况下的测试和未登录情况下的测试

登录情况下的测试

package webAutoTest.logined_tests;
import org.junit.jupiter.api.*;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;
import webAutoTest.common.AutotestUtils;
/**
 * 用户登录状态下的博客列表测试
 */
@TestMethodOrder(MethodOrderer.OrderAnnotation.class) // 说明当前类中的测试方法要按一定的顺序来执行---和order配合使用
public class blogListTest extends AutotestUtils {
    private static ChromeDriver driver = new ChromeDriver();
    @Test
    @BeforeAll
    static void init() {
        driver.get("http://49.235.66.46:9000/blog_list.html");
    }
    /**
     * 测试总的博客列表页面的完整性
     */
    @Test
    @Order(1)
    void pageTest() { // 不能用private修饰该方法——》我们的selenium还要调用该方法
        // 看看是否能够获取到博客列表页面的翻页按钮(只有总的博客列表页有,个人主页也没有)
        driver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(1)"));
        // 查看页面的文本内容显示是否正确
        String expect = "Linux删除文件操作";
        String actual = driver.findElement(By.cssSelector("body > div.container > div > div:nth-child(2) > div.title")).getText();
        Assertions.assertEquals(expect, actual); // 断言
        // 查看是否有个人主页的超链接
        driver.findElement(By.cssSelector("#myblog")).click();
        String  expectURL = "http://49.235.66.46:9000/myblog_list.html";
        String actualURL = driver.getCurrentUrl();
        // 利用断言看:在登录成功的情况下,界面是否跳转到了个人主页
        Assertions.assertEquals(expectURL, actualURL);
    }
    @Test
    @AfterAll
    static void exit() {
        driver.quit();
    }
}

未登录情况下的测试

package webAutoTest.unlogined_tests;
import org.junit.jupiter.api.*;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;
import webAutoTest.common.AutotestUtils;
/**
 * 用户未登录状态下的博客列表测试
 */
@TestMethodOrder(MethodOrderer.OrderAnnotation.class) // 说明当前类中的测试方法要按一定的顺序来执行---和order配合使用
public class blogListTest extends AutotestUtils {
    private static ChromeDriver driver = new ChromeDriver();
    @Test
    @BeforeAll
    static void init() {
        driver.get("http://49.235.66.46:9000/blog_list.html");
    }
    /**
     * 测试总的博客列表页面的完整性
     */
    @Test
    @Order(1)
    void pageTest() throws InterruptedException { // 不能用private修饰该方法——》我们的selenium还要调用该方法
        // 看看是否能够获取到博客列表页面的翻页按钮(只有总的博客列表页有,个人主页也没有)
        driver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(1)"));
        // 查看页面的文本内容显示是否正确
        String expect = "Linux删除文件操作";
        String actual = driver.findElement(By.cssSelector("body > div.container > div > div:nth-child(2) > div.title")).getText();
        Assertions.assertEquals(expect, actual); // 断言
        // 查看是否有个人主页的超链接
        driver.findElement(By.cssSelector("#myblog")).click();
        Thread.sleep(100); // 强制等待弹窗的出现(隐式等待无法处理弹窗/显示等待和隐式等待尽量不共存)
        // 在未登录的情况下,页面跳转到个人主页是否会出现弹窗(以及弹窗内容是否和我们预期的一致)
        Alert alert = driver.switchTo().alert();
        String expectAlert = "当前用户未登录,你即将跳转到登录页面";
        String actualAlert = alert.getText();
        Assertions.assertEquals(expectAlert, actualAlert);
        // 不要忘了关闭弹窗
        alert.accept();
    }
    @Test
    @AfterAll
    static void exit() {
        driver.quit();
    }
}

一些问题,在实际测试的时候,我发现当用private修饰测试方法时


0efac3480ac04d268f515299227bb072.png

这是因为private修改的方法只在当前类中可见,外部类不可见。

但是我们是借助selenium来进行自动化测试,那么这样一来,selenium就调用不了这个测试方法了————》当然也就执行不了测试用例了。


五、博客详情页测试



b22a72ad4951449da3beee33f983246c.png


用户已登录的情况下测试

package webAutoTest.logined_tests;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import webAutoTest.common.AutotestUtils;
/**
 * 用户已经登录的状态下,对博客详情页进行测试
 */
public class blogDetailTest extends AutotestUtils {
    // 这里我们不重新生成驱动,我们用的还是登录界面的驱动,因为我们要保留登录状态
    @Test
    @BeforeAll
    static void init() {
        driver.get("http://49.235.66.46:9000/blog_content.html?id=2");
    }
    @Test
    void pageTest() {
        // 测试左侧信息框中的用户名是否能正常显示
        driver.findElement(By.cssSelector("body > div.container > div.container-left > div > h3"));
        // 测试删除博客按钮是否存在(文本显示是否正确)
        String expect1 = "删除博客";
        String actual1 = driver.findElement(By.cssSelector("body > div.nav > a.del")).getText();
        Assertions.assertEquals(expect1, actual1);
        // 测试修改博客按钮是否存在(文本显示是否正确)
        String expect2 = "修改博客";
        String actual2 = driver.findElement(By.cssSelector("body > div.nav > a.update")).getText();
        Assertions.assertEquals(expect2, actual2);
    }
    @Test
    @AfterAll
    static void exit() {
        driver.quit();
    }
}


测试视频

我们通过测试套件可以同时执行多个类的测试用例

image.png

image.gif

用户未登录的情况下测试

package webAutoTest.unlogined_tests;
import org.checkerframework.checker.units.qual.A;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;
/**
 * 用户登录的状态下,对博客详情页进行测试
 */
public class blogDetailTest {
    static ChromeDriver driver = new ChromeDriver();
    @Test
    @BeforeAll
    static void init() {
        driver.get("http://49.235.66.46:9000/blog_content.html?id=2");
    }
    @Test
    void pageTest() throws InterruptedException {
        // 未登录状态下,可以访问博客详情页,但不可以进行删除博客、修改博客的操作
        driver.findElement(By.cssSelector("body > div.nav > a.update")).click();
        // 点击删除博客,应该会出现-----是否要删除该博客的弹窗,点击确定
        Thread.sleep(300);
        Alert alert1 = driver.switchTo().alert(); // 点击完——确定要删除该博客——》在未登录状态,会出现下一个弹窗
        String expect = "当前用户未登录,你即将跳转到登录页面";
        String actual = alert1.getText();
        alert1.accept();
        Assertions.assertEquals(expect,actual);
    }
    @Test
    @AfterAll
    static void quit() {
        driver.quit();
    }
}


image.png

六、个人主页测试

1f042ca073674f7991471636117928ca.png

package webAutoTest.logined_tests;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import webAutoTest.common.AutotestUtils;
public class myBlogListTest extends AutotestUtils {
    @Test
    @BeforeAll
    static void init() {
        driver.get("http://49.235.66.46:9000/myblog_list.html?uid=2");
    }
    @Test
    void pageTest() {
        // 测试是否存在博客列表页的超链接(以及该超链接所显示的文本是否正确,只有在个人主页该超链接的文本才是“首页”这两个字)
        String expect = "首页";
        String actual = driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")).getText();
        Assertions.assertEquals(expect, actual);
        // 是否能找到个人信息栏
        driver.findElement(By.cssSelector("body > div.container > div.container-left > div > h3"));
    }
    @Test
    @AfterAll
    static void exit() {
        driver.quit();
    }
}

image.png


七、博客编辑页面测试

d42d1aea0ac74d7193e2d88f9b772652.png

package webAutoTest.logined_tests;
import org.checkerframework.checker.units.qual.A;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import webAutoTest.common.AutotestUtils;
import javax.swing.tree.TreeNode;
/**
 * 用户已经登录的情况下,对博客编辑页进行测试
 */
public class blogEditTest extends AutotestUtils {
    // 这里我们不重新生成驱动,我们用的还是登录界面的驱动,因为我们要保留登录状态
    @Test
    @BeforeAll
    static void init() {
        driver.get("http://49.235.66.46:9000/blog_edit.html");
    }
    @Test
    void pageTest() throws InterruptedException {
        // 测试是否能够找到博客编辑页的提示按钮
        driver.findElement(By.cssSelector("#submit"));
        // 测试是否能够找到对应页面的超链接
        driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)"));
        // 在博客标题中输入内容
        driver.findElement(By.cssSelector("#title")).sendKeys("测试开发实战");
        // 在博客内容中输入内容,因为我们这里使用了第三方的插件,所以我们不能直接通过sendkeys来输入内容(但我们可以通过click点击事件,往模块内容中插入横线等(本身插件提供的元素)
        driver.findElement(By.cssSelector("#editorDiv > div.editormd-toolbar > div > ul > li:nth-child(21) > a > i")).click();
        Thread.sleep(100);
        driver.findElement(By.cssSelector("#submit")).click(); // 点击提交
        // 如果发布成功,会出现一个弹窗——》提示发布成功
        Thread.sleep(100); // 等待弹窗出现
        Alert alert = driver.switchTo().alert();
        alert.accept();
        // 页面会跳到我们的总的博客列表页面,在博客列表页的最后一个元素看是否能够找到我们刚刚提交的数据
        // 1、到博客列表的末页
        driver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(4)")).click();
        Thread.sleep(100);
        String expect = "测试开发实战";
        String actual = driver.findElement(By.xpath("/html/body/div[2]/div/div[last()]/div[1]")).getText(); // 获取该页中最后一个title标签,通过last()
        Assertions.assertEquals(expect, actual);
    }
    @Test
    @AfterAll
    static void exit() {
        driver.quit();
    }
}


其中在检测新增的博客是否添加成功的时候,因为新添加的博客自动就添加到了总的博客列表的末尾,因此:

1、通过博客列表的末页标签,跳转到博客列表的最后一页。

2、通过xpath的

/html/body/div[2]/div/div[last()]/div[1]


定位到当前页面的最后一个title标签,其中last()保障了当前界面有几个博客标题,我们获取到的都是最后一个标题(最新的那个,也就是刚刚我们发表的那个)

3、找到对应博客的标题元素后,看文本内容是否和我们编辑时候输入的文章标题一致


八、博客修改页面测试

15f724ea8987470aaa0fe14102d89a0a.png

package webAutoTest.logined_tests;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import webAutoTest.common.AutotestUtils;
/**
 * 用户登录状态下对博客修改页面进行测试
 */
public class blogUpdateTest extends AutotestUtils {
    @Test
    @BeforeAll
    static void init() {
        driver.get("http://49.235.66.46:9000/blog_content.html?id=17");
    }
    @Test
    void pageTest() {
        // 查看博客标题是否存在
        driver.findElement(By.cssSelector("body > div.container > div.container-right > div > h3"));
        // 查看修改博客和删除博客按钮是否存在
        driver.findElement(By.cssSelector("body > div.nav > a.del"));
        driver.findElement(By.cssSelector("body > div.nav > a.update"));
    }
    @Test
    @AfterAll
    static void exit() {
        driver.quit();
    }
}


image.png

九、总结


image.png

总测试视频



image.png

总代码

gitee:  博客系统的web自动化测试——完整代码

相关文章
|
11月前
|
前端开发 测试技术 API
测试金字塔:别再只盯着UI自动化了
测试金字塔:别再只盯着UI自动化了
833 116
|
11月前
|
敏捷开发 测试技术 API
测试金字塔:构建高效自动化测试策略的基石
测试金字塔:构建高效自动化测试策略的基石
751 116
|
11月前
|
设计模式 前端开发 测试技术
告别脆弱:构建稳定UI自动化测试的3个核心策略
告别脆弱:构建稳定UI自动化测试的3个核心策略
933 113
|
11月前
|
人工智能 自然语言处理 测试技术
从人工到AI驱动:天猫测试全流程自动化变革实践
天猫技术质量团队探索AI在测试全流程的落地应用,覆盖需求解析、用例生成、数据构造、执行验证等核心环节。通过AI+自然语言驱动,实现测试自动化、可溯化与可管理化,在用例生成、数据构造和执行校验中显著提效,推动测试体系从人工迈向AI全流程自动化,提升效率40%以上,用例覆盖超70%,并构建行业级知识资产沉淀平台。
从人工到AI驱动:天猫测试全流程自动化变革实践
|
11月前
|
人工智能 自然语言处理 JavaScript
利用MCP Server革新软件测试:更智能、更高效的自动化
MCP Server革新软件测试:通过标准化协议让AI实时感知页面结构,实现自然语言驱动、自适应维护的自动化测试,大幅提升效率,降低脚本开发与维护成本,推动测试左移与持续测试落地。
|
12月前
|
存储 关系型数据库 测试技术
玩转n8n测试自动化:核心节点详解与测试实战指南
n8n中节点是自动化测试的核心,涵盖触发器、数据操作、逻辑控制和工具节点。通过组合节点,测试工程师可构建高效、智能的测试流程,提升测试自动化能力。
|
11月前
|
测试技术 API 数据库
测试金字塔:构建高效自动化测试策略的基石
测试金字塔:构建高效自动化测试策略的基石
755 114
|
存储 人工智能 算法
AI测试平台实战:深入解析自动化评分和多模型对比评测
在AI技术迅猛发展的今天,测试工程师面临着如何高效评估大模型性能的全新挑战。本文将深入探讨AI测试平台中自动化评分与多模型对比评测的关键技术与实践方法,为测试工程师提供可落地的解决方案。
|
12月前
|
机器学习/深度学习 人工智能 测试技术
EdgeMark:嵌入式人工智能工具的自动化与基准测试系统——论文阅读
EdgeMark是一个面向嵌入式AI的自动化部署与基准测试系统,支持TensorFlow Lite Micro、Edge Impulse等主流工具,通过模块化架构实现模型生成、优化、转换与部署全流程自动化,并提供跨平台性能对比,助力开发者在资源受限设备上高效选择与部署AI模型。
910 9
EdgeMark:嵌入式人工智能工具的自动化与基准测试系统——论文阅读