博客项目测试

针对 博客系统 项目测试

过对 博客系统 项目做测试,使用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 {
}

测试结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当前课程中博客项目的实战源码是我在 GitHub上开源项目 My-Blog,目前已有 3000 多个 star:本课程是一个 Spring Boot 技术栈的实战类课程,课程共分为 3 大部分,前面两个部分为基础环境准备和相关概念介绍,第三个部分是 Spring Boot 个人博客项目功能的讲解,通过本课程的学习,不仅仅让你掌握基本的 Spring Boot 开发能力以及 Spring Boot 项目的大部分开发使用场景,同时帮你提前甄别和处理掉将要遇到的技术难点,认真学完这个课程后,你将会对 Spring Boot 有更加深入而全面的了解,同时你也会得到一个大家都在使用的博客系统源码,你可以根据自己的需求和想法进行改造,也可以直接使用它来作为自己的个人网站,这个课程一定会给你带来巨大的收获。作者寄语本课程录制于 2020 年,代码基于 Spring Boot 2.x 版本。到目前为止,Spring Boot 技术栈也有一些版本升级,比如 Spring Boot 2.7 发版、Spring Boot 3.x 版本发布正式版本。对于这些情况,笔者会在本课程实战项目的开源仓库中创建不同的代码分支,保持实战项目的源码更新,保证读者朋友们不会学习过气的知识点。课程特色 课程内容紧贴 Spring Boot 技术栈,涵盖大部分 Spring Boot 使用场景。开发教程详细完整、文档资源齐全、实验过程循序渐进简单明了。实践项目页面美观且实用,交互效果完美。包含从零搭建项目、以及完整的后台管理系统和博客展示系统两个系统的功能开发流程。技术栈新颖且知识点丰富,学习后可以提升大家对于知识的理解和掌握,对于提升你的市场竞争力有一定的帮助。实战项目预览    
对于个人博客项目测试用例编写,可以考虑以下几个方面: 1. 用户登录测试: - 输入正确的用户名和密码,验证是否成功登录。 - 输入错误的用户名或密码,验证是否登录失败。 2. 文章发布测试: - 输入正确的标题、内容和标签,验证是否成功发布文章。 - 留空标题、内容或标签,并尝试发布文章,验证是否提示相关错误信息。 3. 文章编辑测试: - 选择一篇已存在的文章进行编辑,修改标题、内容或标签,验证是否成功保存修改。 - 尝试编辑不存在的文章,验证是否提示相关错误信息。 4. 文章删除测试: - 选择一篇已存在的文章进行删除,验证是否成功删除。 - 尝试删除不存在的文章,验证是否提示相关错误信息。 5. 评论功能测试: - 发表一条评论并验证是否成功显示在相应的文章页面。 - 删除已存在的评论并验证是否成功删除。 6. 用户权限测试: - 普通用户尝试进行管理员权限的操作(如发布文章、编辑其他用户的文章),验证是否提示相关错误信息。 7. 前端页面测试: - 验证页面跳转是否正常,如登录后跳转到用户个人主页、点击文章链接跳转到文章详情页等。 - 验证页面元素的展示和样式是否符合设计要求。 8. 数据库操作测试: - 针对各个功能模块进行数据的增删改查操作,验证数据库操作是否正确。 以上是一些基本的测试用例,根据博客项目的具体功能和需求,还可以进行更详细和深入的测试设计。在编写测试用例时,需要考虑各种边界情况和异常情况,并确保测试覆盖率较高,以提高项目的质量和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值