项目开发中,完成了功能测试后一般还需要做性能测试,其原因有以下两点:
目前绝大多数的应用都是Web应用,它们一般是基于网络的分布式应用,无法准确地评估其用户数量,而且用户使用场景也不确定,因此需要对项目的功能、业务逻辑和接口进行测试,另外还要测试系统性能。在项目运行时,即便用户的登录操作没有发生错误,但如果超过一定的用户数量,就可能会出现各种系统问题,因此需要进行系统的性能测试。
性能测试可以模拟用户数量的增加和系统负载的增加,从而确定当前系统承受的并发用户数量,明确网络是否够用,服务器的CPU及内存是否够用,硬盘的速度和容量是否能满足当前的系统,这样项目上线时可以从容地面对突发情况。
性能测试的种类
性能测试有多种类型,常见的有以下几种:
基准测试:在给系统施加较低的压力时,查看系统的运行状况并记录相关数据,将其作为基准结果。
负载测试:是指对系统不断地增加压力或延长一定压力下的持续时间,直到系统的某项或多项性能指标达到安全的临界值(例如,某种资源已经达到饱和状态)。
压力测试:用来评估系统处于或超过预期负载时的运行情况,其关注点在于系统在峰值负载或超出最大载荷情况下的处理能力。
稳定性测试:在给系统加载一定业务压力的情况下,让系统运行一段时间,以此检测系统是否稳定。
并发测试:用来测试多个用户同时访问同一个应用、同一个模块或者数据记录时是否存在死锁或者其他性能问题。
性能测试的考量指标
在进行性能测试时,对系统的考量通常使用响应时间(ResponseTime)、吞吐率、事务处理能力(TPS)、并发数和资源利用率5个指标,从而评价系统的性能,如好、坏、快、慢。下面具体解释这5个指标。
响应时间:指从用户发送一个请求到用户接收到服务器返回的响应数据这段时间。
吞吐量:单位时间内系统处理的客户端请求数量,一般使用请求数/s作为吞吐量的单位,也可以使用页面数/s表示。
事务处理能力(Transactions Per Second,TPS):即服务器接收到大量的用户请求后每秒处理事务的数量。
并发数:某时刻同时向系统提交请求的用户数,提交的请求可能是同一个场景或功能,也可以是不同场景或功能。
资源利用率:指的是对不同系统资源的使用程度,通常以占用最大值的百分比来衡量,通常关注的因素包括CPU、内存、磁盘I/O和网络。
实战:对项目进行性能测试
下面使用性能测试检验项目的性能。该项目使用国产的性能测试框架JUnitPerf,它对JUnit5有很好的支持,并且可以生成HTML的测试结果报告,以方便查看结果和向上汇报。
具体步骤如下:
(1)在pom.xml中添加依赖:
<!-- JUnit5性能测试 -->
<dependency>
<groupId>com.github.houbb</groupId>
<artifactId>junitperf</artifactId> <version>2.0.7</version>
</dependency>
(2)修改7.2节中的Controller代码(主要修改测试用例中的第一个方法):
/**
* 配置:2个线程运行;准备时间:1000 ms;运行时间: 2000 ms。
* 要求:最快不得低于210ms,最慢不得低于250ms,平均不得低于225ms,运行次数不得低
于
每秒4次。
* 20%的数据不得低于220ms,50%的数据不得低于230ms。
*
* @throws InterruptedException if any
*/
@JunitPerfConfig(threads = 2, warmUp = 1000, duration = 2000, reporter
=
{HtmlReporter.class})
@JunitPerfRequire(min = 210, max = 250, average = 225, timesPerSecond
= 4,
percentiles = {"20:220", "50:230"})
@Test
void queryGood() throws Exception {
MvcResult mvcResult = (MvcResult)
mvc.perform(MockMvcRequestBuilders.
get("/queryGood")
.accept(MediaType.ALL)
.session(session)
.param("name", "cc")
)
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print())
.andReturn();
//得到返回代码
int status = mvcResult.getResponse().getStatus();
//得到返回结果
String result = mvcResult.getResponse().getContentAsString(); log.info("status是:{},内容是:{}", status, result);
}
(3)JUnitPerf的用法可以参见代码中的注释。运行这个单元测试方法,可以看到控制台上打印的日志中有一个是
[INFO] [2021-07-1017:41:42.277] [c.g.h.j.s.s.Performance
EvaluationStatement.generateReporter] - Rendering report to:
D:\parttime\book\spring-boot-all-code\junit5-
demo\target\junitperf\reports\com\example\junit5demo\controller\GoodsControllerTest.html
,表示已经测试成功,并且将生成结果输出到对应的文件夹中,打开HTML文件可以看到结果,如图7.7所示。
性能测试是项目正常运行的保证。如果性能测试不合格,则需要做出相应的调整。可以选择对代码进行优化,也可以增加服务器的配置,甚至可以和产品经理商量对功能进行调整。性能测试的标准很重要,一定要对比不同的人数和机器配置对性能结果的影响。