个人博客系统测试报告(一)

news2024/11/16 19:32:42

作者:爱塔居

专栏:测试

目录

一、项目背景介绍

二、项目功能

三、测试计划

3.1自动化测试用例

3.2 性能测试 ​​​​​​​(未完)


一、项目背景介绍

个人博客系统前端由注册页、登录页、列表页、详情页、编辑页、个人博客列表页构成,结合后端实现了注册、登录、添加博客、删除博客、查看博客、修改博客、强制登录等功能。

部署链接:http://124.223.101.247:8080/login.html

项目源码:https://gitee.com/lao-chen-a/javacode/tree/master/myblog-sm/src/main

二、项目功能

1.注册功能:需要输入用户名,还有密码以及确认密码进行注册,密码和确认密码必须保持一致,进行注册后,会自动跳转到登录页面。

2.登录功能:虽然主页右上角有主页和注册按钮,但在未登录的情况,只能注册和登录

3.个人博客列表页:可以在个人博客列表页上查看博客标题、发布时间、简介信息,每篇博客下方都有查看全文、修改、删除按钮等。页面的右上角有三个按钮,点击主页就会跳转到列表页,点击写博客就会跳转到编辑页,点击注销就会退出登录。

4.博客列表页:在博客列表页,可以看到所有用户的文章,运用了分页功能,每一页仅显示两篇文章。

5.详情页:在个人博客列表页、博客列表页点击“查看全文”按钮,就会跳转到详情页,此刻就可以看到该篇博客的完整内容,包括发布时间和阅读量。在左边,我们还可以看到作者的一些信息。

三、测试计划

3.1自动化测试用例

自动化测试总代码:https://gitee.com/lao-chen-a/javacode/commit/8d2f0900dbd37e4e48da826512d392341547ec52 

我是分成几个页面(功能)进行测试,其中Screen文件存放的是截屏的方法。通过这个方法,我们得到测试结果后会自动截屏存放到target包中。 利用时间的命名方式,使得文件名不会重复。

 Screen.java

package Blog;

import org.apache.commons.io.FileUtils;
import org.junit.jupiter.api.*;
import org.openqa.selenium.*;

import java.io.File;
import java.io.IOException;

import static java.lang.Thread.sleep;
import static org.junit.jupiter.api.Assertions.assertEquals;
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class Screen {
    public  void taskScreenShot(WebDriver webDriver){
        long date = System.currentTimeMillis();
        String path = String.valueOf(date);
        String cusPath = System.getProperty("user.dir");
        path = path+".png";
        String screenPath = cusPath+"/"+path;
        System.out.println(screenPath);
        //实现截图
        File file = ((TakesScreenshot) webDriver).getScreenshotAs(OutputType.FILE);
        try {
            FileUtils.copyFile(file,new File(screenPath));
        }catch (IOException e){
            e.printStackTrace();
        }
    }

}

 RegTests.java

