针对 博客系统 项目测试
过对 博客系统 项目做测试,使用Selenium 自动化套件 + JUnit 单元测试框架,来对项目的功能进行自动化测试。
项目的主要功能:登录,注册,博客列表主页面,博客列表个人页,编辑博客,修改博客,删除博客。
针对博客系统的测试用例
界面测试
易用性测试
性能测试
兼容性测试
安全性测试
功能测试
功能测试实现
工具类
AutotestUtils类设定为所有工具类的父类,封装了静态的浏览器对象及获取浏览器对象方法,以及对页面进行截图的方法,
public class AutotestUtils {
public static ChromeDriver driver;
//创建驱动对象
public static ChromeDriver createDriver(){
// 驱动对象已经创建好了/没有创建好
if(driver == null){
driver = new ChromeDriver();
//创建隐式等待
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
}
return driver;
}
//截图文件的时间
public List<String> getTime() {
SimpleDateFormat sim1 = new SimpleDateFormat("yyyyMMdd-HHmmssSS");
SimpleDateFormat sim2 = new SimpleDateFormat("yyyyMMdd");
String filename = sim1.format(System.currentTimeMillis());
String dirname = sim2.format(System.currentTimeMillis());
List<String> list = new ArrayList<>();
list.add(dirname);
list.add(filename);
return list;
}
/**
* 获取屏幕截图,将用例执行的结果保存下来
*/
public void getScreenShot(String str) throws IOException {
List<String> list = getTime();
String filename = "./src/test/java/com/blogWebAutoTest/"+list.get(0)+"/"+str+"_"+list.get(1)+".png";
File srcfile = driver.getScreenshotAs(OutputType.FILE);
//把屏幕截图生成的文件放到指定的路径
FileUtils.copyFile(srcfile,new File(filename));
}
}
登录页测试
/**
* 测试登录页面
*/
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogLoginTest extends AutotestUtils {
// 1.创建浏览器对象
public static ChromeDriver driver = createDriver();
// 2.访问登录页面的url
@BeforeAll
public static void baseControl() {
driver.get("http://124.220.57.89:8082/login.html");
}
/**
* 检查登录页面打开是否正确
* 检查点:用户名 密码 主页等元素是否存在
*/
@Test
@Order(1)
void loginPageLoadRight() throws IOException {
driver.findElement(By.cssSelector("body > div.login-container > div > div:nth-child(3) > span"));
driver.findElement(By.cssSelector("body > div.login-container > div > div:nth-child(4) > span"));
driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)"));
getScreenShot(getClass().getName());
}
/**
* 检查正常登录情况
* 测试环境使用 万能验证码BKXT
*/
@ParameterizedTest
@CsvSource({"admin,admin,BKXT","zhangsan,123,BKXT","lisi,123,BKXT"})
@Order(2)
void loginSuc(String name , String password, String checkcode) throws IOException, InterruptedException {
// 先对输入框内可能缓存的数据进行清空
driver.findElement(By.cssSelector("#username")).clear();
driver.findElement((By.cssSelector("#password"))).clear();
driver.findElement((By.cssSelector("#checkcode"))).clear();
//自动输入测试
driver.findElement((By.cssSelector("#username"))).sendKeys(name);
driver.findElement((By.cssSelector("#password"))).sendKeys(password);
driver.findElement((By.cssSelector("#checkcode"))).sendKeys(checkcode);
driver.findElement(By.cssSelector("#submit")).click();
//处理弹窗
Thread.sleep(2000);
Alert alert = driver.switchTo().alert();
alert.accept();
//对登录结果进行检测,如果跳转到了个人博客列表页即成功
driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)"));
getScreenShot(getClass().getName());
driver.navigate().back();
}
/**
* 检查错误账号密码登录情况
* 测试环境使用 万能验证码BKXT
*/
@ParameterizedTest
@CsvSource({"a,123,BKXT","b,123,BKXT","c,123,BKXT"})
@Order(3)
void loginFail(String name , String password, String checkcode) throws IOException, InterruptedException {
// 先对输入框内可能缓存的数据进行清空
driver.findElement(By.cssSelector("#username")).clear();
driver.findElement((By.cssSelector("#password"))).clear();
driver.findElement((By.cssSelector("#checkcode"))).clear();
//自动输入测试
driver.findElement((By.cssSelector("#username"))).sendKeys(name);
driver.findElement((By.cssSelector("#password"))).sendKeys(password);
driver.findElement((By.cssSelector("#checkcode"))).sendKeys(checkcode);
driver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(2000);
//处理弹窗
driver.switchTo().alert().accept();
}
// 账号为空
@Test
@Order(4)
void noUser() throws InterruptedException {
driver.findElement(By.cssSelector("#username")).clear();
driver.findElement((By.cssSelector("#password"))).clear();
driver.findElement((By.cssSelector("#checkcode"))).clear();
driver.findElement((By.cssSelector("#password"))).sendKeys("abc");
driver.findElement((By.cssSelector("#checkcode"))).sendKeys("BKXT");
driver.findElement(By.cssSelector("#submit")).click();
//处理弹窗
Thread.sleep(2000);
driver.switchTo().alert().accept();
}
//密码为空
@Test
@Order(5)
void noPassword() throws InterruptedException {
driver.findElement(By.cssSelector("#username")).clear();
driver.findElement((By.cssSelector("#password"))).clear();
driver.findElement((By.cssSelector("#checkcode"))).clear();
driver.findElement((By.cssSelector("#username"))).sendKeys("abc");
driver.findElement((By.cssSelector("#checkcode"))).sendKeys("BKXT");
driver.findElement(By.cssSelector("#submit")).click();
//处理弹窗
Thread.sleep(2000);
driver.switchTo().alert().accept();
}
//验证码为空
@Test
@Order(6)
void noCheckcode() throws InterruptedException {
driver.findElement(By.cssSelector("#username")).clear();
driver.findElement((By.cssSelector("#password"))).clear();
driver.findElement((By.cssSelector("#checkcode"))).clear();
driver.findElement((By.cssSelector("#username"))).sendKeys("abc");
driver.findElement((By.cssSelector("#password"))).sendKeys("dd");
driver.findElement(By.cssSelector("#submit")).click();
//处理弹窗
Thread.sleep(2000);
driver.switchTo().alert().accept();
}
}
注册页测试
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogLogonTest extends AutotestUtils {
// 1.创建浏览器对象
public static ChromeDriver driver = createDriver();
@BeforeAll
public static void baseControl() {
driver.get("http://124.220.57.89:8082/login.html");
}
/*
完成跳转到注册页面操作
*/
@Test
@Order(1)
public void start() {
driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
}
/*
跳转到注册页后,检查注册页的元素
*/
@Test
@Order(2)
public void logonPageLoadRight() throws IOException {
driver.findElement(By.cssSelector("body > div.login-container > div > div:nth-child(2) > span"));
driver.findElement(By.cssSelector("body > div.login-container > div > div:nth-child(3) > span"));
driver.findElement(By.cssSelector("body > div.login-container > div > div:nth-child(4) > span"));
driver.findElement(By.cssSelector("body > div.login-container > div > div.row1 > span"));
getScreenShot(getClass().getName());
}
/*
测试正确的注册功能,输入账号和两次密码相同的注册
*/
@ParameterizedTest
@CsvSource(value = {"333,123,123,BKXT", "333,123,123,BKXT"})
@Order(3)
public void logonSuc(String username, String password1, String password2, String checkCode) throws InterruptedException {
//先对输入框里可能有的数据进行清空
driver.findElement(By.cssSelector("#username")).clear();
driver.findElement(By.cssSelector("#password")).clear();
driver.findElement(By.cssSelector("#password2")).clear();
driver.findElement(By.cssSelector("#checkcode")).clear();
//测试要测试的数据
driver.findElement(By.cssSelector("#username")).sendKeys(username);
driver.findElement(By.cssSelector("#password")).sendKeys(password1);
driver.findElement(By.cssSelector("#password2")).sendKeys(password2);
driver.findElement(By.cssSelector("#checkcode")).sendKeys(checkCode);
driver.findElement(By.cssSelector("#submit")).click();
//处理弹窗
Thread.sleep(3000);
driver.switchTo().alert().accept();
Thread.sleep(3000);
driver.switchTo().alert().dismiss();
}
/*
测试两次密码不一致的注册
*/
@ParameterizedTest
@CsvSource(value = {"nnn,123,321,BKXT","vvv,123,321,BKXT"})
@Order(4)
public void logonFail(String username, String password1, String password2, String checkCode) throws InterruptedException {
//先对输入框里可能有的数据进行清空
driver.findElement(By.cssSelector("#username")).clear();
driver.findElement(By.cssSelector("#password")).clear();
driver.findElement(By.cssSelector("#password2")).clear();
driver.findElement(By.cssSelector("#checkcode")).clear();
//测试要测试的数据
driver.findElement(By.cssSelector("#username")).sendKeys(username);
driver.findElement(By.cssSelector("#password")).sendKeys(password1);
driver.findElement(By.cssSelector("#password2")).sendKeys(password2);
driver.findElement(By.cssSelector("#checkcode")).sendKeys(checkCode);
driver.findElement(By.cssSelector("#submit")).click();
//处理弹窗
Thread.sleep(3000);
driver.switchTo().alert().accept();
Thread.sleep(3000);
}
}
博客列表个人页测试
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogListPersonalTest extends AutotestUtils {
// 1.创建浏览器对象
public static ChromeDriver driver = createDriver();
// 2.访问登陆页面的url
@BeforeAll
public static void baseControll(){
driver.get("http://124.220.57.89:8082/login.html");
}
// 3. 跳转到博客列表个人列表页
@ParameterizedTest
@CsvSource(value = {"admin,admin,BKXT"})
@Order(1)
public void start(String username, String password, String checkCode) throws InterruptedException, IOException {
// 先对输入框内可能缓存的数据进行清空
driver.findElement(By.cssSelector("#username")).clear();
driver.findElement((By.cssSelector("#password"))).clear();
driver.findElement((By.cssSelector("#checkcode"))).clear();
//自动输入测试
driver.findElement((By.cssSelector("#username"))).sendKeys(username);
driver.findElement((By.cssSelector("#password"))).sendKeys(password);
driver.findElement((By.cssSelector("#checkcode"))).sendKeys(checkCode);
driver.findElement(By.cssSelector("#submit")).click();
//处理弹窗
Thread.sleep(2000);
Alert alert = driver.switchTo().alert();
alert.accept();
//对登录结果进行检测,如果跳转到了个人博客列表页即成功
driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)"));
getScreenShot(getClass().getName());
}
// 4.在博客个人列表页完成相关操作
@Test
@Order(2)
public void passageCheck() {
// 点击查看全文操作
driver.findElement(By.cssSelector("#artlistDiv > div:nth-child(1) > div:nth-child(4) > a:nth-child(2)")).click();
// 进入文章详情页,对比页面元素
driver.findElement(By.cssSelector("#title"));
// 返回博客列表页,点击修改操作
driver.navigate().back();
driver.findElement(By.cssSelector("#artlistDiv > div:nth-child(1) > div:nth-child(4) > a:nth-child(1)")).click();
// 对比修改页面的元素
driver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button"));
driver.navigate().back();
}
// 5. 在个人博客列表页完成写博客测试
@Test
@Order(3)
public void passageEditCheck() throws IOException {
// 点击写博客
driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
// 对比写博客页面的元素
String curText = driver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).getText();
Assertions.assertEquals("发布文章",curText);
getScreenShot(getClass().getName());
}
// 6. 测试发布博客功能是否正常
@Test
@Order(4)
public void passageSumbit() throws InterruptedException {
String title = "测试标题";
driver.findElement(By.cssSelector("#title")).sendKeys(title);
// 点击发布按钮
driver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click();
// 处理弹窗
Thread.sleep(2000);
driver.switchTo().alert().accept();
}
}
博客列表主页测试
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogListPublicTest extends AutotestUtils {
// 1.创建浏览器操作对象
public static ChromeDriver driver = createDriver();
// 2.直接访问公共博客列表页
@BeforeAll
public static void baseControll() {
driver.get("http://124.220.57.89:8082/blog_list.html");
}
// 3. 比较公共博客列表页的元素
@Test
@Order(1)
public void publicListPageLoadRight() throws IOException {
driver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(1)"));
driver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(2)"));
driver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(3)"));
driver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(4)"));
getScreenShot(getClass().getName());
}
}
浏览器对象退出类
public class driverQuitTest extends AutotestUtils {
public static ChromeDriver driver = createDriver();
@Test
public void driverQuit(){
driver.quit();
}
}
测试套件
@Suite
@SelectClasses({BlogLoginTest.class, BlogLogonTest.class,BlogListPersonalTest.class,BlogListPublicTest.class})
public class runSuite {
}
测试结果: