开发者社区测试报告(功能测试+性能测试)

发布于:2025-03-07 ⋅ 阅读:(28) ⋅ 点赞:(0)

功能测试

测试相关用例

开发者社区功能背景

在当今数字化时代,编程已经成为一项核心技能,越来越多的人开始学习编程,以适应快速变化的科技 环境。基于这一需求,我设计开发了一个类似博客的论坛系统,专注于方便程序员与学习编程者之间的交流和 学习,旨在创建一个开放、友好且充满活力的社区。

测试用例思维导图

测试页面

以下是要测试的页面:

页面排版渲染与需求一致,同时按钮能够进行正确点击

登录页面

注册页面

主界面

用户个人信息

帖子详情

短信页面

测试用例

设置了部分基础的测试用例,尽可能的全覆盖,这里只展示部分用例(篇幅有限)

登录界面

  • 正确输入用户名和密码

  • 输入密码为空

注册页面

  • 正确注册

  • 用户名为空

  • 用户已存在

  • 密码为空

个人页面

  • 邮箱修改失败

  • 电话号码失败

  • 密码修改失败

帖子页面

  • 创建帖子失败

  • 回复帖子失败

站内信页面

回复失败

代码编写

基础配置

先进行驱动配置以及截图配置

public class InitUtils {
    public static WebDriver webDriver ;
    public static WebDriver createDriver(){
        if(webDriver==null){
            System.setProperty("webdriver.chrome.driver", "C:\\学习使我快乐\\测试\\demo\\chromedriver-win64\\chromedriver.exe");
            ChromeOptions options = new ChromeOptions();
            options.addArguments("--remote-allow-origins=*");
            webDriver=new ChromeDriver(options);
            webDriver.manage().timeouts().implicitlyWait(Duration.ofMillis(5));
        }
        return webDriver;
    }

    public InitUtils(String url){
        webDriver = createDriver();
        webDriver.get(url);
    }

    //截图
    public static void getImage(String str) throws IOException {
        SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat sim2 = new SimpleDateFormat("HH_mm_ss_SSS");
        String dirTime = sim1.format(System.currentTimeMillis());
        String pngTime = sim2.format(System.currentTimeMillis());

        //名字
        String fileName = "./src/test/image/"+dirTime+"/"+str+"_"+pngTime+".png";

        File file = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
        FileUtils.copyFile(file,new File(fileName));
    }
}

登录页面

public class LoginPageTest extends InitUtils {
    public static String url = "http://127.0.0.1:58080/sign-in.html";

    public LoginPageTest() {
        super(url);
    }

    //登录成功
    public void LoginSuc() throws InterruptedException, IOException {
        String str = Thread.currentThread().getStackTrace()[1].getMethodName();
        //先找到输入框,输入正确的用户名和密码
        getImage(str);//用方法名进行命名
        Thread.sleep(2000);
        webDriver.findElement(By.cssSelector("#username")).sendKeys("小明");
        webDriver.findElement(By.cssSelector("#password")).sendKeys("123123");
        webDriver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(2000);
        getImage(str);
        //webDriver.quit();
    }

    //退出登录
    public void logout() throws IOException {
        String str = Thread.currentThread().getStackTrace()[1].getMethodName();
        getImage(str);
        webDriver.findElement(By.cssSelector("#index_nav_avatar")).click();
        getImage(str);
        webDriver.findElement(By.cssSelector("#index_user_logout")).click();
        getImage(str);
        //webDriver.quit();
    }

    //登录失败
    public void LoginFail() throws IOException, InterruptedException {
        String str = Thread.currentThread().getStackTrace()[1].getMethodName();
        //先找到输入框,输入错误的用户名和密码
        getImage(str);
//        webDriver.findElement(By.cssSelector("#username")).sendKeys("小明");
//        webDriver.findElement(By.cssSelector("#password")).sendKeys("123456111");
        webDriver.findElement(By.cssSelector("#username")).sendKeys("");
        webDriver.findElement(By.cssSelector("#password")).sendKeys("");
        webDriver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(2000);
        getImage(str);
        //webDriver.quit();
    }
}

注册页面

public class RegisterTest extends InitUtils {
    public static String url = "http://127.0.0.1:58080/sign-up.html";
    public RegisterTest() {
        super(url);
    }

    //注册成功
    public void registerSuc() throws IOException, InterruptedException {
        String str = Thread.currentThread().getStackTrace()[1].getMethodName();
        getImage(str);
        Thread.sleep(2000);
        webDriver.findElement(By.cssSelector("#username")).sendKeys("小喜");
        webDriver.findElement(By.cssSelector("#nickname")).sendKeys("happiness");
        webDriver.findElement(By.cssSelector("#password")).sendKeys("123456");
        webDriver.findElement(By.cssSelector("#passwordRepeat")).sendKeys("123456");
        webDriver.findElement(By.cssSelector("#policy")).click();
        Thread.sleep(2000);
        getImage(str);
        webDriver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(2000);
        getImage(str);
        //webDriver.quit();
    }

    //注册失败
    public void fail() throws IOException, InterruptedException {
        String str = Thread.currentThread().getStackTrace()[1].getMethodName();
        getImage(str);
        //webDriver.findElement(By.cssSelector("#username")).sendKeys("");//用户名为空
        //webDriver.findElement(By.cssSelector("#username")).sendKeys("小明");//用户名重复
        webDriver.findElement(By.cssSelector("#username")).sendKeys("明明");
        webDriver.findElement(By.cssSelector("#nickname")).sendKeys("mingming");
        //webDriver.findElement(By.cssSelector("#password")).sendKeys("");//密码为空
        //webDriver.findElement(By.cssSelector("#password")).sendKeys("123");//密码小于6位
        webDriver.findElement(By.cssSelector("#password")).sendKeys("123456");
        //webDriver.findElement(By.cssSelector("#passwordRepeat")).sendKeys("123");//两次密码输入不一样
        webDriver.findElement(By.cssSelector("#passwordRepeat")).sendKeys("123456");
        //不点击同意信息
        //webDriver.findElement(By.cssSelector("#policy")).click();
        Thread.sleep(2000);
        getImage(str);
        webDriver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(2000);
        getImage(str);
    }
}

帖子页面

public class ListPageTest extends InitUtils {
    public static String url = "http://127.0.0.1:58080/index.html";
    public ListPageTest() {
        super(url);
    }

    //点击帖子
    public void listDetail() throws IOException {
        String str = Thread.currentThread().getStackTrace()[1].getMethodName();
        getImage(str);
        webDriver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong")).click();
        //因为是外部的文件 MD输入,所以一般是找不到的
        webDriver.findElement(By.cssSelector("#article_details_reply > div.CodeMirror.cm-s-default.CodeMirror-wrap.CodeMirror-empty > div.CodeMirror-scroll")).sendKeys("这是自动化测试内容");
        getImage(str);
        webDriver.findElement(By.cssSelector("#details_btn_article_reply")).click();
        getImage(str);
        //webDriver.quit();
    }

    //点击板块
    public void listBoard() throws IOException, InterruptedException {
        String str = Thread.currentThread().getStackTrace()[1].getMethodName();
        getImage(str);
        webDriver.findElement(By.cssSelector("#topBoardList > li:nth-child(5) > a > span.nav-link-title")).click();
        Thread.sleep(2000);
        getImage(str);
        webDriver.findElement(By.cssSelector("#topBoardList > li:nth-child(8) > a > span.nav-link-title")).click();
        Thread.sleep(2000);
        getImage(str);
        webDriver.quit();
    }

    //发布新帖子
    public void createNewText() throws IOException, InterruptedException{
        String str = Thread.currentThread().getStackTrace()[1].getMethodName();
        webDriver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none > div > div > div.col-auto.ms-auto.d-print-none > div > a.btn.btn-primary.d-none.d-sm-inline-block.article_post")).click();
        getImage(str);
        webDriver.findElement(By.cssSelector("#article_post_borad > option:nth-child(6)")).click();//选择板块
        webDriver.findElement(By.cssSelector("#article_post_title")).sendKeys("自动化测试");
        Thread.sleep(2000);
        webDriver.findElement(By.cssSelector("#edit-article > div.CodeMirror.cm-s-default.CodeMirror-wrap.CodeMirror-empty > div.CodeMirror-scroll")).sendKeys("自动化测试内容");
        Thread.sleep(2000);
        getImage(str);
        webDriver.findElement(By.cssSelector("#article_post_submit")).click();
        Thread.sleep(2000);
        getImage(str);
        webDriver.quit();
    }
}

用户页面

public class UserTest extends InitUtils {
    //用户有两个页面,所以需要进行跳转
    public static String url="http://127.0.0.1:58080/index.html";
    public UserTest() {
        super(url);
    }

    //获取当前用户帖子
    public void myText() throws InterruptedException, IOException {
        String str = Thread.currentThread().getStackTrace()[1].getMethodName();
        getImage(str);
        Thread.sleep(2000);
        webDriver.findElement(By.cssSelector("#index_nav_avatar")).click();
        webDriver.findElement(By.cssSelector("#index_user_profile")).click();
        Thread.sleep(2000);
        getImage(str);
        //点击帖子
        webDriver.findElement(By.cssSelector("#profile_article_body > li > div.card.timeline-event-card > div > div > div > div > div.text-truncate > a > strong")).click();
        getImage(str);
        webDriver.quit();
    }

    //修改个人信息成功
    public void updateInfoSuc() throws IOException, InterruptedException {
        String str = Thread.currentThread().getStackTrace()[1].getMethodName();
        getImage(str);
        Thread.sleep(2000);
        webDriver.findElement(By.cssSelector("#index_nav_avatar")).click();
        webDriver.findElement(By.cssSelector("#index_user_settings")).click();
        Thread.sleep(2000);
        //修改个人信息
        //修改之前要先清空
        //修改头像
        webDriver.findElement(By.cssSelector("#bit-forum-content > div.page-body > div > div > div > div.col.d-flex.flex-column > div > div.row.align-items-center > div:nth-child(2) > a")).sendKeys("C:\\Users\\asus\\Desktop\\证件照压缩版.jpg");

        //修改昵称
//        webDriver.findElement(By.cssSelector("#setting_input_nickname")).clear();
//        webDriver.findElement(By.cssSelector("#setting_input_nickname")).sendKeys("NickName");
//        Thread.sleep(2000);
//        webDriver.findElement(By.cssSelector("#setting_submit_nickname")).click();
//
//        //修改邮箱
//        webDriver.findElement(By.cssSelector("#setting_input_email")).clear();
//        webDriver.findElement(By.cssSelector("#setting_input_email")).sendKeys("qweqwe123@qq.com");
//        Thread.sleep(2000);
//        webDriver.findElement(By.cssSelector("#setting_submit_email")).click();
//
//        //修改电话号码
//        webDriver.findElement(By.cssSelector("#setting_input_phoneNum")).clear();
//        webDriver.findElement(By.cssSelector("#setting_input_phoneNum")).sendKeys("15136698733");
//        Thread.sleep(2000);
//        webDriver.findElement(By.cssSelector("#setting_submit_phoneNum")).click();
//
//        //修改密码
//        webDriver.findElement(By.cssSelector("#settings_input_oldPassword")).sendKeys("123123");
//        webDriver.findElement(By.cssSelector("#settings_input_newPassword")).sendKeys("1123456");
//        webDriver.findElement(By.cssSelector("#settings_input_passwordRepeat")).sendKeys("123456");
//        webDriver.findElement(By.cssSelector("#settings_submit_password")).click();
//
//        //修改个人简介
//        webDriver.findElement(By.cssSelector("#settings_textarea_remark")).clear();
//        webDriver.findElement(By.cssSelector("#settings_textarea_remark")).sendKeys("这是自动化测试");
//        Thread.sleep(2000);
//        webDriver.findElement(By.cssSelector("#settings_submit_remark")).click();
        Thread.sleep(2000);
        getImage(str);
        Thread.sleep(2000);
        webDriver.quit();
    }


    //修改个人信息失败
    public void updateInfoFail()throws IOException, InterruptedException{
        String str = Thread.currentThread().getStackTrace()[1].getMethodName();
        getImage(str);
        Thread.sleep(2000);
        webDriver.findElement(By.cssSelector("#index_nav_avatar")).click();
        webDriver.findElement(By.cssSelector("#index_user_settings")).click();
        Thread.sleep(2000);
        //修改个人信息

        //修改邮箱
//        webDriver.findElement(By.cssSelector("#setting_input_email")).clear();
//        webDriver.findElement(By.cssSelector("#setting_input_email")).sendKeys("qweqwe123");
//        Thread.sleep(2000);
//        webDriver.findElement(By.cssSelector("#setting_submit_email")).click();
//        getImage(str);

//        //修改电话号码
//        webDriver.findElement(By.cssSelector("#setting_input_phoneNum")).clear();
//        webDriver.findElement(By.cssSelector("#setting_input_phoneNum")).sendKeys("15136698");
//        Thread.sleep(2000);
//        webDriver.findElement(By.cssSelector("#setting_submit_phoneNum")).click();
//        getImage(str);

        //修改密码
//        webDriver.findElement(By.cssSelector("#settings_input_oldPassword")).sendKeys("123123");
//        webDriver.findElement(By.cssSelector("#settings_input_newPassword")).sendKeys("1123456");//前后密码不一致
//        webDriver.findElement(By.cssSelector("#settings_input_passwordRepeat")).sendKeys("123456");
//        webDriver.findElement(By.cssSelector("#settings_input_oldPassword")).sendKeys("");//没有输入旧密码
//        webDriver.findElement(By.cssSelector("#settings_input_newPassword")).sendKeys("123456");
//        webDriver.findElement(By.cssSelector("#settings_input_passwordRepeat")).sendKeys("123456");
        webDriver.findElement(By.cssSelector("#settings_input_oldPassword")).sendKeys("123123");
        webDriver.findElement(By.cssSelector("#settings_input_newPassword")).sendKeys("123456");
        webDriver.findElement(By.cssSelector("#settings_input_passwordRepeat")).sendKeys("");//没有输入确认密码
        Thread.sleep(2000);
        webDriver.findElement(By.cssSelector("#settings_submit_password")).click();
        Thread.sleep(1000);
        getImage(str);
        webDriver.quit();
    }
}