package Blog;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class RegTests {
    @Test
    public void regSuccess(){
        WebDriver webDriver=new ChromeDriver();
        webDriver.get("http://124.223.101.247:8080/reg.html");
        webDriver.findElement(By.cssSelector("#username")).sendKeys("XiaoChen2");
        webDriver.findElement(By.cssSelector("#password")).sendKeys("12345");
        webDriver.findElement(By.cssSelector("#password2")).sendKeys("12345");
        webDriver.findElement(By.cssSelector("#submit")).click();
//        webDriver.get("http://124.223.101.247:8080/login.html");
//        webDriver.findElement(By.cssSelector("#username")).sendKeys("XiaoChen2");
//        webDriver.findElement(By.cssSelector("#password")).sendKeys("12345");
//        webDriver.findElement(By.cssSelector("#submit")).click();
       webDriver.quit();
    }
    //用户名为空
    @Test
    public void regFalse1(){
        WebDriver webDriver=new ChromeDriver();
        webDriver.get("http://124.223.101.247:8080/reg.html");
        webDriver.findElement(By.cssSelector("#username")).sendKeys("");
        webDriver.findElement(By.cssSelector("#password")).sendKeys("12345");
        webDriver.findElement(By.cssSelector("#password2")).sendKeys("12345");
        webDriver.findElement(By.cssSelector("#submit")).click();
        System.out.println(webDriver.switchTo().alert().getText());
        webDriver.quit();
    }
    //密码为空
    @Test
    public void regFalse2(){
        WebDriver webDriver=new ChromeDriver();
        webDriver.get("http://124.223.101.247:8080/reg.html");
        webDriver.findElement(By.cssSelector("#username")).sendKeys("XiaoChen");
        webDriver.findElement(By.cssSelector("#password")).sendKeys("");
        webDriver.findElement(By.cssSelector("#password2")).sendKeys("12345");
        webDriver.findElement(By.cssSelector("#submit")).click();
        System.out.println(webDriver.switchTo().alert().getText());
        webDriver.quit();
    }
    //确认密码为空
    @Test
    public void regFalse3(){
        WebDriver webDriver=new ChromeDriver();
        webDriver.get("http://124.223.101.247:8080/reg.html");
        webDriver.findElement(By.cssSelector("#username")).sendKeys("XiaoChen");
        webDriver.findElement(By.cssSelector("#password")).sendKeys("12345");
        webDriver.findElement(By.cssSelector("#password2")).sendKeys("");
        webDriver.findElement(By.cssSelector("#submit")).click();
        System.out.println(webDriver.switchTo().alert().getText());
        webDriver.quit();
    }
    //密码和确认密码不一致
    @Test
    public void regFalse4(){
        WebDriver webDriver=new ChromeDriver();
        webDriver.get("http://124.223.101.247:8080/reg.html");
        webDriver.findElement(By.cssSelector("#username")).sendKeys("XiaoChen");
        webDriver.findElement(By.cssSelector("#password")).sendKeys("12345");
        webDriver.findElement(By.cssSelector("#password2")).sendKeys("123");
        webDriver.findElement(By.cssSelector("#submit")).click();
        System.out.println(webDriver.switchTo().alert().getText());
        webDriver.quit();
    }
}

 LoginTests

package Blog;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

import static java.lang.Thread.sleep;

public class LoginTests extends Screen {
    //账号密码正确
    @Test
    void LoginSuccess() throws InterruptedException {
        WebDriver webDriver=new ChromeDriver();
        webDriver.get("http://124.223.101.247:8080/login.html");
        sleep(300);
        webDriver.findElement(By.cssSelector("#username")).sendKeys("chen");
        webDriver.findElement(By.cssSelector("#password")).sendKeys("12");
        webDriver.findElement(By.cssSelector("#submit")).click();
        sleep(300);
        String cur_url=webDriver.getCurrentUrl();
        Assertions.assertEquals("http://124.223.101.247:8080/myblog_list.html",cur_url);
        taskScreenShot(webDriver);
        webDriver.quit();
    }
    //账号密码不正确
    @Test
    public void loginFalse1() throws InterruptedException {
        WebDriver webDriver=new ChromeDriver();
        webDriver.get("http://124.223.101.247:8080/login.html");
        webDriver.findElement(By.cssSelector("#username")).sendKeys("chen");
        webDriver.findElement(By.cssSelector("#password")).sendKeys("12345");
        webDriver.findElement(By.cssSelector("#submit")).click();
        sleep(300);
        System.out.println(webDriver.switchTo().alert().getText());
        webDriver.switchTo().alert().accept();
        taskScreenShot(webDriver);
        webDriver.quit();
    }
    //测试账号为空
    @Test
    public void loginFalse2() throws InterruptedException {
        WebDriver webDriver=new ChromeDriver();
        webDriver.get("http://124.223.101.247:8080/login.html");
        webDriver.findElement(By.cssSelector("#username")).sendKeys("");
        webDriver.findElement(By.cssSelector("#password")).sendKeys("12345");
        webDriver.findElement(By.cssSelector("#submit")).click();
        sleep(300);
        System.out.println(webDriver.switchTo().alert().getText());
        webDriver.switchTo().alert().accept();
        webDriver.quit();
    }
    @Test
    public void loginFalse3() throws InterruptedException {
        WebDriver webDriver=new ChromeDriver();
        webDriver.get("http://124.223.101.247:8080/login.html");
        webDriver.findElement(By.cssSelector("#username")).sendKeys("chen");
        webDriver.findElement(By.cssSelector("#password")).sendKeys("");
        webDriver.findElement(By.cssSelector("#submit")).click();
        sleep(300);
        System.out.println(webDriver.switchTo().alert().getText());
        webDriver.switchTo().alert().accept();
        webDriver.quit();
    }
    //测试回车键
    @Test
    public void loginFalse4() throws InterruptedException {
        WebDriver webDriver=new ChromeDriver();
        webDriver.get("http://124.223.101.247:8080/login.html");
        webDriver.findElement(By.cssSelector("#username")).sendKeys("chen");
        webDriver.findElement(By.cssSelector("#password")).sendKeys("12");
        webDriver.findElement(By.cssSelector("#password")).sendKeys(Keys.ENTER);
        sleep(300);
        String cur_url=webDriver.getCurrentUrl();
        Assertions.assertEquals("http://124.223.101.247:8080/login.html",cur_url);
        webDriver.quit();
    }
}

 MyblogListTests

