一、项目背景
模拟网页版微信,提供了一个用户之间在线交流平台,是采用前后端分离的方式实现的,使用到的技术有:SpringBoot,SpringMVC,MyBatis,MySQL。
二、测试安排
1.测试环境
硬件:Lenovo Yoga 14S 2021(R7-5800H/16GB/512GB/集显)
操作系统:Windows 10
浏览器:chrome 128.0.6613.84(正式版本) (64 位)
项目运行环境:CentOS7、maven、JDK1.8
自动化脚本运行环境:IIntelliJ IDEA 2021.2.2
2.测试用例
三、测试用例
1.手动功能测试
- 登录界面测试
场景一:登录界面正常显示
场景二:登录界面失败登录–输入正确的账号,输入错误的密码,点击“登录”按钮
预期结果:登录失败,弹出对应提示框
实际结果: 登录失败,弹出对应提示框
场景三:登录界面失败登录–用户未注册,点击“登录”按钮
预期结果:登录失败,弹出对应提示框
实际结果:登录失败,弹出对应提示框
场景四:登录界面失败登录–用户名或密码为空,点击“登录”按钮
预期结果:登录失败,弹出对应提示框
实际结果:登录失败,弹出对应提示框
场景五:登录界面成功登录—输入正确的账号和密码,点击“登录”按钮
预期结果:登陆成功,跳转到会话页面
实际结果:登陆成功,跳转到会话页面
- 注册界面测试
场景一:注册界面正常显示
场景二:注册失败测试–输入已经存在的账号,密码
预期结果:注册失败,弹出对应提示框
实际结果:注册失败,弹出对应提示框
场景三:登录界面失败登录–用户名或密码为空,点击“注册”按钮
预期结果:注册失败,弹出对应提示框
实际结果:注册失败,弹出对应提示框
场景四:注册成功测试–输入正确注册账号,密码,点击注册
预期结果:注册成功,弹出对应提示框成功跳转到登录界面
实际结果:注册成功,弹出对应提示框成功跳转到登录界面
- 用户未登录情况下进入会话界面
测试未登录情况下,打开会话页面,进行相应弹窗处理
预期结果:打开会话页面,弹窗显示用户未登录。
实际结果:打开会话页面,弹窗显示用户未登录。
- 会话界面测试
场景一:会话界面正常打开。
场景二:消息列表正常显示,能显示所有消息 ,点击消息,右侧会话框能正常显示该消息详细信息。
场景三:好友列表正常显示,能显示所有好友 。点击好友,跳转到左侧消息标签页,该好友消息置顶,右侧会话框能正常显示该消息详细信息。
场景四:检查聊天功能正常,用户张三发送信息,用户李四接受信息
2.自动化测试
2.1登录界面测试
/**
* @author ALL
* @description: 登录自动化测试
*/
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class LoginTest extends AutoUtils {
public static WebDriver driver=AutoUtils.createDriver();
//打开界面
@BeforeAll
public static void getLogin(){
driver.get("http://127.0.0.1:8080/login.html");
driver.manage().window().maximize();
}
//登录界面正常显示
@Test
@Order(1)
public void LoginPageRight() throws IOException {
driver.navigate().refresh();
String except="登录";
String act=driver.findElement(By.cssSelector("body > div.login-container > div>h3")).getText();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
driver.findElement(By.cssSelector("#username"));
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
driver.findElement(By.cssSelector("#password"));
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
driver.findElement(By.cssSelector("#submit"));
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
Assertions.assertEquals(except,act);
getScreenShot(getClass().getName());
System.out.println("登陆界面正常显示");
}
//登录界面登录失败--参数一:未注册的用户 参数二:已注册的用户但密码错误
@ParameterizedTest
@CsvSource(value = {"zhang,12","zhangsan,12"})
@Order(2)
public void LoginPageFalse(String username,String password) throws InterruptedException, IOException {
//清除原有的用户名密码
driver.navigate().refresh();
driver.findElement(By.cssSelector("#username")).sendKeys(username);
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
driver.findElement(By.cssSelector("#password")).sendKeys(password);
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
driver.findElement(By.cssSelector("#submit")).click();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
//等待弹窗
Thread.sleep(3000);
//判断弹窗
Alert alert=driver.switchTo().alert();
String except="登录失败!";
String act = driver.switchTo().alert().getText();
if(alert!=null){
alert.accept();
Assertions.assertEquals(except,act);
System.out.println("登录失败测试成功");
}else{
System.out.println("登录失败测试失败");
assert false;
}
getScreenShot(getClass().getName());
}
@ParameterizedTest
@CsvSource(value = {"'zhangsan','123','登录成功!','网页聊天程序'"})
@Order(3)
//登录界面登录成功
public void LoginPageSuc(String username,String password,String except,String except2) throws InterruptedException, IOException {
//清除原有的用户名密码
driver.navigate().refresh();
driver.findElement(By.cssSelector("#username")).sendKeys(username);
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
driver.findElement(By.cssSelector("#password")).sendKeys(password);
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
driver.findElement(By.cssSelector("#submit")).click();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
//等待弹窗
Thread.sleep(3000);
//判断弹窗
String act = driver.switchTo().alert().getText();
Assertions.assertEquals(except,act);
//点击确认弹窗
driver.switchTo().alert().accept();
getScreenShot(getClass().getName());
Thread.sleep(3000);
//检查是否跳转到了主页面
String act2=driver.getTitle();
Assertions.assertEquals(act2,except2);
System.out.println("登录成功测试成功");
getScreenShot(getClass().getName());
}
}
2.2 注册界面测试
/**
* @author ALL
* @description:注册界面自动化
*/
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class RegisterTest extends AutoUtils {
public static WebDriver driver=AutoUtils.createDriver();
@BeforeAll
public static void getRegister(){
driver.get("http://127.0.0.1:8080/Register.html");
driver.manage().window().maximize();
}
//注册界面正常显示
@ParameterizedTest
@ValueSource(strings={"注册"})
@Order(1)
public void RegisterPageRight(String except){
String act=driver.findElement(By.cssSelector("body > div.login-container > div > h3")).getText();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
driver.findElement(By.cssSelector("#username"));
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
driver.findElement(By.cssSelector("#password"));
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
driver.findElement(By.cssSelector("#submit"));
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
Assertions.assertEquals(except,act);
System.out.println("注册界面显示成功");
}
//注册界面失败注册--参数一:已注册的用户名密码;
@ParameterizedTest
@CsvSource(value={"zhangsan,123"})
@Order(2)
public void RegisterFalse(String username,String password) throws InterruptedException, IOException {
driver.navigate().refresh();
driver.findElement(By.cssSelector("#username")).sendKeys(username);
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
driver.findElement(By.cssSelector("#password")).sendKeys(password);
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
driver.findElement(By.cssSelector("#submit")).click();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
Thread.sleep(3000);
//检查弹窗--注册失败!
Alert alert=driver.switchTo().alert();
String except="注册失败!";
String act=alert.getText();
Assertions.assertEquals(except,act);
alert.accept();
getScreenShot(getClass().getName());
System.out.println("注册界面失败注册测试成功");
}
//注册界面成功注册--账号密码都正确填写,会自动跳转到注册界面
@ParameterizedTest
@CsvSource(value = {"'lisi5','123','注册成功!','登录页面'"})
@Order(3)
public void RegisterSuc(String username,String password,String except,String except2) throws InterruptedException, IOException {
driver.navigate().refresh();
driver.findElement(By.cssSelector("#username")).sendKeys(username);
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
driver.findElement(By.cssSelector("#password")).sendKeys(password);
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
driver.findElement(By.cssSelector("#submit")).click();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
Thread.sleep(3000);
//检查弹窗--注册成功
Alert alert=driver.switchTo().alert();
String act=alert.getText();
Assertions.assertEquals(except,act);
//点击确认弹窗
alert.accept();
getScreenShot(getClass().getName());
Thread.sleep(3000);
//检查是否跳转到登录界面
String act2=driver.getTitle();
Assertions.assertEquals(act2,except2);
getScreenShot(getClass().getName());
System.out.println("注册界面成功注册测试成功");
}
}
2.3 未登录测试
/**
* @author ALL
* @description: 未登录状态下访问会话框
*/
public class NoLoginTest extends AutoUtils {
public static WebDriver driver=AutoUtils.createDriver();
@Test
public void noLogin() throws InterruptedException, IOException {
driver.get("http://127.0.0.1:8080/client.html");
//检查弹窗
Thread.sleep(2000);
Alert alert=driver.switchTo().alert();
String act="当前用户未登录!";
String except="当前用户未登录!";
if(alert!=null){
alert.accept();
System.out.println("未登录状态下访问会话框测试正确");
}else{
except="测试失败";
}
Assertions.assertEquals(except,act);
getScreenShot(getClass().getName());
}
}
2.4 会话功能测试
/**
* @author ALL
* @description: 会话界面测试
*/
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class ClientTest extends AutoUtils{
public static WebDriver driver= AutoUtils.createDriver();
//打开页面
@BeforeAll
public static void getClient(){
driver.get("http://127.0.0.1:8080/client.html");
driver.manage().window().maximize();
}
//会话界面正常打开
@Test
@Order(1)
public void ClientPageRight() throws IOException {
driver.navigate().refresh();
String except="网页聊天程序";
String act=driver.getTitle();
//用户名
driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.user"));
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
//聊天列表
driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.tab > div.tab-session"));
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
//好友列表
driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.tab > div.tab-friend"));
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
//消息编辑框
driver.findElement(By.cssSelector("body > div.client-container > div > div.right > textarea"));
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
//发送按钮
driver.findElement(By.cssSelector("body > div.client-container > div > div.right > div.ctrl > button"));
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
//比较标题
Assertions.assertEquals(except,act);
//截图保存
getScreenShot(getClass().getName());
System.out.println("登陆界面正常显示");
}
//1.消息列表正常显示,能显示所有消息 2.点击消息,右侧会话框能正常显示该消息详细信息
@Order(2)
@Test
public void SessionList() throws InterruptedException, IOException {
//点击消息列表标签页
driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.tab > div.tab-session")).click();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
//消息列表
List<WebElement> num=driver.findElements(By.cssSelector("#session-list>li"));
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
if(num.size()!=0){
//记录最新消息的用户和消息
String name=driver.findElement(By.cssSelector("#session-list > li:nth-child(1) > h3")).getText();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
String text=driver.findElement(By.cssSelector("#session-list > li:nth-child(1) > p")).getText();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
//点击最新消息
driver.findElement(By.cssSelector("#session-list > li:nth-child(1) > h3")).click();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
Thread.sleep(3000);
//检查消息和用户名
String nameAct=driver.findElement(By.cssSelector("body > div.client-container > div > div.right > div.title")).getText();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
//验证最新的一条消息
Assertions.assertEquals(name,nameAct);
getScreenShot(getClass().getName());
}
}
@Test
@Order(3)
//1.好友列表正常显示,能显示所有好友 2.点击好友,跳转到左侧消息标签页,该好友消息置顶,右侧会话框能正常显示该消息详细信息
public void friendList() throws InterruptedException, IOException {
//点击消息列表标签页
driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.tab > div.tab-friend")).click();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
//消息列表
List<WebElement> num=driver.findElements(By.cssSelector("#friend-list>li"));
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
if(num.size()!=0){
//记录第一个用户好友
String name=driver.findElement(By.cssSelector("#friend-list > li:nth-child(1) > h4")).getText();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
//点击该用户
driver.findElement(By.cssSelector("#friend-list > li:nth-child(1) > h4")).click();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
Thread.sleep(3000);
//检查消息和用户名
String nameAct=driver.findElement(By.cssSelector("#session-list > li.selected>h3")).getText();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
//验证最新的一条消息
String nameAct2=driver.findElement(By.cssSelector("body > div.client-container > div > div.right > div.title")).getText();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
Assertions.assertEquals(name,nameAct);
Assertions.assertEquals(name,nameAct2);
getScreenShot(getClass().getName());
}
}
//检查聊天功能正常,用户张三发送信息,
@ParameterizedTest
@CsvSource(value = {"我好累,lisi,123"})
@Order(4)
public void chatSuc(String textExc,String username,String password) throws IOException, InterruptedException {
driver.navigate().refresh();
//zhangsan发送信息
String nameExc="zhangsan";
//点击lisi发送消息
driver.findElement(By.cssSelector("#session-list > li:nth-child(3)")).click();
//编写输入框
driver.findElement(By.cssSelector("body > div.client-container > div > div.right > textarea")).sendKeys(textExc);
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
//点击发送
driver.findElement(By.cssSelector("body > div.client-container > div > div.right > div.ctrl > button")).click();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
//截图保存
getScreenShot(getClass().getName());
//登录lisi
driver.get("http://127.0.0.1:8080/login.html");
Thread.sleep(3000);
driver.findElement(By.cssSelector("#username")).sendKeys(username);
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
driver.findElement(By.cssSelector("#password")).sendKeys(password);
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
driver.findElement(By.cssSelector("#submit")).click();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
//等待弹窗
Thread.sleep(3000);
//点击确认弹窗
driver.switchTo().alert().accept();
getScreenShot(getClass().getName());
Thread.sleep(3000);
//点击zhangsan接受消息
String name=driver.findElement(By.cssSelector("#session-list > li > h3")).getText();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
String text=driver.findElement(By.cssSelector("#session-list > li > p")).getText();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
//点击张三发送用户
driver.findElement(By.cssSelector("#session-list > li")).click();
Thread.sleep(1000);
Assertions.assertEquals(name,nameExc);
Assertions.assertEquals(text,textExc);
getScreenShot(getClass().getName());
}
}
2.5关闭驱动
所有自动化测试用例执行完后,需要退出浏览器
此处我们创建一个退出驱动类,放到测试套件类的最后一个测试类
/**
* @author ALL
* @description:退出驱动
*/
public class DriverQuitTest extends AutoUtils {
private static WebDriver driver = AutoUtils.createDriver();
//关闭驱动
@Test
public void quitWeb() {
driver.quit();
}
}
2.6测试套件
此处我们创建一个 RunTest类,通过 @Suite 注解标识该类为测试套件类,然后使用 @SelectClasses 注解来声明我们要指定的类,最后通过 RunTest类来运行测试用例。相比于使用函数调用来对测试用例进行测试,当前方式大大减少了开销和时间可以直接指定类的测试顺序,即在注解 @SelectClasses 参数中的测试顺序为从左向右。
/**
* @author ALL
* @description:测试套件
*/
@Suite
@SelectClasses({RegisterTest.class, NoLoginTest.class,LoginTest.class,ClientTest.class, DriverQuitTest.class})
public class runTest {
}
2.7自动化测试结果
运行结果:
屏幕截图: