“知识世界”项目的自动化测试

目录

1.项目介绍

1.1 项目功能介绍

 2. 项目测试

2.1 需求分析

2.2 测试计划

2.3 设计测试用例

(1) 设计 登录 的测试用例

(2)设计 文章列表页 的测试用例

(3)设计 详情页 的测试用例 

(4)设计 文章编辑页 的测试用例

 (5)设计 删除 的测试用例

​编辑 (6)设计 主页按钮 的测试用例

(7) 设计 写文章  的测试用例

(8)设计 注销 的测试用例

2.4. 执行测试用例,编写自动化测试代码

2.4.1 执行 登录 测试用例

3.测试总结



1.项目介绍

"知识世界" 是一个 基于Spring,Spring MVC,MyBatis的项目。

1.1 项目功能介绍

(1)登录功能

 用户名或密码错误,出现弹框:

 

登录成功之后,来到文章列表页

(2)显示用户的文章列表

(3)在文章列表页可以 点击 查看全文,进入文章详情页

 (5)在文章详情页,可以点击编辑,更新文章内容。

 (5)在文章详情页,也可以点击删除,删除文章。 

确认删除后,页面跳转到 文章列表页。

(6)右上角,点击写文章,可以新增文章。

(7)右上角,点击 "主页",页面跳转到 文章列表页。 

(8)右上角,点击"注销",回到登录页面。


 2. 项目测试

一个项目的测试生命周期有以下过程:

需求分析-->测试计划-->设计测试用例-->执行测试用例-->产出测试报告

2.1 需求分析

需求分析 是非常重要的一步,这关系到接下来设计的测试用例是否能够对项目进行全方位测试,从而尽可能减少项目BUG。

对项目的功能进行深入分析,测试用例应覆盖 登录,文章列表页,文章详情页,新增文章,删除文章,编辑文章内容,注销(退出登录),回到文章列表 八个功能,应测试 每个功能的实现效果是否与软件规格说明书一致。

2.2 测试计划

测试计划 一般要安排好 测试人员,测试周期。由于该项目比较简单,就由我自己一个人测试,测试周期为一天。

2.3 设计测试用例

测试用例的设计方法可以有 基于需求编写测试用例,等价类法,边界值法,判定表法,正交表法,场景法,错误猜测法。不同的测试场景,可以采用合适的测试用例编写方法。

(1) 设计 登录 的测试用例

"登录" 的测试对象 主要是 输入框中的用户名和密码是否输入正确,以及登录页面是否正常。

该场景下,可以 基于需求来 编写测试用例。

基于需求编写测试用例,可以从 界面,功能,易用性,兼容性,安全性,性能,安装卸载,网络 等方面来考虑。

充分理解该项目需求后,设计"登录"的测试用例,主要考虑 界面,功能,易用性 ,兼容性四个方面。

【界面】

<1> 在登录页面,检查当前页面的url是否正确,输入框元素 及 登录按钮是否存在,以及页面顶部的logo信息。

<2> 用户名和密码输入正确时,页面跳转到博客列表页,检查url。

<3> 用户名或密码错误时,页面不跳转。

【功能】

登录的功能就是 输入了正确的用户名和密码,可以进入系统。

由于该项目暂时没有注册功能,登录功能只有输入正确的用户名和密码才能登录成功,因此这里就不用为该项目的"登录"的 功能方面 设计测试用例了。

这里就演示一下 "注册功能" 的测试用例编写方式,可以采用等价类来编写测试用例。

<用户名和密码 >基于等价类设计测试用例:

边界值法则又是对 等价类编写测试用例 的补充,主要用于测试输入长度:

【易用性】

登录功能的易用性测试,可以考虑登录界面的 易操作性,易理解性,易学习性

易操作性:用户在使用该功能时,能否快速完成操作。

易理解性:用户访问登录页面时,能否快速理解如何去操作。

易学习性:当用户第一次访问登录页面是,能够快速学会如何操作。

易用性的测试,可以邀请真实的用户去参与测试。

(2)设计 文章列表页 的测试用例

测试 当前页面的url是否正确

测试 页面元素是否完整,页面元素大小是否美观,页面是否符合软件规格说明书。

点击"查看全文",页面跳转到 文章详情页,检查页面是否跳转成功。

(3)设计 详情页 的测试用例 

在"文章列表页" 点击"查看全文",页面跳转到 文章详情页,检查当前url是否正确。