package Blog;

import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

import static java.lang.Thread.sleep;

public class MyblogLitsTests extends Screen {
    //测试删除键是否可用
    @Test
   void DeleteButton() throws InterruptedException {
       WebDriver webDriver=new ChromeDriver();
       webDriver.get("http://124.223.101.247:8080/login.html");
       sleep(300);
       webDriver.findElement(By.cssSelector("#username")).sendKeys("chen");
       webDriver.findElement(By.cssSelector("#password")).sendKeys("12");
     webDriver.findElement(By.cssSelector("#submit")).click();
    sleep(300);
    webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > a:nth-child(6)")).click();
  taskScreenShot(webDriver);
  webDriver.quit();
   }
    @Test
    void DetailButton() throws InterruptedException {
        WebDriver webDriver=new ChromeDriver();
        webDriver.get("http://124.223.101.247:8080/login.html");
        sleep(300);
        webDriver.findElement(By.cssSelector("#username")).sendKeys("chen");
        webDriver.findElement(By.cssSelector("#password")).sendKeys("12");
        webDriver.findElement(By.cssSelector("#submit")).click();
        sleep(300);
        webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > a:nth-child(4)")).click();
        taskScreenShot(webDriver);
        webDriver.quit();
    }
    @Test
    void ModifyButton() throws InterruptedException {
        WebDriver webDriver=new ChromeDriver();
        webDriver.get("http://124.223.101.247:8080/login.html");
        sleep(300);
        webDriver.findElement(By.cssSelector("#username")).sendKeys("chen");
        webDriver.findElement(By.cssSelector("#password")).sendKeys("12");
        webDriver.findElement(By.cssSelector("#submit")).click();
        sleep(300);
        webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > a:nth-child(5)")).click();
        taskScreenShot(webDriver);
        webDriver.quit();
    }
}

 QuiteTests

package Blog;

import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

import static java.lang.Thread.sleep;

public class QuiteTests extends Screen {
    @Test
    void quite() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("http://124.223.101.247:8080/login.html");
        sleep(300);
        webDriver.findElement(By.cssSelector("#username")).sendKeys("chen");
        webDriver.findElement(By.cssSelector("#password")).sendKeys("12");
        webDriver.findElement(By.cssSelector("#submit")).click();
        sleep(300);
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();
        webDriver.switchTo().alert().accept();
        taskScreenShot(webDriver);
    }
}

3.2 性能测试 

首先了解一点点概念。

性能测试定义:测试人员借助性能测试工具,模拟系统在不同场景下,对应的性能指标是否达到预期。

性能测试和功能测试的区别: 

功能测试:依靠人工执行

性能测试:依靠工具完成

功能测试:不管在什么场景下,只要能够正常运行即可

性能测试:软件在一些极端的情况下,是不是能够完成运行

影响一个软件性能因素有哪些?

硬件:服务器CPU利用率、内存、磁盘操作频率、CPU核心数

软件:算法、编程语言

用户:用户数量、用户使用时长、用户访问频率

面试题:你在做性能测试的时候,关注哪些指标?

并发用户数、响应时间/平均响应时间、事务响应时间、每秒事务通过数、点击率、吞吐量、思考时间、资源利用率

性能测试分类:

