目录
项目介绍
1.博客系统采用前后端分离的方法来实现,同时使用了数据库来存储相关的数据,同时将其部署到云服务器上。
2.前端主要有四个页面构成:登录页、列表页、详情页以及编辑页,以上模拟实现了最简单的个人博客系统。其结合后端实现了以下的主要功能:登录、编辑博客、注销、删除博客。
3.博客系统可以实现个人用户简单的博客记录,时间、标题、内容以及发布者等都可以进行详细地查看。
使用JUnit测试框架对博客系统进行功能测试。
项目功能
博客系统主要实现了以下几个功能:登录、注销、写博客以及删除博客等功能。
登录功能:用户名以及密码是已经存在于数据库中的。登录成功后就会跳转到列表页面。在右上角存在主页和写博客两个按钮,但是在未登录情况下按下均只会跳转到登录页面。
列表页面:可以在列表页查看博客简介,其包括博客标题、发布时间以及内容概要。在左侧可以看到登录的用户以及文章数、分类数等的模块。在右上角有主页、写博客和注销三个功能:主页即列表页,写博客即博客编辑页,注销即注销用户,回到登录页面。
详情页面:在列表页面点击"查看全文"按钮就会跳转到详情页,此时就可以看到该篇博客的完整内容。在右上角同样有主页、写博客、删除和注销四个功能。
博客编辑页:在登录之后的任意界面点击"写博客"之后就会进入博客编辑页面,此时就可以进行博客的编写,点击"发布文章"后就可以成功发布文章,此时就会跳转到列表页。
设计测试用例
功能测试--自动化测试
测试代码
先指定在所有测试方法执行之前和所有方法执行之后的要执行的方法。
在所有测试方法前要执行的是登录博客网址,所有测试方法后要执行的是关闭该网页。
java
public class InitAndEndBrowser {
/**
* 打开博客网站
*/
@BeforeAll
static void SetUp() {
// 打开网页,博客列表的登录网址
webDriver.get("http://xxxxxxxxxx/blog_login.html");
}
/**
* 退出浏览器
*/
@AfterAll
static void TearDown() {
try {
// 休眠3秒
sleep(3000);
// 退出浏览器
webDriver.quit();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
登录测试
输入账号和密码,若登录成功,进入博客列表页,博客列表页有注销按钮。出现注销按钮即可说明登录成功。
java
/**
* 账号正确,密码正确登陆成功
*/
@Order(1)
@ParameterizedTest
@CsvSource(value = {"admin, 123456"})
void Login(String user_name, String passport) throws InterruptedException {
// 输入账号
webDriver.findElement(By.cssSelector("#username")).sendKeys(user_name);
// 输入密码
webDriver.findElement(By.cssSelector("#password")).sendKeys(passport);
// 点击登录按钮
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(3000);
// 如果页面出现注销按钮,此时说明登录成功
WebElement logout_button = webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)"));
Assertions.assertNotNull(logout_button);
}
博客详情页测试
java
/**
* 点击查看全文,成功跳转到博客详情页面
*/
@Order(2)
@ParameterizedTest
@ValueSource(strings = {"http://xxxxxxxxx/blog_system/blog_detail.html?blogId="})
void BlogListToBlogInfo(String expected_url) throws InterruptedException {
// 找到查看全文按钮(这里找到的是全部的查看全文按钮)
List<WebElement> review_all_blog_buttons = webDriver.findElements(By.xpath("//a[text()=\'查看全文 >>\']"));
// 点击第一个查看全文按钮
review_all_blog_buttons.get(0).click();
// 预期的url是http://42.192.83.143:8563/blog_system/blog_detail.html?blogId=xxx
String actual_url = webDriver.getCurrentUrl();
// 判断url是否是详情页url
if(actual_url.contains(expected_url)) {
System.out.println("测试通过,当前博客详情页地址是:" + actual_url);
} else {
System.out.println("测试不通过,当前页面地址是:" + actual_url);
}
sleep(3000);
}
发布博客测试
发布成功一条博客后会跳转到博客列表页面,检查博客列表页的第一条博客的标题是否和测试的博客标题一致即可。
java
/**
* 发布博客成功,跳转到博客列表页面
*/
@Order(3)
@ParameterizedTest
@CsvFileSource(resources = "test04.csv")
void EditBlogSimple( String expected_url) throws InterruptedException {
// 找到发布博客按钮,点击
webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
// 找到标题输入框,输入"自动化代码发布博客"
((JavascriptExecutor)webDriver).executeScript("document.getElementById(\"title\").value='自动化测试代码发布博客'");
sleep(3000);
webDriver.findElement(By.cssSelector("#submit")).click();
// 校验页面是不是跳转到博客列表页面
// 比较当前页面url是不是等于http://xxxxxxxx/blog_system/blog_list.html
// 如果相等,跳转页面正确
// 跳转页面不正确,测试不通过
String actual_url = webDriver.getCurrentUrl();
Assertions.assertEquals(expected_url, actual_url);
}
/**
* 检查博客列表中第一条博客标题是不是和自己发布的博客标题相等
*/
public static Stream<Arguments> GeneratorBlogTitle() {
return Stream.of(Arguments.arguments("#这个是自动化代码写的文章\n"));
}
@ParameterizedTest
@MethodSource("GeneratorBlogTitle")
@Order(4)
void CheckBlogTitle(String expected_blog_title) throws InterruptedException {
sleep(3000);
// 获取刚才代码发布的博客标题
String release_blog_title = webDriver.findElement(By.xpath("/html/body/div[2]/div[2]/div[1]/div[3]")).getText();
// 校验发布的博客标题,是不是和EditBlogSimple方法中发布的博客标题一样
Assertions.assertNotEquals(expected_blog_title, release_blog_title);
}
删除博客测试
java
/**
* 删除博客
*/
@Order(5)
@Test
void DeleteBlog() {
try {
// 点击查看全文
sleep(3000);
webDriver.findElement(By.xpath("/html/body/div[2]/div[2]/div[1]/a")).click();
sleep(3000);
// 点击删除按钮
webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(7)")).click();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
退出账号测试
退出账号后,成功的标志是用户名和密码为空。
java
/***
* 退出
*/
@Order(6)
@Test
void Logout() throws InterruptedException{
// 退出账号
webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();
sleep(3000);
// 获取用户名信息
String user_name = webDriver.findElement(By.cssSelector("#username")).getText();
// 获取密码信息
String pass_port = webDriver.findElement(By.cssSelector("#password")).getText();
// 退出后,用户名为空,测试通过,否则测试不通过
Assertions.assertEquals("", user_name);
// 退出后,密码为空,测试通过,否则测试不通过
Assertions.assertEquals("", pass_port);
}
以上,可以保证博客系统的基本功能正常。
性能测试
使用loadRunner进行简单性能测试:针对登录、编写并发布博客以及删除博客、注销等功能进行简单的性能测试。
然后在实现的过程中,插入集合点以及事务等,并通过设置来实现用户的并发操作。
对登录进行测试:
1.添加访问地址
2.通过开发者工具查看请求发送的格式,以此来进行性能测试脚本的编写
3.用户名以及密码可以有多个,可以进行参数化。
4.添加事务以及集合点、检查点:注意检查点一般放在请求之前。
5.设置迭代次数:为了能够更好地遍历到所有的参数。
6.脚本测试
7.设置并发数量进行性能测试,并导出测试报告以及图表
(1)设置10个虚拟用户
(2)在Controller中设置场景
(3)开始进行运行,性能测试(运行中和结束的截图)
(4)在Analysis中查看性能报告以及报表
① 报告
② 点击率
③ 吞吐量
④ 系统资源
分析系统资源:击率较大时,CPU利用率较高,这就是系统可以优化的一个方向。