基于博客系统的功能测试和性能测试

目录

项目介绍

项目功能

设计测试用例

功能测试--自动化测试

测试代码

登录测试

博客详情页测试

发布博客测试

删除博客测试

退出账号测试

性能测试


项目介绍


1.博客系统采用前后端分离的方法来实现,同时使用了数据库来存储相关的数据,同时将其部署到云服务器上。

2.前端主要有四个页面构成:登录页、列表页、详情页以及编辑页,以上模拟实现了最简单的个人博客系统。其结合后端实现了以下的主要功能:登录、编辑博客、注销、删除博客。

3.博客系统可以实现个人用户简单的博客记录,时间、标题、内容以及发布者等都可以进行详细地查看。

使用JUnit测试框架对博客系统进行功能测试。

项目功能


博客系统主要实现了以下几个功能:登录、注销、写博客以及删除博客等功能。

登录功能:用户名以及密码是已经存在于数据库中的。登录成功后就会跳转到列表页面。在右上角存在主页和写博客两个按钮,但是在未登录情况下按下均只会跳转到登录页面。


列表页面:可以在列表页查看博客简介,其包括博客标题、发布时间以及内容概要。在左侧可以看到登录的用户以及文章数、分类数等的模块。在右上角有主页、写博客和注销三个功能:主页即列表页,写博客即博客编辑页,注销即注销用户,回到登录页面。


详情页面:在列表页面点击“查看全文”按钮就会跳转到详情页,此时就可以看到该篇博客的完整内容。在右上角同样有主页、写博客、删除和注销四个功能。


博客编辑页:在登录之后的任意界面点击“写博客”之后就会进入博客编辑页面,此时就可以进行博客的编写,点击“发布文章”后就可以成功发布文章,此时就会跳转到列表页。

设计测试用例

功能测试--自动化测试

测试代码

先指定在所有测试方法执行之前和所有方法执行之后的要执行的方法。

在所有测试方法前要执行的是登录博客网址,所有测试方法后要执行的是关闭该网页。

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);
        }
    }
}

登录测试

输入账号和密码,若登录成功,进入博客列表页,博客列表页有注销按钮。出现注销按钮即可说明登录成功。

 /**
     * 账号正确,密码正确登陆成功
     */
    @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);
    }

博客详情页测试

/**
     * 点击查看全文,成功跳转到博客详情页面
     */
    @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);
    }

发布博客测试

发布成功一条博客后会跳转到博客列表页面,检查博客列表页的第一条博客的标题是否和测试的博客标题一致即可。

 /**
     * 发布博客成功,跳转到博客列表页面
     */
    @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);
    }

删除博客测试

 /**
     * 删除博客
     */
    @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());
        }
    }

退出账号测试

退出账号后,成功的标志是用户名和密码为空。

/***
     * 退出
     */
    @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利用率较高,这就是系统可以优化的一个方向。

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
易的功能特性】 新一代的 易集众多的新功能于一体,是一款名副其实的新一代的典型范例!无刷新的日历、评论、回访功能无不体现了AJAX在中的娴熟运用! 成熟的系统架构 专业的团队用专业的框架开发出的产品。基于微软的.Net 2.0,作者对OOP具有着深入的理解,并对.Net特性有着透彻的研究。易的系统架构和编码风格不能不说是OOP的设计典范! 方便的内容导入导出 易后台提供了内容的导入和导出功能,生成一个XML文件。便利地解决了搬家的麻烦! 先进的评论体系 评论是极为重要的组成部分,易用AJAX技术提供了一组先进的评论体系!该评论体系支持国别选择、发表评论支持实时预览、个性头像、聚合式评论……所有的这些都可以由管理员在后台做便捷的编辑调整! 无须数据库且支持多种数据库 默认采用基于 XML 的数据存储方式,此种方式提供几乎与静态网页相当的访问效率(避免了数据库并发查询的瓶颈)。同时也可以扩展支持SQL Server、Access等多种数据库存储方式。 独立页面发布功能 除了标准的日志,易还支持在线发布静态页面!这些页面是独立的,对发布各种信息尤为有用! 多用户支持 易对多用户共同创作、维护提供了全面的支持,易允许多个用户维护同一个。访问者可以订阅任意一个用户的RSS feed、仅关注他们感兴趣的某个用户的日志! 多语言支持 易支持多语言,您可以在全球任意地区的服务器上运行易,而不用担心服务器时间和本地时间存在时差的问题。 Trackback 和 Pingback 特性 易可以对所有链出的链接进行Track回溯和Ping回溯,您的链接将自动出现在您引用的的评论列表之中!提高您的链入指数、在无形之中推广了您的!每当创建一个新的日志,易就会自动完成PingTechnorati、Feedburner、Ping-o-Matic等操作! 灵活易用的插件机制 易采用了灵活强大的C#开发,架构十分先进成熟,她的插件机制也是如此。系统开放了事件定义,利用订阅事件能够使所开发的插件强大得如同系统程序本身一样! 酷炫主题支持 易为快速开发主题(模板、风格)提供了支持,用户只需要稍稍懂得HTML和CSS便可进行主题的制作!易的模板机制是基于.Net2.0的MasterPage的,这样,开发一套新的主题模板只需要修改3~5个文件即可完成!与此同时,易有专业的设计师为您免费提供更多的个性主题!此外,易还支持识别移动设备(如手机等)。能分别制定在用这些设备访问和用PC机访问时所用的主题模板! 符合 XHTML 易所用的控件全部符合XHTML 1.0标准。所有的日志都会在您发表时自动转换成符合标准的格式!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Roylelele

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值