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

目录

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,一经查实,立即删除!

相关文章

恒定导通时间控制COT

核心是让反馈脚上的文波电压与电感电流文波同相位

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

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

Redis缓存的基本概念和使用

Redis缓存的基本概念和使用 什么是缓存Redis缓存缓存更新策略缓存穿透缓存雪崩缓存击穿缓存工具类封装 什么是缓存 缓存时数据交换的缓冲区&#xff0c;存储数据的临时区&#xff0c;读写性能较好。 例如计算机的三级缓存。CPU的计算速度超过内存的读写速度&#xff0c;为了平…

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…

java选择题

题目来牛客网 1.类中的数据域使用private修饰为私有变量&#xff0c;所以任何方法均不能访问它。 A.正确 B.错误 答案&#xff1a;B&#xff0c;本类可以使用&#xff0c;反射也可以。 2.在类Tester中定义方法如下 public double max(int x, int y){//省略 } 则在该类中定义…

数据集个人记录

Dataset 垂域数据集 240万条中文医疗数据集(包括预训练、指令微调和奖励数据集)&#xff1a;shibing624/medical 22万条中文医疗对话数据集(华佗项目)&#xff1a;shibing624/huatuo_medical_qa_sharegpt 通用数据集 Pretraining datasets 16GB中英文无监督、平行语料Lin…

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…

MySQL优化-04慢查询和执行计划

慢查询 慢查询配置 MySQL记录所有执行超过long_query_time参数设定实际阈值的SQL语句日志 常用命令 SHOW VARIABLES like slow_query_log;--是否开启慢日志 SHOW VARIABLES like long_query_time;--时间阈值设置 SHOW VARIABLES like %log_queries_not_user_indexes%;--没有使…

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; 首…

Oracle数据库之基本查询详解(三)

目录 sql简介 DML&#xff08;数据库操作语言&#xff09; DDL&#xff08;数据库定义语言&#xff09; DCL&#xff08;数据库控制语言&#xff09; Select语句的语法格式 通过列名查询 1. 通过列名查询所在的表 2. 通过列名查询列的数据 4. 使用PL/SQL块查询 别名的…

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

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

springboot 设置response和request的默认格式 驼峰或者SNAKE_CASE

springboot 设置response和request的默认格式 驼峰或者SNAKE_CASE。 我们使用默认配置的情况下&#xff0c;response和request是由jackson jason序列化和解析的&#xff0c;因此&#xff0c;我们只需要配置好jackson json的默认格式就可以。 要设置 jackson json默认的更多格式…

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&…