1.基准性能测试:让系统在正常情况下运行,观察软件性能指标(应用场景:软件刚上线需要性能摸底)

2.负载性能测试:验证软件在一定的压力情况下运行,观察性能指标是否出现了拐点

3.压力性能测试:系统处于饱和情况下,观察系统性能指标

4.可靠性能测试 :验证系统在一个持续的时间段内运行,在这个运行时间段,观察系统的性能指标

执行流程:需求分析->测试计划->选择一款性能测试工具->性能测试脚本编写->执行性能测试脚本

性能瓶颈是一定有的,只能不断优化。

我用的性能测试工具是LoadRunner,以下是LoadRunner的三大组件。

VUG:录制脚本

Controller:设计场景,运行场景

Analysis:产生性能测试报告

在loadrunner文件下载路径,找到WebTours文件夹,里面有一个文件名为StarServer.bat,双击进去,

接下来,又在WebTours下面找到conf文件夹里,能找到 httpd.conf文件。

在360浏览器中打开链接。

 我们可以注册账号。在安装路径下WebTours文件夹下cgi-bin文件夹下users文件夹下会存放我们的账号密码。

 打开VUG

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1040374.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CompletableFuture-通用异步编程

演示Completable接口完全可以代替Future接口: CompletableFuture减少阻塞和轮询,可以传入回调对象,当异步任务完成或者发生异常时,自动 调用回调对象的回调方法。 package com.nanjing.gulimall.zhouyimo.test;import java.util…

postman接口自动化测试框架实战

什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 例如GUI自动化测试,模拟人去操作软件界面,把人从简单重复的劳动中解放出来。 本质是用代码去测试另一段代码,属于一种软件开发工作,已经开发完成的用…

Linux死锁

第三种情况 #include<stdio.h> #include<unistd.h> #include<pthread.h> #include<string.h>pthread_mutex_t mutex1, mutex2; void * workA(void * arg) {pthread_mutex_lock(&mutex1);sleep(1);pthread_mutex_lock(&mutex2);printf("w…

【MySQL】 Java的JDBC编程

文章目录 &#x1f332;数据库编程的必备条件&#x1f38b;Java的数据库编程&#xff1a;JDBC&#x1f38d;JDBC工作原理&#x1f333;建立数据库连接&#x1f4cc;在项目中新建一个包&#xff0c;名字自命名&#x1f4cc;将依赖包导入新建包中&#x1f4cc;DataSource&#xf…

EPLAN_002#常用功能(二)

一、快速添加端子 端子编号 端子定义 批量修改时&#xff0c;当名称出现冲突时&#xff0c;勾选上 端子排排序&#xff0c;可以基于页 二、多层端子的快速建立 有购物车的代表一个端子 三、手动鞍型跳线 标题 四、购物车图标 在导航器中&#xff0c;有购物车是陷进去的表示 在图…

