目录
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应用的比较固定,自动化测试代码比较繁杂低效。