测试 页面元素是否完整,页面元素大小是否美观,页面是否符合软件规格说明书。

点击"编辑",页面跳转到 "文章详情页",检查页面是否跳转成功。

(4)设计 文章编辑页 的测试用例

在"文章详情页"点击"编辑",页面跳转到"文章编辑页",检查当前url是否正确。

测试 页面元素 是否完整,页面元素大小是否美观,页面是否符合软件规格说明书。

点击更新文章,页面出现弹框"更新成功",点击确定,页面跳转到 "文章列表页",检查页面是否跳转成功。

 (5)设计 删除 的测试用例

在"文章详情页"点击"删除",页面出现弹框,点击"确定",该文章删除成功,页面跳转到"文章列表页",检查页面是否跳转成功。

 (6)设计 主页按钮 的测试用例

点击页面右上角"主页"按钮,页面跳转到 "文章列表页",检查url是否跳转成功。

测试 跳转后页面 是否正常。

(7) 设计 写文章  的测试用例

点击页面右上角 "写文章" 按钮,页面跳转到 "文章编辑页",检查url是否跳转成功。

跳转成功后,测试 页面元素 是否完整,页面元素大小是否美观,页面是否符合软件规格说明书。 

点击发布文章,检查标题或内容是否为空。

若为空,出现弹框;

不为空,文章发布成功,页面跳转到 文章列表页,检查跳转后的url。

 

(8)设计 注销 的测试用例

点击页面右上角 "注销",页面跳转到 "登录"页面,用户退出登录,测试当前的url是否跳转成功。

检查跳转后的页面是否正常


2.4. 执行测试用例,编写自动化测试代码

测试环境:Win11系统

测试数据:各功能的测试用例

浏览器驱动:Chrom Driver

测试工具:selenium自动化测试,Junit测试框架

2.4.1 执行 登录 测试用例

这是我个人写的初步测试代码,代码结构还有待完善。

代码中,对一些常量进行了封装,比如 页面的url,打开页面等常量进行封装。

部分代码封装:

/**
 * 项目中 会涉及到的 url,登录信息 等常量
 */
public class Constant {

    //登录页面
    public static final String LOGIN_URL = "http://127.0.0.1:8080/blog_login.html";

    //文章列表 页面
    public static final String LIST_URL = "http://127.0.0.1:8080/blog_list.html";

    //文章详情 页面
    public static final String DETAIL_URL = "http://127.0.0.1:8080/blog_detail.html";

    //添加文章 页面
    public static final String ADD_URL = "http://127.0.0.1:8080/blog_edit.html";

    //更新文章 页面
    public static final String UPDATE_URL = "http://127.0.0.1:8080/blog_update.html";

    //正确的用户名
    public static final String RIGHT_USER_NAME = "劲统";

    //正确密码
    public static final String RIGHT_PASSWORD = "777888";

    //错误的用户名和密码
    public static final String ERROR_USER_NAME = "小伙子";
    public static final String ERROR_PASSWORD = "666";
}
/**
 *测试时 涉及到的 webDriver操作 封装
 */

public class WebDriverUtils {

    public static WebDriver webDriver = new ChromeDriver();

    
    //打开url
    public static void goUrl(String url) {
        webDriver.get(url);
    }

    //添加隐式等待
    public static void AddWait(){
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
    }
}

 执行 登录 测试用例代码:

public class TestLogin {
    public static void main(String[] args) throws InterruptedException {

        /**
         * 界面测试
         */

        //等待页面渲染
        WebDriverUtils.goUrl(Constant.LOGIN_URL);
        WebDriverUtils.AddWait();
        //1.检查当前url
        String curUrl = WebDriverUtils.webDriver.getCurrentUrl();
        //应该跳转到的页面
        String ShouldUrl = Constant.LOGIN_URL;
        Assertions.assertEquals(ShouldUrl,curUrl,"打开的url不正确");


        //2.检查页面元素是否完整
        //顶部页框
        WebElement UpBox = WebDriverUtils.webDriver.findElement(By.cssSelector("body > div.nav"));
        Assertions.assertNotNull(UpBox);
        //顶部logo
        WebElement logo = WebDriverUtils.webDriver.findElement(By.cssSelector("body > div.nav > img"));
        Assertions.assertNotNull(logo,"顶部logo存在异常");
        //顶部文字
        WebElement UpStr = WebDriverUtils.webDriver.findElement(By.cssSelector("body > div.nav > span"));
        Assertions.assertNotNull(UpStr,"顶部文字存在异常");
        //登录外框
        WebElement loginBox = WebDriverUtils.webDriver.findElement(By.cssSelector("body > div.container-login > div"));
        Assertions.assertNotNull(loginBox,"登录外框存在异常");
        //登录框中 顶部文字描述
        WebElement loginStr = WebDriverUtils.webDriver.findElement(By.cssSelector("body > div.container-login > div > h3"));
        Assertions.assertNotNull(loginStr,"登录框顶部文字存在异常");
        //用户名元素
        WebElement UserStr = WebDriverUtils.webDriver.findElement(By.cssSelector("body > div.container-login > div > div:nth-child(2) > span"));
        Assertions.assertNotNull(UserStr,"用户名文字存在异常");
        //用户名输入框
        WebElement UserInput = WebDriverUtils.webDriver.findElement(By.cssSelector("#username"));
        Assertions.assertNotNull(UserInput,"用户名输入框存在异常");
        //密码元素
        WebElement passStr = WebDriverUtils.webDriver.findElement(By.cssSelector("body > div.container-login > div > div:nth-child(3) > span"));
        Assertions.assertNotNull(passStr,"密码文字存在异常");
        //密码输入框
        WebElement passInput = WebDriverUtils.webDriver.findElement(By.cssSelector("#password"));
        Assertions.assertNotNull(passInput,"密码输入框存在异常");
        //提交按钮
        WebElement commit = WebDriverUtils.webDriver.findElement(By.cssSelector("#submit"));
        Assertions.assertNotNull(commit,"提交按钮存在异常");

        System.out.println("登录界面-->测试通过!");
        /**
         * 功能测试
         */
        //3.输入错误的用户名和密码
        WebDriverUtils.webDriver.findElement(By.cssSelector("#username")).sendKeys(Constant.ERROR_USER_NAME);
        WebDriverUtils.webDriver.findElement(By.cssSelector("#password")).sendKeys(Constant.ERROR_PASSWORD);
        WebDriverUtils.webDriver.findElement(By.cssSelector("#submit")).click();
        //**要等待页面渲染
        WebDriverUtils.AddWait();

        WebDriverUtils.webDriver.switchTo().alert().accept();

        //页面不跳转
        Assertions.assertEquals(curUrl,Constant.LOGIN_URL,"页面错误跳转");
        System.out.println("错误登录信息测试-->测试通过");
       WebDriverUtils.AddWait();

       //清空输入框,便于下一步测试
        WebDriverUtils.webDriver.findElement(By.cssSelector("#username")).clear();
        WebDriverUtils.webDriver.findElement(By.cssSelector("#password")).clear();

        //4.输入正确的用户名和密码
        WebDriverUtils.webDriver.findElement(By.cssSelector("#username")).sendKeys(Constant.RIGHT_USER_NAME);
        WebDriverUtils.webDriver.findElement(By.cssSelector("#password")).sendKeys(Constant.RIGHT_PASSWORD);
        WebDriverUtils.webDriver.findElement(By.cssSelector("#submit")).click();
        //等待页面渲染
        WebDriverUtils.AddWait();
        //应该跳转到的页面
        String exceptUrl = Constant.LIST_URL;

        WebDriverUtils.AddWait();
        //实际跳转的页面
        String actUrl = WebDriverUtils.webDriver.getCurrentUrl();
        Assertions.assertEquals(exceptUrl,actUrl,"url跳转失败");
        System.out.println("正确登录信息测试-->测试成功-->页面跳转成功!");
        System.out.println("[登录]功能-->测试通过");
        
        WebDriverUtils.webDriver.close();
    }
}

当测试 错误的登录信息 时,有两个要特别注意的问题

问题1:点击提交,登录界面会出现alert弹框,要在代码中对alert弹框进行处理,否则测试代码会出现报错,程序异常终止:

针对alert弹框 进行处理,程序正常运行 :

问题2:页面出现alert弹框后,要记得添加等待,等待弹窗渲染出来之后,代码才能处理到弹框。否则,alert弹框还未渲染出来,就对alert处理,程序可能会出现异常。 

经过自动化测试后,测试结果如下:

测试结果说明 项目的"登录"功能测试通过了。

