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

目录

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();//打开urlpublic 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.检查当前urlString 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);//顶部logoWebElement 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应用的比较固定,自动化测试代码比较繁杂低效

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

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

相关文章

车载测试系列:车载常见面试题

自我介绍项目介绍项目具体是怎么测试的&#xff1f;CANoe是怎么使用的&#xff1f;台架是怎么搭建的&#xff1f;台架怎么测试的&#xff1f;诊断服务是怎么测试的&#xff1f;功能寻址和物理寻找的区别10服务有什么会话&#xff1f;11服务怎么确定软件复位和硬件复位是什么&am…

Gauge32类型的数据转换成int类型的数据

提前编译号snmp的库 #include <iostream> #include <libsnmp.h>#include "snmp_pp/snmp_pp.h"#ifdef WIN32 #define strcasecmp _stricmp #endif#ifdef SNMP_PP_NAMESPACE using namespace Snmp_pp; #endifusing namespace std; using namespace Snmp_pp…

JAVA抽象类,接口与内部类,常用API知识总结

文章目录 抽象类和抽象方法抽象类的定义格式抽象方法的定义格式注意事项 接口定义和使用成员特点和类之间的关系新增JDK8新增方法JDK9新增方法 总结设计模式 内部类使用场景分类成员内部类获取内部类对象访问成员变量 静态内部类局部内部类匿名内部类格式使用场景 示例 常用API…

JVM内存信息分析

jmap安装使用 java - version 查看已安装jdk的版本 sudo apt-get install openjdk-11-jdk-headless 安装jmap jmap -version 验证是否安装成功 jmap -dump:live,formatb,filexxxx.hprof pid 导出jvm内存信息&#xff0c;pid一般为java进程id内存信息分析 strings xxx.phrof |…

459.重复的子字符串

给定一个非空的字符串&#xff0c;判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母&#xff0c;并且长度不超过10000。 示例 1: 输入: "abab"输出: True解释: 可由子字符串 "ab" 重复两次构成。 示例 2: 输入: "aba&q…

chap5 I/O管理

目录 一、I/O设备基本概念和分类 304 1.concept 2.classification &#xff08;1&#xff09;根据信息交换单位&#xff08;可能考&#xff09; 1)字符设备 2)块设备 &#xff08;2&#xff09;传输速率&#xff08;以下了解即可&#xff09; &#xff08;3&#xff09;…

R语言数据分析案例-股票可视化分析

一、数据整合的对象 # Loading necessary libraries library(readxl) library(dplyr)# Reading the data from Excel files data_1 <- read_excel("云南白药.xlsx") data_2 <- read_excel("冰山.xlsx")二、数据整合的代码 # Reading the data from…

OBS插件--音频采集

音频采集 音频采集是一款 源 插件,类似于OBS的win-capture/game-capture&#xff0c;允许从特定应用程序捕获音频&#xff0c;而不是捕获整个系统的音频。避免了因为特定音频的采集而需要引入第三方软件&#xff0c;而且时延也非常低。 下面截图演示下操作步骤&#xff1a; 首…

【顺序程序设计-谭浩强适配】(适合专升本、考研)

无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 完整资料如下&#xff1a;纯干货、纯干货、纯干货&#xff01;&#xff01;…

WEB后端复习——监听器、过滤器

Listener监听器 是Servlet规范中定义的一种特殊类&#xff0c;它用于监听web应用程序中的ServletContext, HttpSession和ServletRequest等域对象的创建与销毁事件&#xff0c;以及监听这些域对象中的属性发生修改的事件。 注解WebListener 1.ServletContextListener 监听Serv…

U盘文件遇损?拯救“文件或目录损坏且无法读取”的秘籍!

在数字化时代&#xff0c;U盘已成为我们日常生活与工作中不可或缺的数据存储和传输工具。然而&#xff0c;有时我们可能会遇到一个非常令人沮丧的问题——U盘中的文件或目录突然损坏且无法读取。这种突发状况往往让人措手不及&#xff0c;甚至可能引发数据丢失的严重后果。那么…

打印图案(金字塔)头歌作业

题目: 任务描述 本关任务&#xff1a;编写一个程序&#xff0c;输出堆叠式的金字塔图案。 输入n个字符&#xff0c;按以下原则输出&#xff1a;【参考样例】 1)第1个字符为一层金字塔图案&#xff0c;第2个字符为两层金字塔图案&#xff0c;第3个字符为三层金字塔图案&#x…

相同的树——java

给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出&#xff1a;true示例 2&…

[华为OD] B卷 树状结构查询 200

题目&#xff1a; 通常使用多行的节点、父节点表示一棵树&#xff0c;比如 西安 陕西 陕西 中国 江西 中国 中国 亚洲 泰国 亚洲 输入一个节点之后&#xff0c;请打印出来树中他的所有下层节点 输入描述 第一行输入行数&#xff0c;下面是多行数据&#xff0c;每行以空…

C++青少年简明教程:基础知识

C青少年简明教程&#xff1a;基础知识 电脑程序设计&#xff08;Computer programming&#xff09;&#xff0c;或称程序设计&#xff08;programming&#xff09;&#xff0c;是给出解决特定问题程序的过程&#xff0c;程序设计往往以某种程序设计语言为工具&#xff0c;给出这…

关于一致性,你该知道的事儿(上)

关于一致性&#xff0c;你该知道的事儿&#xff08;上&#xff09; 前言一、缓存一致性二、内存模型一致性三、事务一致性四、分布式事务一致性4.1 分布式系统的一些挑战4.2 关于副本的一些概念4.3 分布式事务之共识问题4. 3.1 PC(two-phase commit, 2PC)4.3.2 Raft 三、后记参…

公有云Linux模拟TCP三次挥手与四次握手(Wireshark抓包验证版)

目录 写在前面环境准备实验步骤1. 安装nc工具2. 使用nc打开一个连接2.1 公有云-安全组放行对应端口&#xff08;可选&#xff09; 3. 打开Wireshark抓包工具4. 新开终端&#xff0c;进行连接5. 查看抓包文件&#xff0c;验证TCP三次握手与四次挥手TCP三次握手数据传输TCP四次挥…

Netty源码分析二NioEventLoop 剖析

剖析方向 NioEventLoop是一个重量级的类&#xff0c;其中涉及到的方法都有很复杂的继承关系&#xff0c;调用链&#xff0c;要想把源码全部过一遍工作量实在是太大了&#xff0c;于是小编就基于下面的这些常见的问题来对NioEventLoop的源码来进行剖析 1.Seletor何时创建 1.1Se…

【408真题】2009-08

“接”是针对题目进行必要的分析&#xff0c;比较简略&#xff1b; “化”是对题目中所涉及到的知识点进行详细解释&#xff1b; “发”是对此题型的解题套路总结&#xff0c;并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材&#xff08;2025版&…

TMS320F280049 CLB模块--LUT4 OUTLUT(4)

LUT4 示意图如下&#xff1a; OUTLUT 示意图如下&#xff1a; 寄存器 参考文档&#xff1a; TMS320F28004x Real-Time Microcontrollers Technical Reference Manual (Rev. G)