作者:爱塔居
专栏:测试
目录
一、项目背景介绍
二、项目功能
三、测试计划
3.1自动化测试用例
3.2 性能测试 (未完)
一、项目背景介绍
个人博客系统前端由注册页、登录页、列表页、详情页、编辑页、个人博客列表页构成,结合后端实现了注册、登录、添加博客、删除博客、查看博客、修改博客、强制登录等功能。
部署链接:http://124.223.101.247:8080/login.html
项目源码:https://gitee.com/lao-chen-a/javacode/tree/master/myblog-sm/src/main
二、项目功能
1.注册功能:需要输入用户名,还有密码以及确认密码进行注册,密码和确认密码必须保持一致,进行注册后,会自动跳转到登录页面。
2.登录功能:虽然主页右上角有主页和注册按钮,但在未登录的情况,只能注册和登录
3.个人博客列表页:可以在个人博客列表页上查看博客标题、发布时间、简介信息,每篇博客下方都有查看全文、修改、删除按钮等。页面的右上角有三个按钮,点击主页就会跳转到列表页,点击写博客就会跳转到编辑页,点击注销就会退出登录。
4.博客列表页:在博客列表页,可以看到所有用户的文章,运用了分页功能,每一页仅显示两篇文章。
5.详情页:在个人博客列表页、博客列表页点击“查看全文”按钮,就会跳转到详情页,此刻就可以看到该篇博客的完整内容,包括发布时间和阅读量。在左边,我们还可以看到作者的一些信息。
三、测试计划
3.1自动化测试用例
自动化测试总代码:https://gitee.com/lao-chen-a/javacode/commit/8d2f0900dbd37e4e48da826512d392341547ec52
我是分成几个页面(功能)进行测试,其中Screen文件存放的是截屏的方法。通过这个方法,我们得到测试结果后会自动截屏存放到target包中。 利用时间的命名方式,使得文件名不会重复。
Screen.java
package Blog;
import org.apache.commons.io.FileUtils;
import org.junit.jupiter.api.*;
import org.openqa.selenium.*;
import java.io.File;
import java.io.IOException;
import static java.lang.Thread.sleep;
import static org.junit.jupiter.api.Assertions.assertEquals;
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class Screen {
public void taskScreenShot(WebDriver webDriver){
long date = System.currentTimeMillis();
String path = String.valueOf(date);
String cusPath = System.getProperty("user.dir");
path = path+".png";
String screenPath = cusPath+"/"+path;
System.out.println(screenPath);
//实现截图
File file = ((TakesScreenshot) webDriver).getScreenshotAs(OutputType.FILE);
try {
FileUtils.copyFile(file,new File(screenPath));
}catch (IOException e){
e.printStackTrace();
}
}
}
RegTests.java
package Blog;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class RegTests {
@Test
public void regSuccess(){
WebDriver webDriver=new ChromeDriver();
webDriver.get("http://124.223.101.247:8080/reg.html");
webDriver.findElement(By.cssSelector("#username")).sendKeys("XiaoChen2");
webDriver.findElement(By.cssSelector("#password")).sendKeys("12345");
webDriver.findElement(By.cssSelector("#password2")).sendKeys("12345");
webDriver.findElement(By.cssSelector("#submit")).click();
// webDriver.get("http://124.223.101.247:8080/login.html");
// webDriver.findElement(By.cssSelector("#username")).sendKeys("XiaoChen2");
// webDriver.findElement(By.cssSelector("#password")).sendKeys("12345");
// webDriver.findElement(By.cssSelector("#submit")).click();
webDriver.quit();
}
//用户名为空
@Test
public void regFalse1(){
WebDriver webDriver=new ChromeDriver();
webDriver.get("http://124.223.101.247:8080/reg.html");
webDriver.findElement(By.cssSelector("#username")).sendKeys("");
webDriver.findElement(By.cssSelector("#password")).sendKeys("12345");
webDriver.findElement(By.cssSelector("#password2")).sendKeys("12345");
webDriver.findElement(By.cssSelector("#submit")).click();
System.out.println(webDriver.switchTo().alert().getText());
webDriver.quit();
}
//密码为空
@Test
public void regFalse2(){
WebDriver webDriver=new ChromeDriver();
webDriver.get("http://124.223.101.247:8080/reg.html");
webDriver.findElement(By.cssSelector("#username")).sendKeys("XiaoChen");
webDriver.findElement(By.cssSelector("#password")).sendKeys("");
webDriver.findElement(By.cssSelector("#password2")).sendKeys("12345");
webDriver.findElement(By.cssSelector("#submit")).click();
System.out.println(webDriver.switchTo().alert().getText());
webDriver.quit();
}
//确认密码为空
@Test
public void regFalse3(){
WebDriver webDriver=new ChromeDriver();
webDriver.get("http://124.223.101.247:8080/reg.html");
webDriver.findElement(By.cssSelector("#username")).sendKeys("XiaoChen");
webDriver.findElement(By.cssSelector("#password")).sendKeys("12345");
webDriver.findElement(By.cssSelector("#password2")).sendKeys("");
webDriver.findElement(By.cssSelector("#submit")).click();
System.out.println(webDriver.switchTo().alert().getText());
webDriver.quit();
}
//密码和确认密码不一致
@Test
public void regFalse4(){
WebDriver webDriver=new ChromeDriver();
webDriver.get("http://124.223.101.247:8080/reg.html");
webDriver.findElement(By.cssSelector("#username")).sendKeys("XiaoChen");
webDriver.findElement(By.cssSelector("#password")).sendKeys("12345");
webDriver.findElement(By.cssSelector("#password2")).sendKeys("123");
webDriver.findElement(By.cssSelector("#submit")).click();
System.out.println(webDriver.switchTo().alert().getText());
webDriver.quit();
}
}
LoginTests
package Blog;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import static java.lang.Thread.sleep;
public class LoginTests extends Screen {
//账号密码正确
@Test
void LoginSuccess() throws InterruptedException {
WebDriver webDriver=new ChromeDriver();
webDriver.get("http://124.223.101.247:8080/login.html");
sleep(300);
webDriver.findElement(By.cssSelector("#username")).sendKeys("chen");
webDriver.findElement(By.cssSelector("#password")).sendKeys("12");
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(300);
String cur_url=webDriver.getCurrentUrl();
Assertions.assertEquals("http://124.223.101.247:8080/myblog_list.html",cur_url);
taskScreenShot(webDriver);
webDriver.quit();
}
//账号密码不正确
@Test
public void loginFalse1() throws InterruptedException {
WebDriver webDriver=new ChromeDriver();
webDriver.get("http://124.223.101.247:8080/login.html");
webDriver.findElement(By.cssSelector("#username")).sendKeys("chen");
webDriver.findElement(By.cssSelector("#password")).sendKeys("12345");
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(300);
System.out.println(webDriver.switchTo().alert().getText());
webDriver.switchTo().alert().accept();
taskScreenShot(webDriver);
webDriver.quit();
}
//测试账号为空
@Test
public void loginFalse2() throws InterruptedException {
WebDriver webDriver=new ChromeDriver();
webDriver.get("http://124.223.101.247:8080/login.html");
webDriver.findElement(By.cssSelector("#username")).sendKeys("");
webDriver.findElement(By.cssSelector("#password")).sendKeys("12345");
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(300);
System.out.println(webDriver.switchTo().alert().getText());
webDriver.switchTo().alert().accept();
webDriver.quit();
}
@Test
public void loginFalse3() throws InterruptedException {
WebDriver webDriver=new ChromeDriver();
webDriver.get("http://124.223.101.247:8080/login.html");
webDriver.findElement(By.cssSelector("#username")).sendKeys("chen");
webDriver.findElement(By.cssSelector("#password")).sendKeys("");
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(300);
System.out.println(webDriver.switchTo().alert().getText());
webDriver.switchTo().alert().accept();
webDriver.quit();
}
//测试回车键
@Test
public void loginFalse4() throws InterruptedException {
WebDriver webDriver=new ChromeDriver();
webDriver.get("http://124.223.101.247:8080/login.html");
webDriver.findElement(By.cssSelector("#username")).sendKeys("chen");
webDriver.findElement(By.cssSelector("#password")).sendKeys("12");
webDriver.findElement(By.cssSelector("#password")).sendKeys(Keys.ENTER);
sleep(300);
String cur_url=webDriver.getCurrentUrl();
Assertions.assertEquals("http://124.223.101.247:8080/login.html",cur_url);
webDriver.quit();
}
}
MyblogListTests
package Blog;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import static java.lang.Thread.sleep;
public class MyblogLitsTests extends Screen {
//测试删除键是否可用
@Test
void DeleteButton() throws InterruptedException {
WebDriver webDriver=new ChromeDriver();
webDriver.get("http://124.223.101.247:8080/login.html");
sleep(300);
webDriver.findElement(By.cssSelector("#username")).sendKeys("chen");
webDriver.findElement(By.cssSelector("#password")).sendKeys("12");
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(300);
webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > a:nth-child(6)")).click();
taskScreenShot(webDriver);
webDriver.quit();
}
@Test
void DetailButton() throws InterruptedException {
WebDriver webDriver=new ChromeDriver();
webDriver.get("http://124.223.101.247:8080/login.html");
sleep(300);
webDriver.findElement(By.cssSelector("#username")).sendKeys("chen");
webDriver.findElement(By.cssSelector("#password")).sendKeys("12");
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(300);
webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > a:nth-child(4)")).click();
taskScreenShot(webDriver);
webDriver.quit();
}
@Test
void ModifyButton() throws InterruptedException {
WebDriver webDriver=new ChromeDriver();
webDriver.get("http://124.223.101.247:8080/login.html");
sleep(300);
webDriver.findElement(By.cssSelector("#username")).sendKeys("chen");
webDriver.findElement(By.cssSelector("#password")).sendKeys("12");
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(300);
webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > a:nth-child(5)")).click();
taskScreenShot(webDriver);
webDriver.quit();
}
}
QuiteTests
package Blog;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import static java.lang.Thread.sleep;
public class QuiteTests extends Screen {
@Test
void quite() throws InterruptedException {
WebDriver webDriver = new ChromeDriver();
webDriver.get("http://124.223.101.247:8080/login.html");
sleep(300);
webDriver.findElement(By.cssSelector("#username")).sendKeys("chen");
webDriver.findElement(By.cssSelector("#password")).sendKeys("12");
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(300);
webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();
webDriver.switchTo().alert().accept();
taskScreenShot(webDriver);
}
}
3.2 性能测试
首先了解一点点概念。
性能测试定义:测试人员借助性能测试工具,模拟系统在不同场景下,对应的性能指标是否达到预期。
性能测试和功能测试的区别:
功能测试:依靠人工执行
性能测试:依靠工具完成
功能测试:不管在什么场景下,只要能够正常运行即可
性能测试:软件在一些极端的情况下,是不是能够完成运行
影响一个软件性能因素有哪些?
硬件:服务器CPU利用率、内存、磁盘操作频率、CPU核心数
软件:算法、编程语言
用户:用户数量、用户使用时长、用户访问频率
面试题:你在做性能测试的时候,关注哪些指标?
并发用户数、响应时间/平均响应时间、事务响应时间、每秒事务通过数、点击率、吞吐量、思考时间、资源利用率
性能测试分类:
1.基准性能测试:让系统在正常情况下运行,观察软件性能指标(应用场景:软件刚上线需要性能摸底)
2.负载性能测试:验证软件在一定的压力情况下运行,观察性能指标是否出现了拐点
3.压力性能测试:系统处于饱和情况下,观察系统性能指标
4.可靠性能测试 :验证系统在一个持续的时间段内运行,在这个运行时间段,观察系统的性能指标
执行流程:需求分析->测试计划->选择一款性能测试工具->性能测试脚本编写->执行性能测试脚本
性能瓶颈是一定有的,只能不断优化。
我用的性能测试工具是LoadRunner,以下是LoadRunner的三大组件。
VUG:录制脚本
Controller:设计场景,运行场景
Analysis:产生性能测试报告
在loadrunner文件下载路径,找到WebTours文件夹,里面有一个文件名为StarServer.bat,双击进去,
接下来,又在WebTours下面找到conf文件夹里,能找到 httpd.conf文件。
在360浏览器中打开链接。
我们可以注册账号。在安装路径下WebTours文件夹下cgi-bin文件夹下users文件夹下会存放我们的账号密码。
打开VUG