博客系统自动化测试项目实践

文章目录

    • 一.测试需求分析
      • 1.功能分析
      • 2.非功能分析
    • 二.制定测试方案(计划 + 策略)
    • 三.编写测试用例
    • 四.执行自动化测试用例
    • 五.编写测试报告
    • 六.项目总结

一.测试需求分析

1.功能分析

通过功能测试需求分析
博客系统自动化测试项目实践_第1张图片

2.非功能分析

非功能分析主要从:界面,性能,安全性,兼容性,可维护性等来分析

  • 界面
    布局、排版美观,设计符合当下时代。
    界面的按键和跳转能够正常使用。
  • 性能
    跳转页面不超过 3 秒。执行业务逻辑不超过 3 秒。
  • 安全
    防止用户数据泄露,预防sql注入,病毒危害系统
  • 兼容
    保证在不同系统(macOS,Windows),不同终端设备(PC,移动),不同浏览器上系统能正常运转
  • 可维护
    方便后续修复和扩展系统功能

二.制定测试方案(计划 + 策略)

测试范围以及测试点
用户登录页面,注册页面,博客发布模块,博客删除模块,博客修改模块,博客主页模块。

测试方法: 自动化测试

测试所涉及的类型:功能,界面测试

三.编写测试用例

本次测试采用自动化测试主要对功能方面来进行测试用例的编写,通过前面对功能测试需求的分析,主要对六个功能模块来设计测试用例

四.执行自动化测试用例

自动化脚本如下:

package com.example.blog_test;

import lombok.SneakyThrows;
import org.assertj.core.data.Index;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
import org.openqa.selenium.*;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.springframework.boot.test.context.SpringBootTest;
import sun.security.util.Password;

import javax.swing.*;
import java.time.Duration;
import java.util.List;

import static java.lang.Thread.sleep;
import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest
public class ApplicationTest {
    /**
     * 测试登录模块
     */
    @Nested
    @Disabled
    public class LoginTest{
        @SneakyThrows
        @ParameterizedTest
        @CsvFileSource( files = "src/test/resources/TestSource/UserAcount.csv")
        void test(String name,String pwd)
        {
            Driver driver = new Driver();
            driver.MaxWindow();
            driver.get(PublicVariable.LoginUrl);
            //服务器性能太低 加载页面慢
            driver.Wait(5);
            //输入用户名账号
            WebElement UserName = driver.findElementByCss("#username");
            WebElement password = driver.findElementByCss("#password");
            UserName.sendKeys(name);
            password.sendKeys(pwd);
            //点击登录按钮
            WebElement button = driver.findElementByCss("#submit");
            button.click();

            //预期结果:跳转主页
//            WebDriverWait wait = new WebDriverWait(driver.getWebDriver(), Duration.ofSeconds(10)); // 设置等待时间为10秒
//            WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#app")));
            sleep(100);
            String CurUrl = driver.getUrl();
            assertEquals(CurUrl,PublicVariable.IndexUrl);
            //关闭窗口
            driver.quit();
        }
    }
    /**
     * 测试注册模块
     */
    @Nested
    @Disabled
    public class RegisterTest{
    }
    /**
     * 测试注销模块
     */
    @Nested
    @Disabled
    public class LogoutTest{
        @SneakyThrows
        @Test
        void test()
        {

            Driver driver = new Driver();
            //登录
            Tool.login(driver);
            //点击注销按钮
            WebElement LogOutBtn = driver.findElementByCss("#app > div > div > a:nth-child(8)");
            LogOutBtn.click();
            driver.confirm();
            sleep(1000);
            //预期结果: 导航栏 只有注册 登录 主页三个按钮
            List<WebElement> lists = driver.findElements("#app > div > div > a");
            assertEquals(lists.size(),3);
        }
    }
    /**
     * 测试博客发布模块
     */
    @Nested
    @Disabled
    public class ReleaseTest{
        @SneakyThrows
        @ParameterizedTest
        @CsvFileSource( files = "src/test/resources/TestSource/BlogDetail.csv")
       public void test(String title, String content)
        {

            Driver driver = new Driver();
            //登录
            Tool.login(driver);
            //获取导航栏元素列表
            List<WebElement> webElementList = driver.findElements("#app > div > div > a");
            //选取写博客功能元素
            WebElement target = null;
            for(int i = 0 ;i<webElementList.size();i++)
            {
                WebElement element = webElementList.get(i);
                if(element.getText().equals(Tool.Pub_blog))
                {
                    target = element;
                    continue;
                }
            }
            //进入博客发布页面 填写内容
            target.click();
            sleep(5000);
            WebElement Title = driver.findElementByCss("#add_title");
            Actions actions = new Actions(driver.getWebDriver());
            //输入内容
            actions.keyDown(Keys.CONTROL).sendKeys("a").keyUp(Keys.CONTROL).sendKeys(content).perform();
            //输入标题
            Title.sendKeys(title);
            //点击发布
            List<WebElement> lists = driver.findElements(".title > button");
            for(int i  =0;i<lists.size();i++)
            {
                WebElement element = lists.get(i);
                if(element.getText().equals("发布文章"))
                {
                    element.click();
                    sleep(1000);
                    driver.reject();
                    break;
                }
            }
            //预期结果:跳转到主我的博客页面 主页面第一篇文章为刚发布文章
            sleep(1000);
            String CurUrl = driver.getUrl();
            String IndexTitle = driver.findElementByCss("#app > div > section > div.el-scrollbar > div.el-scrollbar__wrap.el-scrollbar__wrap--hidden-default > div > section > section > main > section > header:nth-child(1) > header:nth-child(1) > h2").getText();
            String IndexContent = driver.findElementByCss("#app > div > section > div.el-scrollbar > div.el-scrollbar__wrap.el-scrollbar__wrap--hidden-default > div > section > section > main > section > main > span").getText();
            assertEquals(CurUrl,PublicVariable.MyBlogUrl);
            assertEquals(IndexTitle,title);
            assertEquals(IndexContent,content);
        }
    }
    /**
     * 测试博客删除模块
     */
    @Nested
    @Disabled
    public class DeleteTest{

