目录
一、项目背景
1. 妙语博客苑是一个博客系统,采用前后端分离的方法来实现,使用数据库来存储数据,并且部署到了云服务器上。
前端主页主要有四个页面构成: 登录页面、博客列表页面、博客详情页面以及博客编辑页面,这四个页面模拟实现了最简单的个人博客系统。
结合后的功能主要有:登录、编辑博客、注销、删除博客、强制登陆等功能。
2. 妙语博客苑没有设计用户注册的功能,只能使用数据库中提前存储的账号进行登录,并且无法更改头像。
3. 妙语博客苑可以实现个人用户简单的博客记录, 时间、标题、内容以及发布者等都可以详细的查看。
二、项目功能
妙语博客苑主要实现了以下几个功能: 登录、注销、写博客以及删除博客等功能。
1. 登录功能: 使用数据库预先存储好的用户名及正确的密码进行登录。登录成功就会转跳博客列表页面, 页面右上角可以对账号进行注销。
2. 博客列表功能: 可以在博客列表界面查看数量有限的博客简介,其中包括博客标题、发布时间以及内容概要。在左侧可以看到登录用户以及用户的文章数、分类树等的模块。
在右上角,有主页、写博客和注销博客三个功能:主页即转跳到列表页、写博客转跳到博客编辑页面、注销即注销用户,回到登录界面。
3. 博客详情页面: 在列表页面点击"查看全文" 按钮就会跳转到详情页面,此时就可以看到该篇博客的完整内容。
在右上角有主页、写博客、删除和注销四个功能: 删除即删除该篇博客,删除之后就会跳转到列表页面,该篇博客就被成功删除。
4.写博客:在登录之后的任意界面点击“写博客”之后就会进入博客编辑页面,此时就可以进行博客的编写,点击“发布文章”后就可以成功发布文章,此时就会跳转到博客列表页。
三、测试计划
一) 功能测试
1.测试用例
2. 实际执行测试的部分操作步骤/截图
1) 正常登录
2) 登录成功
3. 写博客测试
4. 发布成功并查看详情页
5. 删除博客
点击删除后,22.38的博客就被删除了
6. 注销
点击注销后回到登录页面
二) 自动化测试
代码编写
1.添加相关依赖 pom.xml
<dependencies>
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>5.8.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
2.新建包并在包下创建测试类以及公共类
1)公共类Utils:
package common;
import io.github.bonigarcia.wdm.WebDriverManager;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.Duration;
public class Utils {
public static WebDriver driver;
public static WebDriver createDriver(){
if(driver == null){
WebDriverManager.chromedriver().setup();
ChromeOptions options = new ChromeOptions();
//允许访问所有的链接
options.addArguments("--remote-allow-origins=*");
driver = new ChromeDriver(options);
//等待
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(2));
}
return driver;
}
public Utils(String url){
//调用driver对象
driver = createDriver();
//访问url
driver.get(url);
}
public void getScreenShot(String str) throws IOException {
//屏幕截图
SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sim2 = new SimpleDateFormat("HHmmssSS");
String dirTime = sim1.format(System.currentTimeMillis());
String fileTime = sim2.format(System.currentTimeMillis());
//./src/test/image/2024-07-17/test01-17453020.png
String filename ="./src/test/image/"+ dirTime +"/" + str + "-" + fileTime+".png";
File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
//srcFile放到指定位置
FileUtils.copyFile(srcFile,new File(filename));
}
}
2)LoginPage:
package tests;
import common.Utils;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import java.io.IOException;
import static java.lang.Thread.sleep;
public class LoginPage extends Utils {
public static String url = "http://47.121.203.39:8080/blog_login.html";
public LoginPage() {
super(url);
}
/*
检查页面是否加载成功
*/
public void loginPageRight() throws InterruptedException, IOException {
//通过查看页面元素是否存在来检查页面加载成功与否
//登录
driver.findElement(By.cssSelector("body > div.container-login > div > h3"));
//登陆输入框
driver.findElement(By.cssSelector("#username"));
}
//检查登录功能---成功登录
public void LoginSuc() throws IOException {
driver.findElement(By.cssSelector("#username")).clear();
driver.findElement(By.cssSelector("#password")).clear();
driver.findElement(By.cssSelector("#username")).sendKeys("zhangsan");
driver.findElement(By.cssSelector("#password")).sendKeys("123456");
driver.findElement(By.cssSelector("#submit")).click();
//检查点击登陆之后是否登陆成功
driver.findElement(By.cssSelector("body > div.container > div.right > div:nth-child(1) > a"));
//页面标题来检查是否登陆成功
String expect = driver.getTitle();
assert expect.equals("博客列表页");
getScreenShot(getClass().getName());
driver.navigate().back();
}
/*
检查登录功能---登录失败
*/
public void LoginFail() throws IOException, InterruptedException {
//方法一:通过clear保证输入框没有文本
driver.findElement(By.cssSelector("#username")).clear();
driver.findElement(By.cssSelector("#password")).clear();
//方法二:通过刷新保证输入框没有文本
//driver.navigate().refresh();
driver.findElement(By.cssSelector("#username")).sendKeys("zhangsan");
driver.findElement(By.cssSelector("#password")).sendKeys("666666");
driver.findElement(By.cssSelector("#submit")).click();
getScreenShot(getClass().getName());
sleep(2000);
driver.switchTo().alert().accept();
}
}
3)ListPage:
package tests;
import common.Utils;
import org.openqa.selenium.By;
public class ListPage extends Utils {
public static String url = "http://47.121.203.39:8080/blog_list.html";
public ListPage() {
super(url);
}
//未登录
public void ListByNoLogin(){
driver.findElement(By.cssSelector("body > div.container-login > div > h3"));
driver.findElement(By.cssSelector("#username"));
}
}
4)EditPage:
package tests;
import common.Utils;
import org.openqa.selenium.By;
import static java.lang.Thread.sleep;
public class EditPage extends Utils {
public static String url = "http://47.121.203.39:8080/blog_edit.html";
public EditPage() {
super(url);
}
public void EditSuc() throws InterruptedException {
driver.findElement(By.cssSelector("#title")).sendKeys("自动化测试标题");
driver.findElement(By.cssSelector("#submit")).click();
driver.findElement(By.cssSelector("body > div.container > div.left > div > img"));
driver.navigate().back();
}
}
5)释放驱动DriverQuite:
package tests;
import common.Utils;
public class DriverQuite extends Utils {
public static String url = "http://47.121.203.39:8080/blog_login.html";
public DriverQuite() {
super(url);
}
public void DriverQuite(){
driver.quit();
}
}
代码测试
所有测试用例通过