AcCode项目测试报告

news2024/11/15 7:16:58

文章目录

  • 项目介绍
  • 编写测试用例
    • 根据测试用例编写自动化测试
      • 0.搭建测试环境
      • 1. 创建功能类
      • 2. 编写注册功能自动化
      • 3.编写登录功能自动化
    • 性能测试
      • 1.使用VUG编写性能测试脚本
      • 2. 创建测试场景
      • 3.开始执行
      • 4. 简单分析性能测试报告
        • 事务报告
        • 运行的虚拟用户图表
        • 点击率表
        • 吞吐量图表
        • 系统资源消耗图


项目介绍

AcCode是一个类似于牛客力扣的在线OJ平台,可以进行算法题的编写,提交后可以看到题目是否通过。项目使用的技术栈有:Java、MySQL、SpringBoot、MyBatis、Redis、Nginx、Docker。
项目的主要功能有:

  1. 登录注册
  2. 添加/修改题目信息
  3. 提交并运行代码,查看代码运行是否通过
  4. 反向代理和负载均衡
  5. 沙箱机制保护物理主机

编写测试用例

在这里插入图片描述

部分测试截图
在这里插入图片描述
在这里插入图片描述

根据测试用例编写自动化测试

使用Junit5+selenium对项目进行简单的自动化测试。把项目验证码关闭,方便自动化测试。

0.搭建测试环境

引入相关依赖

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.8.2</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.platform</groupId>
    <artifactId>junit-platform-suite</artifactId>
    <version>1.8.2</version>
    <scope>test</scope>
</dependency>
<dependency>
          <groupId>org.seleniumhq.selenium</groupId>
          <artifactId>selenium-java</artifactId>
          <version>4.0.0</version>
</dependency>
<!-- 文件保存相关 -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>


1. 创建功能类

public class AutoTestUtil {
    private static volatile ChromeDriver driver;
    private AutoTestUtil(){}
    public static ChromeDriver getDriver() {
        if (driver == null){
            synchronized (AutoTestUtil.class) {
                if (driver == null) {
                    ChromeOptions options = new ChromeOptions();
                    options.addArguments("--remote-allow-origins=*");
                    driver = new ChromeDriver(options);
                    // 设置隐式等待
                    driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
                }
            }
        }
        return driver;
    }
}

2. 编写注册功能自动化

// 标注排序
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class RegAutoTest {
    private static ChromeDriver driver;

    @BeforeAll
    public static void init() {
        driver = AutoTestUtil.getDriver();
        driver.get("http://127.0.0.1:7777/reg.html");
        driver.manage().window().maximize();
    }

    /**
     * 检测页面是否正确打开
     */
    @Order(1)
    @Test
    public void check() {
        String key = driver.findElement(By.xpath("/html/body/div/h1")).getText();
        // 断言
        Assertions.assertEquals("注册账号",key);
    }

    /**
     * 错误注册
     * @param username
     * @param password
     * @param confirmPassword
     */
    @Order(2)
    @ParameterizedTest
    @CsvSource(value = {"null,null,null","null,test,test","test,null,test","test,test,null","test,test,1234"})
    public void errorReg(String username,String password,String confirmPassword) throws InterruptedException {
        WebElement usernameInput = driver.findElement(By.xpath("//*[@id=\"username\"]"));
        WebElement passwordInput = driver.findElement(By.cssSelector("#password"));
        WebElement confirmPass = driver.findElement(By.xpath("//*[@id=\"confirmPassword\"]"));
        if (!"null".equals(username)) {
            usernameInput.sendKeys(username);
        }
        if (!"null".equals(password)) {
            passwordInput.sendKeys(password);
        }
        if (!"null".equals(confirmPassword)) {
            confirmPass.sendKeys(confirmPassword);
        }
        driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();
        Thread.sleep(800);
        // 点击警告弹窗上的确认按钮
        driver.switchTo().alert().accept();
        usernameInput.clear();
        passwordInput.clear();
        confirmPass.clear();
    }

    @Order(3)
    @ParameterizedTest
    @CsvSource(value = {"test,test,test"})
    public void successReg(String username,String password,String confirmPassword) throws InterruptedException {
        driver.findElement(By.cssSelector("#username")).sendKeys(username);
        driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys(password);
        driver.findElement(By.xpath("//*[@id=\"confirmPassword\"]")).sendKeys(confirmPassword);
        driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();
        Thread.sleep(500);
        driver.switchTo().alert().accept();
    }

    @AfterAll
    public static void quit() {
        driver.quit();
    }


}

执行示例:

在这里插入图片描述

3.编写登录功能自动化

编写自动化代码

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class LoginAutoTest {
    private static ChromeDriver driver;

    @BeforeAll
    public static void init() {
        driver = AutoTestUtil.getDriver();
        driver.get("http://127.0.0.1:7777/login.html");
        driver.manage().window().maximize();
    }

    /**
     * 检测页面是否正确打开
     */
    @Order(1)
    @Test
    public void check() {
        String str = driver.findElement(By.cssSelector("body > div > h1")).getText();
        Assertions.assertEquals("AcCode登录",str);
    }

    @Order(2)
    @ParameterizedTest
    @CsvSource(value = {"null,null","null,test","test,null","test,123","demo,demo"})
    public void errorLogin(String username,String password) throws InterruptedException {
        WebElement usernameInput = driver.findElement(By.cssSelector("#username"));
        WebElement passwordInput = driver.findElement(By.xpath("//*[@id=\"password\"]"));
        if (!"null".equals(username)) {
            usernameInput.sendKeys(username);
        }
        if  (!"null".equals(password)) {
            passwordInput.sendKeys(password);
        }
        driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();
        Thread.sleep(800);
        driver.switchTo().alert().accept();
        usernameInput.clear();
        passwordInput.clear();
    }

    @Order(3)
    @ParameterizedTest
    @CsvSource(value = {"admin,admin","test,test"})
    public void success(String username,String password) throws InterruptedException {
        driver.findElement(By.cssSelector("#username")).sendKeys(username);
        driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys(password);
        driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();
        // 检测是否跳转到题目列表页面
        String str = driver.findElement(By.xpath("//*[@id=\"tables\"]/div/div/h3")).getText();
        Assertions.assertEquals("题目列表",str);
        // 注销
        driver.findElement(By.cssSelector("body > nav > a.btn.btn-light")).click();
        Thread.sleep(400);
        driver.switchTo().alert().accept();
    }

    @AfterAll
    public static void quit() {
        driver.quit();
    }
}

测试中发现bug,如果用户不存在查询不到就会出现空指针异常,被统一异常处理捕获。
在这里插入图片描述
所有测试用例全部通过
在这里插入图片描述
自动化测试展示:
在这里插入图片描述

性能测试

使用LoadRunner对项目进行简单的性能测试。模拟多个用户同时进行登录后进入题目点击提交题目。

1.使用VUG编写性能测试脚本

模拟用户进入登录页面并进行登录

Action()
{
	// 开启进入登录页面事务
	lr_start_transaction("login_html");
	
	/* 注册获取返回参数,该方法可以配合打印返回数据,检测数据内容 */
	web_reg_save_param("ParaResult",
					   "LB=",
					   "RB=",
					   LAST);
	// 定义虚拟用户集合点
	lr_rendezvous("user_start");
	// 定义检测点,检测登录页面是否正确打开
	web_reg_find("Text=AcCode",LAST);
	// 访问登录页面
	web_url("login_html",
		"URL=http://127.0.0.1:7777/login.html",
		"TargetFrame=",
		"Resource=0",
		"Referer=",
		LAST);
	// 结束进入登录页面事务
	lr_end_transaction("login_html",LR_AUTO);
	
	// 开启登录事务
	lr_start_transaction("login");
	// 进行登录
	web_submit_data("user_login",
		"Action=http://127.0.0.1:7777/user/login",
		"Method=POST",
		"TargetFrame=",
		"Referer=",
		"Mode=HTTP",
		ITEMDATA,
		"Name=username", "Value={username}", ENDITEM,
		"Name=password", "Value={password}", ENDITEM,
		LAST);
	// 定义检测点,检测登录后题目列表页面是否正确打开
	web_reg_find("Text=ID",LAST);
	// 结束进入登录事务
	lr_end_transaction("login",LR_AUTO);
	
	// 开启访问题目列表事务
	lr_start_transaction("problemList_html");
	// 访问题目列表页面
	web_url("index_html",
		"URL=http://127.0.0.1:7777/index.html",
		"TargetFrame=",
		"Resource=0",
		"Referer=",
		LAST);
	
	// 结束访问题目列表事务
	lr_end_transaction("problemList_html",LR_AUTO);
	return 0;
}

添加4个用户名密码
在这里插入图片描述

2. 创建测试场景

1.设置10个虚拟用户
在这里插入图片描述
2.设置没5秒初始化两个用户
在这里插入图片描述
3.设置每5秒进入2个虚拟用户到测试场景
在这里插入图片描述
4.设置虚拟用户循环执行5分钟
在这里插入图片描述
5.设置执行结束后,每5秒退出一个虚拟用户
在这里插入图片描述
6.添加监控系统资源
监控CPU的运行时间和剩余内存
在这里插入图片描述

3.开始执行

在这里插入图片描述

4. 简单分析性能测试报告

事务报告

在这里插入图片描述

在事务报告中,一般只关心平均值和标准偏差,标准偏差值越大,说明越不稳定,可以到在脚本里写的login事务,
在这里插入图片描述

运行的虚拟用户图表

这个图标对应了前面设置的每5秒进入两个虚拟用户到测试场景,以及每5秒有一个虚拟用户从测试场景退出,中间从40秒到5分4时秒是服务器的负载时间,对应前设置的循环执行5分钟。
在这里插入图片描述

点击率表

通过点击率表可以看到和虚拟用户运行表运行对应起来,虚拟用户的增多点击率也随之增多,点击率越多说明和服务器的交互次数也越多。
在这里插入图片描述

吞吐量图表

吞吐量图形和点击数图形有点相似,但是吞吐量的曲线会稍微延后一点递增,因为吞吐量表示的是响应返回的资源数量,是要现有请求才会有响应的。

在这里插入图片描述

系统资源消耗图

precessorTime:CPU使用时间,被消耗的处理器时间数量
Available MBytes:可用的物理内存,一般根据这个指标推算消耗的物理内存有多大。(已经消耗的物理内存=实际内存 - 可用物理内存)
在这里插入图片描述


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

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

相关文章

C#,数值计算——Sobol拟随机序列的计算方法与源程序

1 文本格式 using System; using System.Collections.Generic; namespace Legalsoft.Truffer { /// <summary> /// Sobol quasi-random sequence /// </summary> public class Sobol { public Sobol() { } public static void sobseq(int n,…

堆排序——向下调整

之前我们要想实现堆排序&#xff0c;是运用建堆代码来实现的&#xff1a; 向上调整建堆——向下调整排序 那么去我们可不可以只适用一种调整方法&#xff08;向下调整&#xff09;就能实现这样的功能呢&#xff1f; 向要只使用向下调整就实现堆排序 首先就是把数组里的值使用…

互联网Java工程师面试题·Dubbo 篇·第二弹

目录 18、Dubbo 用到哪些设计模式&#xff1f; 19、Dubbo 配置文件是如何加载到 Spring 中的&#xff1f; 20、Dubbo SPI 和 Java SPI 区别&#xff1f; 21、Dubbo 支持分布式事务吗&#xff1f; 22、Dubbo 可以对结果进行缓存吗&#xff1f; 23、服务上线怎么兼容旧版本&…

设计模式12、代理模式 Proxy

解释说明&#xff1a;代理模式&#xff08;Proxy Pattern&#xff09;为其他对象提供了一种代理&#xff0c;以控制对这个对象的访问。在某些情况下&#xff0c;一个对象不适合或者不能直接引用另一个对象&#xff0c;而代理对象可以在客户端和目标对象之间起到中介的作用。 抽…

星宿UI2.4资源付费变现小程序源码 支持流量主

第一个小程序为星宿小程序 目前是最新版2.0 搭建星宿需要&#xff1a;备用域名 服务器 微信小程序账号 功能&#xff1a;文章展示 文章分类 资源链接下载 轮播图 直接下载附件功能 很多 很适合做资源类分享 源码下载&#xff1a;https://download.csdn.net/download/m0_6604…

Android LitePal byte[]类型字段不被创建

我创建了以下实体类&#xff0c;主要是用户分享的内容、分享的照片、分享的标题&#xff0c;然后百度了一下LitePal可以识别byte[]&#xff0c;因为需要文件的上传与读取&#xff1a; public class Context extends LitePalSupport {private Integer ContextId;private String…

二叉树题目:路径总和 II

文章目录 题目标题和出处难度题目描述要求示例数据范围 前言解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;路径总和 II 出处&#xff1a;113. 路径总和 II 难度 4 级 题目描述 要求 给你二叉树的根结点 root \tex…

软件设计模式系列之二十五——访问者模式

访问者模式&#xff08;Visitor Pattern&#xff09;是一种强大的行为型设计模式&#xff0c;它允许你在不改变被访问对象的类的前提下&#xff0c;定义新的操作和行为。本文将详细介绍访问者模式&#xff0c;包括其定义、举例说明、结构、实现步骤、Java代码实现、典型应用场景…

【2023年11月第四版教材】第18章《项目绩效域》(第一部分)

第18章《项目绩效域》&#xff08;第一部分&#xff09; 1 章节内容2 干系人绩效域2.1 绩效要点2.2 执行效果检查2.3 与其他绩效域的相互作用 3 团队绩效域3.1 绩效要点3.2 与其他绩效域的相互作用3.3 执行效果检查3.4 开发方法和生命周期绩效域 4 绩效要点4.1 与其他绩效域的相…

电脑重置 Win 10系统

文章目录 电脑重置系统操作步骤一、右键 开始→ 设置二、点击 更新与安全三、点击 恢复四、点击 开始四、按需二选一五、以本地重新安装为例&#xff0c;点击 下一页六、点击 重置七、重新进行Windows设置 当电脑出现系统文件损坏、磁盘掉盘等情况&#xff0c;可以考虑重装系统…

Docker启动Mysql

如果docker里面没有mysql需要先pull一个mysql镜像 docker pull mysql其中123456是mysql的密码 docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD123456 -d mysql可以使用如下命令进入Mysql的命令行界面 docker exec -it mysql bash登录mysql使用如下命令,root是…

基于SSM框架的校园疫情防控健康打卡系统

本系统采用基于JAVA语言实现、架构模式选择B/S架构&#xff0c;Tomcat7.0及以上作为运行服务器支持&#xff0c;基于JAVA等主要技术和框架设计&#xff0c;idea作为开发环境&#xff0c;数据库采用MYSQL5.7以上。 开发环境&#xff1a; JDK版本&#xff1a;JDK1.8 服务器&…

【go语言】入门go语言结构体

结构体的定义 结构体是一种用户自定义的数据类型&#xff0c;它由一组字段组成&#xff0c;每个字段可以是任意基本类型或其他结构体类型。结构体在Go语言中被广泛使用&#xff0c;它可以用来表示复杂的数据结构&#xff0c;比如二叉树、链表、图等。 结构体的形式如下&#…

SpringBoot青海省旅游系统

本系统采用基于JAVA语言实现、架构模式选择B/S架构&#xff0c;Tomcat7.0及以上作为运行服务器支持&#xff0c;基于JAVA、JSP等主要技术和框架设计&#xff0c;idea作为开发环境&#xff0c;数据库采用MYSQL5.7以上。 开发环境&#xff1a; JDK版本&#xff1a;JDK1.8 服务器…

【boost网络库从青铜到王者】第七篇:asio网络编程中的异步echo服务器,以应答为主

文章目录 1、简介2、echo模式应答异步服务器2.1、Session会话类2.2、Server类为服务器接收连接的管理类 3、客户端4、隐患5、总结 1、简介 前文已经介绍了异步操作的api&#xff0c;今天写一个简单的异步echo服务器&#xff0c;以应答为主。 2、echo模式应答异步服务器 2.1、…

R | R包默认安装路径的查看及修改

R | R包默认安装路径的查看及修改 一、R包安装位置查看二、已安装R包查询三、R包安装位置修改四、R包安装位置永久修改 在【R: R package安装的几种方式】【R: R版本更新及R包迁移&#xff08;详细步骤&#xff09;】两篇文章中介绍过R包的常见安装方式&#xff0c;以及在不同R…

一道求导题:1004T3

需要知识: ( x n ) ′ n x n − 1 (x^n)nx^{n-1} (xn)′nxn−1 ( s i n x ) ′ c o s x (sinx)cosx (sinx)′cosx [ f ( g ( x ) ) ] ′ f ′ ( g ( x ) ) g ′ ( x ) [f(g(x))]f(g(x))\times g(x) [f(g(x))]′f′(g(x))g′(x) 推完之后&#xff0c;考虑导函数与x轴的交点…

测试2023

1 企业级全栈测试平台 RunnerGO 1.1 Flow流拖拽自由组合&#xff0c;实时协作和共享 Flow自由拖拽自由组合&#xff0c;可以实现在进行一个接口后并发执行后续的步骤 接口自定义权重&#xff0c;根据Flow流自由组合配合接口自定义权重可以模拟真实业务分流的场景 全链路场景&am…

Tomcat基础与优化

Tomcat介绍 Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;Tomcat具有处理HTML页面的功能&#xff0c;通常作为一个Servlet和JSP容器&#xff0c;单独运行…

“在 ArchiMate EA 建模中的组合关系:构建块和依赖关系

简介 在企业架构&#xff08;EA&#xff09;建模领域&#xff0c;结构关系在描绘架构内静态一致性方面起着至关重要的作用。其中一个关键的结构关系是组合关系&#xff0c;这是 ArchiMate 语言中深植的概念&#xff0c;提供了一个全面的框架&#xff0c;用于表达元素如何组合形…