文章目录
👑作者主页:Java冰激凌
概述:
本次测试旨在评估微聊的功能,包括用户界面、消息传递、安全性等方面。测试环境为Windows 10操作系统,使用Google Chrome浏览器进行测试。
测试方法:
本次测试采用黑盒测试方法,即不考虑系统内部的实现细节,只关注用户在使用过程中是否能够顺利完成任务。测试人员通过模拟真实用户的操作,对聊天室的各项功能进行了测试。
微聊测试用例
微聊测试用例已上传致Gitee平台 点击链接查看点击跳转
功能测试
自动化测试
注册页面
测试用例:
自动化测试代码:
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)//设置优先级需要的
public class RegisterTest {
private static WebDriver webDriver;
@BeforeAll
public static void Genter(){
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
webDriver = new ChromeDriver(options);
webDriver.get("http://192.144.216.100:1120/register.html");
}
/**
* 校验当前页面title是否正确
*/
@Test
@Order(1)
public void title() throws InterruptedException {
Assertions.assertEquals("注册",webDriver.getTitle());
}
/**
* 注册用户 注册成功后是否成功跳转到登录页面
* @throws InterruptedException
*/
@Test
@Order(2)
public void input() throws InterruptedException {
sleep(500);
WebElement username = webDriver.findElement(By.cssSelector("#username"));
WebElement password = webDriver.findElement(By.cssSelector("#password"));
username.sendKeys("小1");
password.sendKeys("123");
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(500);
Alert alert = webDriver.switchTo().alert();//确认弹窗
alert.accept();//点击确认按钮
Assertions.assertEquals("登录页面",webDriver.getTitle());
webDriver.close();
}
}
测试结果:在注册功能测试中响应较快 体验良好 暂未发现错误
登录页面
测试用例:
自动化测试代码:
/**
* @Author: 冰激凌
* @Date: 2023-07-13 21:13
**/
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)//设置优先级需要的
public class LoginTest {
private WebDriver webDriver;
@BeforeEach
public void Genter(){
webDriver = new ChromeDriver();
webDriver.get("http://192.144.216.100:1120/login.html");
}
@AfterEach
public void close(){
webDriver.quit();
}
/**
* 测试点击注册是否可以跳转到注册页面
*/
@Test
@Order(1)
public void reg() throws InterruptedException {
webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")).click();
//获取并切换到当前的窗口
webDriver.switchTo().window(webDriver.getWindowHandle());
sleep(500);
Assertions.assertEquals("注册",webDriver.getTitle());
}
/**
* 测试点击联系作者是否可以跳转到联系作者
*/
@Test
@Order(2)
public void connection() throws InterruptedException {
// webDriver.navigate().back();//后退
webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
}
public static Stream<Arguments> Generator () {
return Stream.of(Arguments.arguments("冰激凌","010822"));
}
@Order(3)
@ParameterizedTest
@MethodSource("Generator")
public void login(String username,String password) throws InterruptedException {
// webDriver.navigate().back();//后退
// sleep(1000);
WebElement usernameInput = webDriver.findElement(By.cssSelector("#username"));
WebElement passwordInput = webDriver.findElement(By.cssSelector("#password"));
usernameInput.sendKeys(username);
passwordInput.sendKeys(password);
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(1000);
// webDriver.switchTo().window(webDriver.getWindowHandle());
Assertions.assertEquals("微聊",webDriver.getTitle());
}
/**
* 输入错误的账号密码测试
*/
@Order(4)
@ParameterizedTest
@MethodSource("Generator")
public void loginError(String username,String password) throws InterruptedException {
// sleep(1000);
// webDriver.findElement(By.cssSelector("body > div.client-container > div.toolbar > span.tool-button > a > img")).click();
WebElement usernameInput = webDriver.findElement(By.cssSelector("#username"));
WebElement passwordInput = webDriver.findElement(By.cssSelector("#password"));
usernameInput.sendKeys(username);
passwordInput.sendKeys(password + 1);
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(1000);
Alert alert = webDriver.switchTo().alert();
Assertions.assertNotNull(alert);
}
}
测试结果:在测试登录功能中 测试了多项指标 整体体验效果较好 在高并发的情况下服务器出现了少量的卡顿导致响应不及时 但并不影响用户体验
会话窗口
测试用例
自动化测试代码:
/**
* @Author: 冰激凌
* @Date: 2023-07-13 22:32
**/
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)//设置优先级需要的
public class ClientTest {
private WebDriver webDriver;
@BeforeEach
public void Genter(){
webDriver = new ChromeDriver();
webDriver.get("http://192.144.216.100:1120/login.html");
}
@AfterEach
public void close(){
webDriver.quit();
}
public static Stream<Arguments> Generator () {
return Stream.of(Arguments.arguments("冰激凌","010822"));
}
/**
* 当前用户名是否正确
* @param username
* @param password
* @throws InterruptedException
*/
@ParameterizedTest
@MethodSource("Generator")
public void isUsername(String username,String password) throws InterruptedException {
WebElement usernameInput = webDriver.findElement(By.cssSelector("#username"));
WebElement passwordInput = webDriver.findElement(By.cssSelector("#password"));
usernameInput.sendKeys(username);
passwordInput.sendKeys(password);
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(1000);
WebElement element = webDriver.findElement(By.cssSelector("body > div.client-container > div.main > div.left > div.user"));
String innerhtml = element.getAttribute("innerHTML");
Assertions.assertEquals(username,innerhtml);
}
/**
* 测试登录后发送消息以及添加好友功能
* @param username
* @param password
* @throws InterruptedException
*/
@ParameterizedTest
@MethodSource("Generator")
public void client(String username,String password) throws InterruptedException {
webDriver.manage().window().maximize();//页面放大
WebElement usernameInput = webDriver.findElement(By.cssSelector("#username"));
WebElement passwordInput = webDriver.findElement(By.cssSelector("#password"));
usernameInput.sendKeys(username);
passwordInput.sendKeys(password);
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(500);
webDriver.findElement(By.xpath("//*[@id=\"session-list\"]/li[7]")).click();
sleep(100);
//获取到当前会话中的所有消息
List<WebElement> webElements = webDriver.findElements(By.cssSelector("body > div.client-container > div.main > div.right > div.message-show div"));
//获取到消息的个数
int count = webElements.size();
//选中输入框
WebElement input = webDriver.findElement(By.cssSelector("body > div.client-container > div.main > div.right > textarea"));
//在输入框输入消息
input.sendKeys("馒头!晚上约个饭");
sleep(100);
//发送
input.sendKeys(Keys.ENTER);
sleep(500);
//再次获取所有的消息个数
List<WebElement> webElements1 = webDriver.findElements(By.cssSelector("body > div.client-container > div.main > div.right > div.message-show div"));
//获取到消息的个数
int count1 = webElements1.size();
//如果count + 1 == count 则代表发送成功
Assertions.assertNotEquals(count,count1);
webDriver.findElement(By.cssSelector("body > div.client-container > div.main > div.left > div.search > input")).sendKeys("小s");
webDriver.findElement(By.cssSelector("body > div.client-container > div.main > div.left > div.search > button")).click();
sleep(500);
Alert alert = webDriver.switchTo().alert();//确认弹窗
alert.accept();//点击确认按钮
sleep(500);
webDriver.findElement(By.cssSelector("body > div.client-container > div.main > div.left > div.tab > div.tab-friend")).click();
List<WebElement> webElements2 = webDriver.findElements(By.cssSelector("#friend-list li"));
boolean flg = false;
WebElement friend = null;
for(WebElement element : webElements2){
if(element.getAttribute("friend-id").equals("47")){
flg = true;
friend = element;
break;
}
}
Assertions.assertEquals(true,flg);
friend.click();
}
}
测试结果:在测试会话界面测试中 功能使用非常简单 基本功能已经完善 在快速处理消息响应下提要较优 在测试添加好友功能时的处理比较特殊 使用的强制添加好友措施 不是非常合理 希望后序继续完善
朋友圈界面
测试用例:
自动化测试代码:
/**
* @Author: 冰激凌
* @Date: 2023-07-14 11:21
**/
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)//设置优先级需要的
public class BlogListTest {
private WebDriver webDriver;
@BeforeEach
public void Genter(){
webDriver = new ChromeDriver();
webDriver.get("http://192.144.216.100:1120/login.html");
}
@AfterEach
public void close(){
webDriver.quit();
}
public static Stream<Arguments> Generator () {
return Stream.of(Arguments.arguments("冰激凌","010822"));
}
/**
* 验证进入朋友圈主页
* @param username
* @param password
* @throws InterruptedException
*/
@Order(1)
@ParameterizedTest
@MethodSource("Generator")
public void blog(String username,String password) throws InterruptedException {
webDriver.manage().window().maximize();//页面放大
WebElement usernameInput = webDriver.findElement(By.cssSelector("#username"));
WebElement passwordInput = webDriver.findElement(By.cssSelector("#password"));
usernameInput.sendKeys(username);
passwordInput.sendKeys(password);
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(100);
webDriver.findElement(By.cssSelector("body > div.client-container > div.toolbar > span.circle-of-friends > button > img")).click();
sleep(100);
Assertions.assertEquals("我的朋友圈",webDriver.getTitle());
webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")).click();
sleep(100);
Assertions.assertEquals("朋友圈列表",webDriver.getTitle());
webDriver.navigate().back();//后退
sleep(100);
webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
sleep(100);
Assertions.assertEquals("朋友圈编辑",webDriver.getTitle());
webDriver.navigate().back();//后退
sleep(100);
webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();
sleep(100);
Assertions.assertEquals("微聊",webDriver.getTitle());
}
/**
* 验证当前登入的用户名是否正确
* @param username
* @param password
* @throws InterruptedException
*/
@Order(2)
@ParameterizedTest
@MethodSource("Generator")
public void blog_list(String username,String password) throws InterruptedException {
webDriver.manage().window().maximize();//页面放大
WebElement usernameInput = webDriver.findElement(By.cssSelector("#username"));
WebElement passwordInput = webDriver.findElement(By.cssSelector("#password"));
usernameInput.sendKeys(username);
passwordInput.sendKeys(password);
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(100);
webDriver.findElement(By.cssSelector("body > div.client-container > div.toolbar > span.circle-of-friends > button > img")).click();
sleep(500);
String blogTitle = webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > div.title")).getAttribute("innerHTML");
webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > a:nth-child(4)")).click();
String curBlogTitle = webDriver.findElement(By.cssSelector("#title")).getAttribute("innerHTML");
Assertions.assertEquals(blogTitle,curBlogTitle);
}
/**
* 验证修改动态内容
* @param username
* @param password
* @throws InterruptedException
*/
@Order(3)
@ParameterizedTest
@MethodSource("Generator")
public void blog_list1(String username,String password) throws InterruptedException {
webDriver.manage().window().maximize();//页面放大
WebElement usernameInput = webDriver.findElement(By.cssSelector("#username"));
WebElement passwordInput = webDriver.findElement(By.cssSelector("#password"));
usernameInput.sendKeys(username);
passwordInput.sendKeys(password);
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(100);
webDriver.findElement(By.cssSelector("body > div.client-container > div.toolbar > span.circle-of-friends > button > img")).click();
sleep(300);
String blogTitle = webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > div.desc")).getAttribute("innerHTML");
webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > a:nth-child(5)")).click();
sleep(1000);
String curBlogTitle = webDriver.findElement(By.cssSelector("#editorDiv > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div > pre > span > span")).getAttribute("innerHTML");
Assertions.assertEquals(blogTitle,curBlogTitle);
}
/**
* 验证发布文章 删除文章等
* @param username
* @param password
* @throws InterruptedException
*/
@Order(4)
@ParameterizedTest
@MethodSource("Generator")
public void blog_list2(String username,String password) throws InterruptedException {
webDriver.manage().window().maximize();//页面放大
WebElement usernameInput = webDriver.findElement(By.cssSelector("#username"));
WebElement passwordInput = webDriver.findElement(By.cssSelector("#password"));
usernameInput.sendKeys(username);
passwordInput.sendKeys(password);
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(100);
webDriver.findElement(By.cssSelector("body > div.client-container > div.toolbar > span.circle-of-friends > button > img")).click();
sleep(300);
webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
sleep(800);
webDriver.findElement(By.cssSelector("#title")).sendKeys("自动化测试");
WebElement element = webDriver.findElement(By.cssSelector("#editorDiv > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll"));
webDriver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click();
sleep(200);
Alert alert = webDriver.switchTo().alert();//确认弹窗
alert.accept();//点击确认按钮
sleep(200);
String title = webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > div.title")).getAttribute("innerHTML");
Assertions.assertEquals("自动化测试",title);
//测试删除
String time = webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > div.date")).getAttribute("innerHTML");
sleep(100);
webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > a:nth-child(6)")).click();
webDriver.switchTo().alert().accept();//确认
sleep(100);
webDriver.switchTo().alert().accept();//确认
sleep(100);
String curTime = webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > div.date")).getAttribute("innerHTML");
sleep(200);
Assertions.assertNotEquals(time,curTime);
}
}
测试结果:在测试朋友圈功能时 在高并发的体验下载加载编辑页面与发布页面时反应较慢 整体功能比较完善 整体体验较优
界面测试
注册页面
测试用例:用户注册界面
测试结果:微聊的用户登录界面设计简洁明了,易于操作,位置合理,目的明确
登录页面
测试用例:用户登录界面测试结果:微聊的用户登录界面设计简洁明了,易于操作。所有按钮和菜单都放置在合适的位置,且颜色搭配合理。测试人员没有发现任何UI问题或错误。
会话页面
测试用例:会话页面
测试结果:会话布局设置合理 功能明确
朋友圈页面
测试用例:朋友圈页面
测试结果:风格与会话页面统一 整体风格较为舒适 布局合理明确
界面测试补充:
- 是否有遮挡重要数据
- 检查阿牛的可用性,操作,便捷性
- 界面中文字是否正确
- 命名是否统一
- 文字、菜单、图片组合是否完美
- 检查Tab键 以及鼠标移动等快捷键
- 窗口对象和特征(菜单、大小、位置、状态和中心)
- 图标代表对应的功能是否明晰
- 用户是否可自主设置界面背景、颜色
- 工具栏中的每一个按钮要有及时的反馈或提示信息
- 工具栏的长度最长不能超过屏幕的宽度(高度可以使用滚动条)
- 工具栏太多可以考虑使用工具箱
- 工具箱是否可以让用户自主添加、删除功能
- 滚动条的长度要根据显示信息的长度或宽度能及时变换,以利于用户了解显示信息的位置和百分比
- 按钮大小基本相近,忌用太长的名称,免得占用过多的界面位置
- 按钮的大小要与界面的大小和空间要协调
- 前景与背景色搭配合理协调,反差不宜太大
- 界面风格要保持一致,字的大小、颜色、字体要相同,除非是需要艺术处理或有特殊要求的地方
- 通常父窗体支持缩放时,子窗体没有必要缩放
- 菜单、调色板和工具条是否工作正确
- 菜单功能的名字是否具有自解释性
- 如果要求多次点击鼠标,是否能够在语境正确识别
- 界面上应有单位介绍或产品介绍,并有自己的图标
- 主界面,最好是大多数界面上要有公司图标或者自己独特的Logo
- 当用户作出选择的可能性只有两个时,可以采用单选框以防止输入无效数据
兼容性测试
PC
测试结果:在windows、Linux、Mac系统中使用网页访问效果一致 功能使用正常 兼容测试通过
Pad
测试结果:在安卓、IOS系统中需要开启电脑端模式访问浏览器才可以进行正常使用 体验效果一般 兼容测试通过
手机
测试结果:在安卓、IOS系统中对于页面布局无法正常展示 无法进行正常的使用 兼容测试不通过
浏览器
测试结果:在Chrom、IE内核中的浏览器使用正常 页面布局显示正确 功能使用正常 兼容性测试通过
兼容性测试补充:
- 操作系统兼容性
- 数据库兼容性(考虑对于不同数据库的兼容能力)
- 新旧数据转换(是否可以兼容不同格式的新数据)
- 暑假兼容性(是否提供对其他常用数据格式的支持、支持的程度)
- 应用软件的兼容性(主要考虑到是否需要其他软件的支持,另一点是判断与其他应用一起使用 是否会造成软错误或软件本身不能正确实现功能)
- 硬件兼容性(计算机的不同型号、网卡的不同型号、声卡的型号、显卡的型号,有些软件可能在不同的硬件环境中 可能会表现出不同的行为 或者甚至是不能运行)
性能测试
测试用例:同时进行多个会话窗口
测试结果:运行流畅 接收发送消息流畅 使用体验较好
测试用例:频繁切换用户聊天窗口
测试结果:切换流畅 并且可以正确展示历史聊天记录
测试用例:大量用户访问使用是否流畅
测试工具:LoadRunner
测试结果:服务器性能一般 在高并发的使用下页面首次加载出现明显的卡顿 使用体验较差 建议对服务器进行升级
测试用例:浏览页面、发布朋友圈、加载全文是否流畅
测试结果:在少量用户使用的情况下效果良好 加载迅速
性能测试用例补充:
- 观察不同的性能指标 根据性能指标做测试
- 并发和并发数
- 响应时间/ 平均响应时间
- 事务/ 事务响应时间/ 每秒事务通过数
- 点击量、吞吐率
- 用户的思考时间
- 资源利用率
安全测试
密码保存是否安全
测试用例:保存密码的数据库是否存在风险
测试结果:本系统中使用的数据库使用了MD5加盐算法保存密码在数据库中 安全系数较高
SQL注入
测试用例:在登录时使用sql注入尝试能否正确登录
测试结果:在MyBatis中使用特殊的方法预防了SQL注入 安全系数较高
服务器错发
测试用例:在高并发的情况下频繁切换与发送消息
测试结果:未出现消息错发与消息错乱的情况 安全系数较高
安全测试补充:
- 应当注意尽可能避免用户无意录入无效的数据
- 当用户作出选择的可能性只有两个时,可以采用单选框以防止输入无效数据
- 对一些特殊符号的输入、与系统使用的符号相冲突的字符等进行判断并阻止用户输入该字符
- 对错误操作最好支持可逆性处理,如取消系列操作
- 登录页面测试弱口令例如admin
- 如果存在缓存 自动填写入账号密码 密码是否已被加密 加密后修改格式为text能否显示出密码
- 截取请求伪造验证码
- 测试验证码的过期时间
- 测试更换验证码后之前的验证码是否仍旧可用
- 伪造Session 测试是否能够伪造消息发送 或者动态发布
- 频繁登录退出
- 尝试手动使用Get方法来完成登录请求 在url中手动?username = *** &password= *** 是否可以跳过验证码校验
- 频繁的请求验证码
- 两个账户去登录页面获取到验证码后使用对方的验证码是否可以通过校验
- 消息是否做了长度限制处理 做了是否可以超过长度 如果超过长度会怎么样
- 伪造好友申请
- 批量注册请求发起
- 向无效页面发起请求是否成功过
- 批量发起页面访问请求
- 动态标题SQL发起大批量的发布动态请求
- Spring Boot漏洞
网络测试
有网
测试结果:在2g情况下访问缓慢 在3g、4g、5g、wifi情况下访问快速 体验较好
弱网
测试工具:使用fidder模拟弱网情况
测试结果:弱网情况下访问缓慢 但是加载出的内容与预期结果完全一致
断网
测试结果:在断网情况下无法访问网页 对于网络依赖较高
网络测试补充:
- DDOS攻击
- DNS攻击(主要是域名劫持)
- DNS污染(主要是从三大运营商修改掉DNS解析出的正确的网络IP)
- 使用工具或者僵尸机向微聊发起大量的TCP连接(但是不完成三次握手 占用资源)
- 发起大量的UDP无效信息传输
- ARP攻击(中间人劫持 获取他们其中传递的信息)
声明
当前的项目在不断的迭代更新、后续的更新中也会不断的更新出新的功能、新的UI界面,对于性能也会有更多的优化,所以测试用例是应对于大部分的测试场景的,测试用例覆盖率很难达到100%,越复杂的功能越难保证,只能说尽量提高测试覆盖率