基于微信小程序的线上教育课程付费商城(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

Springboot: Spring Cloud Gateway 使用的基本概念及配置介绍

1. SpringCloud 与 SpringBoot的版本映射关系 在已有的Spring Boot项目中增加Spring Cloud&#xff0c;首先要确定使用的Spring Cloud的版本&#xff0c;这取决于项目使用的Spring Boot的版本 SpringCloud 与 SpringBoot的版本映射关系 如果两者的版本不兼容&#xff0c;再会…

【洛谷 P1644】跳马问题 题解(动态规划)

跳马问题 题目背景 在爱与愁的故事第一弹第三章出来前先练练四道基本的回溯/搜索题吧…… 题目描述 中国象棋半张棋盘如图 1 1 1 所示。马自左下角 ( 0 , 0 ) (0,0) (0,0) 向右上角 ( m , n ) (m,n) (m,n) 跳。规定只能往右跳&#xff0c;不准往左跳。比如图 1 1 1 中所…

【已解决】PDF文件无法编辑怎么办?

打开PDF文件却发现无法编辑&#xff0c;怎么办&#xff1f; 首先&#xff0c;我们要知道&#xff0c;编辑PDF文件需要用到PDF编辑器&#xff0c;用PDF阅读器打开的话是无法编辑的。所以&#xff0c;先要确定是否用PDF编辑器打开PDF文件。 如果使用PDF编辑器打开后还是无法编辑…

2023-9-25 JZ25 合并两个排序的链表

题目链接&#xff1a;合并两个排序的链表 import java.util.*;/** public class ListNode {* int val;* ListNode next null;* public ListNode(int val) {* this.val val;* }* }*/public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c…

8.定义算法中的函数

在 algorithm2e 宏包中&#xff0c;您可以使用 \SetKwFunction 命令来定义算法中的函数。这个命令用于指定函数的名称和参数列表。以下是如何在算法中定义一个函数的示例&#xff1a; \documentclass{article} \usepackage[linesnumbered,boxed]{algorithm2e}\begin{document}…

Tomcat 开启远程调试

Tomcat 部署的 war包工程开启远程调试 Linux服务器下&#xff0c;编辑Tomcat bin 目录下的 startup.sh 文件 vim startup.sh在第一行加入&#xff1a;(不换行&#xff0c;在同一行) declare -x CATALINA_OPTS"-server -Xdebug -Xnoagent -Djava.compilerNONE -Xrunjdwp:…

C#文件目录

文件所在位置 代码 Console.WriteLine("获取程序的基目录" System.AppDomain.CurrentDomain.BaseDirectory); Console.WriteLine("获取模块的完整路径" System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName); Console.WriteLine(&quo…

WebGL 绘制圆形的点

目录 前言 如何实现圆形的点&#xff1f; 片元着色器内置变量&#xff08;gl_FragCoord、gl_PointCoord&#xff09; gl_PointCoord的含义 示例程序&#xff08;RoundedPoint.js&#xff09; 代码详解 前言 本文将讨论示例程序RoundedPoint&#xff0c;该程序绘制了圆…

02-Scala变量与数据类型

注释 ​ Scala注释使用和Java完全一样。注释是一个程序员必须要具有的良好编程习惯。将自己的思想通过注释先整理出来&#xff0c;再用代码去体现。 单行注释多行注释文档注释 变量与常量 常量&#xff1a;在程序执行的过程中&#xff0c;其值不会被改变的变量 Java中变量…

【C++】构造函数和析构函数第一部分(构造函数和析构函数的作用)--- 2023.9.25

目录 前言初始化和清理的概念构造函数和析构函数的作用构造函数的作用析构函数的作用 使用构造函数和析构函数的注意事项默认的构造函数和析构函数结束语 前言 在使用c语言开发的项目场景中&#xff0c;我们往往会遇到申请空间的需求&#xff0c;同时也肯定遇到过程序运行一段…

数字IC基础协议篇(1)——I2C协议

数字IC基础协议篇&#xff08;1&#xff09;——I2C协议 写在前面的话I2C协议应用框图I2C数据格式协议注意点 I2C读写EEPROM例程&#xff08;基于iverilog和gtkwave&#xff09;软件环境要求 项目框图总结 写在前面的话 协议介绍&#xff1a; I2C&#xff08;Inter-Integrated…

【CNN-FPGA开源项目解析】卷积层03--单格乘加运算单元PE 单窗口卷积块CU 模块

03–单格乘加运算单元PE & 单窗口卷积块CU 文章目录 03--单格乘加运算单元PE & 单窗口卷积块CU前言单格乘加运算单元PE代码模块结构时序逻辑分析对其上层模块CU的要求 单窗口卷积块CU代码逻辑分析 前言 ​ 第一和第二篇日志已经详细阐述了"半精度浮点数"的加…

Strtok函数切割字符串(附代码演示)

目录 1.认识Strtok函数 2.Strtok函数使用认识 3.Strtok使用代码示例 1.认识Strtok函数 C语言中的strtok函数是用来将字符串分割成若干个子串的函数。它的原型如上图所示 char *strtok(char *str, const char *delimiters);函数参数str为要被分割的字符串&#xff0c;参数del…

95 # express 二级路由的实现

上一节实现了兼容老的路由写法&#xff0c;这一节来实现二级路由 二级路由实现核心&#xff1a; 进入中间件后&#xff0c;让对应的路由系统去进行匹配操作中间件进去匹配需要删除 path&#xff0c;存起来出去时在加上 示意图&#xff1a; 代码实现如下&#xff1a; rout…