一、项目背景
该系统是一款采用JavaWeb技术栈构建的现代化个人及团队博客系统,旨在为用户提供便捷、高效、个性化的博客创作、分享与互动体验。项目融合了前沿的技术框架与设计理念,兼顾易用性、功能性、安全性与可扩展性,旨在打造一个集知识传播、观点交流、社群互动于一体的网络内容生态系统。
项目主要功能:
a) 用户登录、注册和注销;
b) 用户发布,修改,删除博客;
c) 显示用户个人信息
开发技术:SpringBoot、SpringMVC、MyBatis、Redis
二、测试用例
-
思维导图展示部分测试用例
三、功能测试
1、准备工作
selenium环境搭建:在IDEA创建Maven项目,导入pom.xml相关依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.9.1</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.9.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.9.1</version>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<version>1.9.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-suite -->
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<version>1.9.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.9.1</version>
<scope>test</scope>
</dependency>
</dependencies>
Selenium Java:用于自动化Web应用程序测试的工具。
Commons IO:Apache Commons项目的一部分,提供了一组常用的I/O工具类。
JUnit Jupiter API:JUnit 5的API模块,用于编写和运行单元测试。
JUnit Jupiter Params:JUnit 5的参数化测试支持模块。
JUnit Platform Suite:JUnit Platform的测试套件引擎。
JUnit Jupiter Engine:JUnit 5的测试引擎,用于执行基于JUnit Jupiter的测试。
初始化浏览器驱动:每个自动化测试用例之前创建驱动,运行所有的测试方法结束之后来释放驱动
package Blog;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class StartAndEnd {
static WebDriver webDriver;
@BeforeAll
static void Start(){
webDriver = new ChromeDriver();
}
@AfterAll
static void End(){
webDriver.quit();
}
}
2、测试博客系统的登录界面
测试用例:
界面测试:包括但不限于菜单栏的显示、登录框的显示和布局、背景、图片、页面元素的显示等
登陆测试:输入用户名:User密码:123456,显示登录成功,并跳转到博客首页
输入用户名:User1密码:123456,提示账号或密码错误
不输入用户名点击登陆,提示请先输入用户名
输入用户名不输入密码点击登陆,提示请输入密码
void LoginSuccess(String username, String password, String blog_list_url) throws InterruptedException{
System.out.println(username + password + blog_list_url);
// 打开博客登录页面
webDriver.get("http://42.192.83.143:8563/blog_system/blog_login.html");
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 输入账号admin
webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 输入密码123
webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 点击提交按钮
webDriver.findElement(By.cssSelector("#submit")).click();//点击
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
webDriver.switchTo().alert().accept();//跳转到弹窗 点击确认
// 跳转到列表页
// 获取到当前页面url
String cur_url = webDriver.getCurrentUrl();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
Assertions.assertEquals(blog_list_url, cur_url);
// 列表页展示用户信息是admin
// 用户名是admin测试通过,否则测试不通过
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
String cur_admin = webDriver.findElement(By.cssSelector("body > div.container > div.left > div > h3")).getText();
Assertions.assertEquals(username, cur_admin);
}
出现问题 :报错no such alert 没有找到弹窗,猜测原因是没有识别出来弹窗或者页面还没加载完毕就去寻找弹窗导致的报错,改用强制等待代替隐式等待,不用显式等待是因为隐式等待要素过多再用显式等待可能出错。
3、测试我的博客列表页
测试用例:
void BlogList() {
// 获取博客列表页网址
webDriver.get("http://42.192.83.143:8563/blog_system/blog_list.html");
// 隐式等待3秒
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 获取博客列表页所有博客文章标题数量
int title_num = webDriver.findElements(By.cssSelector(".title")).size();
System.out.println(title_num);
// 隐式等待3秒
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 判断所有文章数量不为0 测试通过
Assertions.assertNotEquals(0, title_num);
// 判断个人信息中的文章数量是否与博客列表文章标题数量是否一致
String articleNum = webDriver.findElement(By.cssSelector("#artCount")).getText();
Assertions.assertEquals(articleNum, title_num + "");
}
4、测试博客系统的博客详情页
测试用例:
界面测试:页面元素是否正常显示
功能测试:登录状态能够正常的修改、删除该博客、从我的博客列表正常打开
未登录状态点击博客详情页的删除按钮,弹窗提示,跳转到登录页面
void BlogDetail(String expected_url, String expected_title, String expected_blog_title) {
// 找到第一篇博客对应的产看全文按钮
webDriver.findElement(By.xpath("/html/body/div[2]/div[2]/div[1]/a")).click();
// 获取当前页面url
String cur_url = webDriver.getCurrentUrl();
// 获取当前页面title
String cur_title = webDriver.getTitle();
// 获取博客标题
String cur_blog_title = webDriver.findElement(By.cssSelector("body > div.container > div.right > div > h3")).getText();
Assertions.assertEquals(expected_title ,cur_title);
Assertions.assertEquals(expected_blog_title, cur_blog_title);
if(cur_url.contains(expected_url)) {
System.out.println("测试通过");
} else {
System.out.println(cur_url);
System.out.println("测试不通过");
}
}
5、测试博客编辑页
测试用例:
void EditBlog() throws InterruptedException {
// 找到写博客按钮,点击
webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
((JavascriptExecutor)webDriver).executeScript("document.getElementById(\"title\").value=\"自动化测试\"");
sleep(3000);
// 点击发布
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(3000);
// 获取当前页面url
String cur_url = webDriver.getCurrentUrl();
Assertions.assertEquals("http://42.192.83.143:8563/blog_system/blog_list.html", cur_url);
}
6、测试删除博客
void DeleteBlog() throws InterruptedException {
// 打开博客列表页面
webDriver.get("http://42.192.83.143:8563/blog_system/blog_list.html");
// 点击全文按钮
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
webDriver.findElement(By.cssSelector("body > div.container > div.right > div:nth-child(1) > a")).click();
// 点击删除按钮
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(7)")).click();
sleep(3000);
// 博客列表页第一篇博客标题不是“自动化测试”
String first_blog_title = webDriver.findElement(By.xpath("/html/body/div[2]/div[2]/div[1]/div[1]")).getText();
// 校验当前博客标题不等于“自动化测试”
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
Assertions.assertNotEquals(first_blog_title, "自动测试");
}
7、测试注销
测试用例:
void Logout() {
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 校验url(登录url)
String cur_url = webDriver.getCurrentUrl();
Assertions.assertEquals("http://42.192.83.143:8563/blog_system/blog_login.html", cur_url);
// 校验提交按钮
WebElement webElement = webDriver.findElement(By.cssSelector("#submit"));
Assertions.assertNotNull(webElement);
}
四、兼容性测试
(1)在edge浏览器查看功能是否正常。
(2)在Chrome浏览器查看功能是否正常
(3)在联想浏览器查看功能是否正常