由于该项目要测试的有8个功能,代码较多,这里就不全部展示了。 重在熟悉Selenium自动化测试的常用api,以及Junit测试框架的常用注解,每个功能的测试方法和流程都是类似的。

3.测试总结

这个项目非常简单,功能也非常有限,最终测试的8个功能都通过了。

在测试的过程中,遇到的问题总结:

(1)当页面出现弹框时,要通过代码对弹框等信息进行处理,否则自动化测试程序会发生异常而终止。且在处理弹框前后,要等待页面渲染,防止程序运行的速度 大于 页面渲染的速度,导致程序挂掉。

(2)对于一些重复的操作,要进行封装,从而提高自动化测试代码的开发效率。

(3)在测试该项目时,用到的测试方式,测试思路比较单一,selenium的api应用的比较固定,自动化测试代码比较繁杂低效

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

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

相关文章

线下研讨会 技术沙龙|乐鑫芯片与 ESP RainMaker® 为科技初创企业赋能

众多科技初创企业在智能硬件市场迅猛发展的背景下&#xff0c;对不断变化的需求展现出了高度的敏锐性&#xff0c;期望能够快速将其转化为切实的产品方案。然而&#xff0c;面对复杂繁重的软硬件集成任务&#xff0c;这些企业往往容易陷入研发瓶颈、资金短缺以及效率低下等多重…

BGP综合大实验

实验要求 1.AS1中存在两个环回&#xff0c;一个地址是192.168.1.0/24&#xff0c;改地址不能在任何协议中宣告&#xff1b;AS3中存在两个环回&#xff0c;一个地址为192.168.2.0/24&#xff0c;该地址不能在任何协议中宣告&#xff0c;最终要求这两个环回可以ping通&#xff1b…

【超详细】跑通YOLOv8之深度学习环境配置1

环境配置1下载安装内容如下&#xff1a; Anaconda&#xff1a;https://www.anaconda.com/download/success VScode&#xff1a;https://code.visualstudio.com/Download Pycharm&#xff1a;https://www.jetbrains.com/pycharm/download/?sectionwindows Visual Studio2019&a…

Linunx应急响应

Linux应急流程 1,请提交攻击者的 IP 地址2,请提交攻击者使⽤的操作系统3,请提交攻击者进⼊⽹站后台的密码4,请提交攻击者⾸次攻击成功的时间&#xff0c;格式&#xff1a;DD/MM/YY:hh:mm:ss5,请提交攻击者上传的恶意⽂件名&#xff08;含路径&#xff09;6,请提交攻击者写⼊的恶…

Python vs MATLAB:选择深度学习的首选编程语言

Python vs MATLAB&#xff1a;选择深度学习的首选编程语言 在深度学习领域&#xff0c;编程语言的选择对于初学者的学习路径和未来的职业发展至关重要。目前&#xff0c;Python和MATLAB都是进行科学计算和数据分析的流行工具&#xff0c;但它们在深度学习社区中的应用和受欢迎…

天机学堂—学习辅助功能(含场景问答和作业)

我的课表 需求分析 原型图 管理后台 用户端 流程图 数据设计 接口设计 支付成功报名课程后, 加入到我的课表(MQ)分页查询我的课表查询我正在学习的课程根据id查询指定课程的学习状态删除课表中的某课程 代码实现 数据表设计 添加课程到课表&#xff08;非标准接口&#x…

猫头虎分享已解决Bug || **Babel转换器下载问题** Failed to resolve babel-loader dependency`

猫头虎分享已解决Bug &#x1f42f; || Babel转换器下载问题 &#x1f6ab;Failed to resolve babel-loader dependency 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a…

网络 | 应用层-websocket协议报文格式解析

websocket的官方文档为rfc(request for comments)&#xff0c;是网络协议的规范文档。它包含了许多计算机世界的核心知识 除了这里的websocket&#xff0c;它里边还包含我们熟知的http,tcp等协议的解析。 websocket协议对应的编号是rfc 6455 websocket协议格式解析 由图可知&a…

【RAG论文】RAG中半结构化数据的解析和向量化方法

论文简介 论文题目&#xff1a; 《A Method for Parsing and Vectorization of Semi-structured Data used in Retrieval Augmented Generation》 论文链接&#xff1a; https://arxiv.org/abs/2405.03989 代码: https://github.com/linancn/TianGong-AI-Unstructure/tree/m…

数据结构学习/复习13

一、选择排序 1.直接选择排序 2.堆排序 3.性能测试 二、交换排序 1.冒泡排序 2.快速排序 1.Hore版(递归) 2.随机选关键字Hore版(递归) 3.三数取中Hore版(递归) 3.挖坑法改进Hore版(递归) 4.前后指针法 5.小区间优化 5.性能测试 注意事项1&#xff1a;关键字选取时&#xff0c…

微服务架构与单体架构

微服务架构与与单体架构比较 微服务架构是一种将应用程序作为一组小的、独立服务的系统架构风格&#xff0c;每个服务运行在其自己的进程中&#xff0c;并通常围绕业务能力组织。这些服务通过定义良好且轻量级的机制&#xff08;通常是HTTP REST API&#xff09;进行通信。微服…

常用的简单友好的工单系统(免费)- WGCAT

最近在项目中&#xff0c;有工单系统的需求场景&#xff0c;所以想寻找一款轻量简单的运维工单软件&#xff0c;主要用来记录和处理工作中的一些故障、维护&#xff0c;主要用来记录设备的维护状态&#xff0c;包括服务器、主机、交换机那些 WGCAT&#xff0c;是一款简单轻量的…

上位机图像处理和嵌入式模块部署(树莓派4b的软件源)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 很多文章都建议替换一下树莓派4b的软件源&#xff0c;不过我自己实际使用下来&#xff0c;官方的软件下载速度其实还可以。这里下载的时候&#xf…

前端Vue架构

1 理解&#xff1a; 创建视图的函数&#xff08;render&#xff09;和数据之间的关联&#xff1b; 当数据发生变化的时候&#xff0c;希望render重新执行&#xff1b; 监听数据的读取和修改&#xff1b; defineProperty&#xff1a;监听范围比较窄&#xff0c;只能通过属性描…

QX---mini51单片机学习---(8)8*8点阵屏

目录 1LED点阵屏简绍 2 8*8点阵屏电路图74 3 74HC595芯片 4实践编程 1LED点阵屏简绍 2 8*8点阵屏电路图74 怎么点亮&#xff0c;正极给高负极给低 不能同时静态显示&#xff0c;跟数码管动态显示一样&#xff0c;反复横跳&#xff0c;利用视觉效果 3 74HC595芯片 …

kilimall非洲电商培训,基础版+进阶版+高阶版 从0-1个人可入驻的平台(12节)

亲爱的朋友们&#xff0c;你们知道吗&#xff1f;有一个神奇的电商平台——kilimall&#xff0c;它可以帮助你实现创业梦想&#xff0c;让你走上财富之路&#xff01; 首先&#xff0c;让我给大家介绍kilimall的基础版。基础版针对的是0经验的小白&#xff0c;提供了详细的教程…

有没有适合女生或者宝妈下班后可以做的副业?

宝妈与上班族女生的新篇章&#xff1a;水牛社副业兼职之旅 在繁忙的职场和温馨的家庭之间&#xff0c;不少女性渴望找到一种既能兼顾家庭又能实现自我价值的兼职方式。对于上班族女生和宝妈们来说&#xff0c;水牛社这样的线上任务平台为她们提供了一个全新的选择。 上班族女…

MFC的CPen与CBush画图对象使用步骤

在MFC中&#xff0c;CPen和CBrush是两个常用的绘图对象&#xff0c;分别用于定义画笔和画刷&#xff0c;可以用于绘制图形、填充区域等。下面我会详细介绍如何在MFC中使用CPen和CBrush来绘制和填充图形。 使用 CPen 绘制图形&#xff1a; 创建 CPen 对象&#xff1a; 首先&am…

2000-2022年各地级市知识产权审判结案数数据

2000-2022年各地级市知识产权审判结案数数据 1、时间&#xff1a;2000-2022年 2、指标&#xff1a;城市知识产权审判结案数 3、来源&#xff1a;整理自北大法宝 4、范围&#xff1a;287个地级市 5、用途&#xff1a;可用于衡量地级市知识产权保护水平 6、指标解释&#x…

第五步->手撕spring源码之资源加载器解析到注册

本步骤目标 在完成 Spring 的框架雏形后&#xff0c;现在我们可以通过单元测试进行手动操作 Bean 对象的定义、注册和属性填充&#xff0c;以及最终获取对象调用方法。但这里会有一个问题&#xff0c;就是如果实际使用这个 Spring 框架&#xff0c;是不太可能让用户通过手动方式…