        @Test
        void test()
        {

            Driver driver = new Driver();
            //先写入一篇文章
            Tool.pub_blog(driver,"测试","测试");
            //删除改文章
            List<WebElement> elements = driver.findElements("#app .el-main .el-main");
            WebElement el = elements.get(0);
            List<WebElement> lists = el.findElements(By.cssSelector("button"));
            for(int i = 0;i<lists.size();i++)
            {
                WebElement btn = lists.get(i);
                if(btn.getText().equals("删除文章"))
                {
                    btn.click();
                    driver.confirm();
                    break;
                }
            }
            //预期结果: 展台显示暂无内容
            WebElement h1 = driver.findElementByCss("h1");
            assertNotNull(h1);
            assertEquals(h1.getText(),"暂无内容");
        }
    }
    /**
     * 测试博客修改模块
     */
    @Nested
    @Disabled
    public class ModifyTest{
        @SneakyThrows
        @ParameterizedTest
        @CsvFileSource( files = "src/test/resources/TestSource/BlogDetail.csv")
        void test(String title,String content)
        {

            Driver driver = new Driver();
            //先写入一篇文章
            Tool.pub_blog(driver,"测试","测试");
            //修改文章
            List<WebElement> elements = driver.findElements("#app .el-main .el-main");
            WebElement el = elements.get(0);
            List<WebElement> lists = el.findElements(By.cssSelector("button"));
            for(int i = 0;i<lists.size();i++)
            {
                WebElement btn = lists.get(i);
                if(btn.getText().equals("修改文章"))
                {
                    btn.click();
                    break;
                }
            }
            sleep(100);
            //输入修改内容
            WebElement Title = driver.findElementByCss("#add_title");
            Actions actions = new Actions(driver.getWebDriver());
            //输入内容
            actions.keyDown(Keys.CONTROL).sendKeys("a").keyUp(Keys.CONTROL).sendKeys(content).perform();

            new Actions(driver.getWebDriver())
                    .click(Title)
                    .perform();
            //输入标题
            actions.keyDown(Keys.CONTROL).sendKeys("a").keyUp(Keys.CONTROL).sendKeys(title).perform();
            WebElement submitEl = driver.findElementByCss("#submit");
            submitEl.click();
            sleep(100);
            driver.reject();
            String CurUrl = driver.getUrl();
            sleep(500);
            //预期结果: 页面跳转到我的博客页面 且标题内容与修改相同
            String IndexTitle = driver.findElementByCss("#app > div > section > div.el-scrollbar > div.el-scrollbar__wrap.el-scrollbar__wrap--hidden-default > div > section > section > main > section > header:nth-child(1) > header:nth-child(1) > h2").getText();
            String IndexContent = driver.findElementByCss("#app > div > section > div.el-scrollbar > div.el-scrollbar__wrap.el-scrollbar__wrap--hidden-default > div > section > section > main > section > main > span").getText();
            assertEquals(CurUrl,PublicVariable.MyBlogUrl);
            assertEquals(IndexTitle,title);
            assertEquals(IndexContent,content);

        }
    }
    /**
     * 测试博客主页模块
     */
    @Nested

    public class IndexTest{
        @Test
        void test() {
            //插入多篇文章
            Tool.pub_blog(new Driver(), "测试", "测试");
            Tool.pub_blog(new Driver(), "测试", "测试");
            Driver driver  = new Driver();
            driver.MaxWindow();
            driver.get(PublicVariable.IndexUrl);
            WebElement pageNum = driver.findElementByCss("#app > div > section > div.pagination > div > ul > li");
            //预期结果 分页数目大于1
            assertNotEquals(Integer.parseInt(pageNum.getText()),1);
        }
    }

}

被测试项目源代码链接:https://github.com/911400586/Blog_System
自动化脚本源代码:https://github.com/911400586/Blog_Auto_Test

五.编写测试报告

点击下方连接查看详细测试报告
博客系统测试报告

六.项目总结

测试用例根据用户需求分析来设计,而且有整体框架,算是比较详细全面。
有待改善的地方:
系统中有一些模块的功能是类似的,导致设计测试用例的时候重复,略显冗余。
系统中的一些功能模块,设计出的测试用例覆盖率较低。

你可能感兴趣的:(JAVA,功能测试,自动化)