短信页面

public class MessageTest extends InitUtils {
    public static String url = "http://127.0.0.1:58080/index.html";
    public MessageTest() {
        super(url);
    }

    //打开站内信板块,点击站内信
    public void getMessage() throws InterruptedException, IOException {
        String str = Thread.currentThread().getStackTrace()[1].getMethodName();
        webDriver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div:nth-child(2) > div > a > svg")).click();
        Thread.sleep(2000);
        getImage(str);
        webDriver.findElement(By.cssSelector("#index_div_message_list > div:nth-child(1) > div > div.col.text-truncate > a > span:nth-child(2)")).click();
        Thread.sleep(2000);
        getImage(str);
        //webDriver.quit();
    }

    //回复站内信
    public void responseMsg()throws InterruptedException, IOException{
        String str = Thread.currentThread().getStackTrace()[1].getMethodName();
        webDriver.findElement(By.cssSelector("#btn_index_message_reply")).click();
        Thread.sleep(2000);
        getImage(str);
        webDriver.findElement(By.cssSelector("#index_message_reply_receive_content")).sendKeys("用来测试一下");
        Thread.sleep(2000);
        getImage(str);
        webDriver.findElement(By.cssSelector("#btn_index_send_message_reply")).click();
        Thread.sleep(2000);
        getImage(str);
        webDriver.quit();
    }
}

性能测试

对部分接口进行了性能测试,设置了600个线程

总结

  • 总体性能

    • 总请求数为6000,所有请求均成功执行,错误率为0.00%。

    • 平均响应时间为5.20毫秒,最小响应时间为0毫秒,最大响应时间为133毫秒。

    • 网络吞吐量为512.30 KiB/s,接收数据量为4521.95 KiB,发送数据量为113.35 KiB。

  • 各请求类型的性能

    • 发起帖子:平均响应时间为10.06毫秒,最大响应时间为32毫秒。

    • 点赞帖子:平均响应时间为5.10毫秒,最大响应时间为13毫秒。

    • 登出:平均响应时间为1.06毫秒,是所有请求中最快的。

    • 登录:平均响应时间为2.83毫秒,最大响应时间为36毫秒。

    • 获取帖子内容:平均响应时间为32.46毫秒,是所有请求中最慢的,最大响应时间为63毫秒。

    • 获取帖子详情:平均响应时间为5.24毫秒,最大响应时间为31毫秒。

    • 获取板块:平均响应时间为2.47毫秒,最大响应时间为8毫秒。

    • 获取用户帖子:平均响应时间为16.25毫秒,最大响应时间为44毫秒。

    • 获取用户详情:平均响应时间为1.17毫秒,最大响应时间为6毫秒。

    • 获取短信内容获取站内信列表:平均响应时间均为4.44毫秒,最大响应时间为133毫秒。

    • 获取站内:平均响应时间为3.39毫秒,最大响应时间为14毫秒。

  • APDEX指数

    • 所有请求的APDEX指数均为1.000,表示所有请求的响应时间都在用户可接受的范围内(容忍阈值500毫秒,沮丧阈值1.5秒)。

  • 网络使用情况

    • 接收数据量最大的是“获取帖子内容”和“获取用户帖子”,分别为4450.46 KiB和4290.84 KiB。

    • 发送数据量最大的是“发起帖子”和“登录”,分别为21.53 KiB和15.27 KiB。

  • 结论

    • 系统整体性能良好,所有请求的响应时间都在可接受范围内,且没有错误发生。

    • “获取帖子内容”和“获取用户帖子”是系统中响应时间较长的操作,可能需要进一步优化。

    • 网络吞吐量和数据传输量在合理范围内,没有明显的瓶颈。


网站公告

今日签到

点亮在社区的每一天
去签到