ContiPerf:: 更为优雅和方便的单元压力测试工具。

news/2023/12/9 17:40:46 标签: 测试, java

概述

ContiPerf 是一个轻量级的单元测试工具,基于JUnit 4二次开发,使用它基于注解的方式,快速在本地进行单元压测并提供详细的报告。

Example

1. 新建 SpringBoot 工程

核心依赖如下
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.databene</groupId>
    <artifactId>contiperf</artifactId>
    <version>2.1.0</version>
    <scope>test</scope>
</dependency>

2. 测试接口以及实现

java">package com.wuwenze.contiperf.service;

import java.util.List;

public interface ContiperfExampleService {

    List<String> findAll();
}
java">import com.wuwenze.contiperf.service.ContiperfExampleService;

import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
public class ContiperfExampleServiceImpl implements ContiperfExampleService {
    private final Random RANDOM = new Random();

    @Override
    public List<String> findAll() {
        try {
            int sleepSecond = RANDOM.nextInt(10);
            log.info("#findAll(): sleep {} seconds..", sleepSecond);
            Thread.sleep(sleepSecond * 1000);
        } catch (InterruptedException e) {
            // ignore
        }
        List<String> resultList = new ArrayList<>();
        for (int i = 0; i < 1000; i++) {
            resultList.add("string_" + i);
        }
        return resultList;
    }
}

3. 构建单元测试

java">package com.wuwenze.contiperf.service;

import com.wuwenze.contiperf.ContiperfExamplesApplication;

import org.databene.contiperf.PerfTest;
import org.databene.contiperf.junit.ContiPerfRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;


@RunWith(SpringRunner.class)
@SpringBootTest(classes = ContiperfExamplesApplication.class)
public class ContiperfExampleServiceTest {
    @Rule
    public ContiPerfRule i = new ContiPerfRule();

    @Autowired
    private ContiperfExampleService contiperfExampleService;

    @Test
    @PerfTest(threads = 1000, duration = 1500)
    public void findAll() {
        contiperfExampleService
                .findAll()
                .forEach(System.out::println);
    }
}

4. 最终执行效果

clipboard.png

查看测试报告:
clipboard.png

总结

1)PerfTest参数

@PerfTest(invocations = 300):执行300次,和线程数量无关,默认值为1,表示执行1次;
@PerfTest(threads=30):并发执行30个线程,默认值为1个线程;
@PerfTest(duration = 20000):重复地执行测试至少执行20s。
三个属性可以组合使用,其中Threads必须和其他两个属性组合才能生效。当Invocations和Duration都有指定时,以执行次数多的为准。

  例,@PerfTest(invocations = 300, threads = 2, duration = 100),如果执行方法300次的时候执行时间还没到100ms,则继续执行到满足执行时间等于100ms,如果执行到50次的时候已经100ms了,则会继续执行之100次。

  如果你不想让测试连续不间断的跑完,可以通过注释设置等待时间,例,@PerfTest(invocations = 1000, threads = 10, timer = RandomTimer.class, timerParams = { 30, 80 }) ,每执行完一次会等待30~80ms然后才会执行下一次调用。

  在开多线程进行并发压测的时候,如果一下子达到最大进程数有些系统可能会受不了,ContiPerf还提供了“预热”功能,例,@PerfTest(threads = 10, duration = 60000, rampUp = 1000) ,启动时会先起一个线程,然后每个1000ms起一线程,到9000ms时10个线程同时执行,那么这个测试实际执行了69s,如果只想衡量全力压测的结果,那么可以在注释中加入warmUp,即@PerfTest(threads = 10, duration = 60000, rampUp = 1000, warmUp = 9000) ,那么统计结果的时候会去掉预热的9s。

2)Required参数

@Required(throughput = 20):要求每秒至少执行20个测试
@Required(average = 50):要求平均执行时间不超过50ms;
@Required(median = 45):要求所有执行的50%不超过45ms;
@Required(max = 2000):要求没有测试超过2s;
@Required(totalTime = 5000):要求总的执行时间不超过5s;
@Required(percentile90 = 3000):要求90%的测试不超过3s;
@Required(percentile95 = 5000):要求95%的测试不超过5s;
@Required(percentile99 = 10000):要求99%的测试不超过10s;
@Required(percentiles = "66:200,96:500"):要求66%的测试不超过200ms,96%的测试不超过500ms。

3)测试报告

最终的测试报告位于target/contiperf-report/index.html,使用浏览器打开即可。


http://www.niftyadmin.cn/n/1203625.html

相关文章

数学查漏补缺之高斯分布

1、简介 正态分布又称为高斯分布&#xff0c;正态分布的曲线呈钟型&#xff0c;两头低&#xff0c;中间高。若随机变量X服从一个数学期望&#xff0c;方差为的正态分布记为。其概率密度函数为正态分布的期望值决定了其位置&#xff0c;其标准差决定了分布的幅度。当, 时的正态…

清除Linux的无用日志

2019独角兽企业重金招聘Python工程师标准>>> journalctl --vacuum-size10M 将清掉/var/log/journal的日志文件&#xff08;如果你有运行终端脚本&#xff0c;且有输出&#xff0c;那么这些输出将记录在这个目录下&#xff0c;日积月累会有可观的无用信息&#xff09…

李宏毅机器学习之Tips of Deep Learning

建立deep learning的三个步骤 define a set functiongoodness of functionpick the best function做完这些事之后我们可以得到一个neural network。在得到neural network之后&#xff0c;我们需要判断神经网络的表现。 一、判断神经网络的表现 1.1 神经网络的表现以及解决方案…

APP推广新机遇在哪里?

移动用户剧增&#xff0c;所有人都看到了这一块的机遇。这时APP越来越多&#xff0c;线上流量相对开始分散&#xff0c;那么&#xff0c;以后APP推广得新机遇在哪里&#xff1f; 1、移动媒体 这块虽然也是一片红海了&#xff0c;但是你花几十万去包公交车&#xff0c;还是没有这…

李宏毅机器学习之CNN

一、Why CNN for image&#xff1f; 一些patterns对于整个Image来说非常小&#xff0c;所以通常只需要看一个Image的一小部分就可以了。同样的pattern可能出现在Image的不同的部分对于一张Image可以做subsampling(下采样)&#xff0c;比如&#xff1a;把一张image的奇数行&…

sql--CONVERT、FOR XML PATH解决实际问题

原文:sql--CONVERT、FOR XML PATH解决实际问题需求&#xff1a;每个平台分类下的门店&#xff0c;每个门店的名称、图片路径、评分&#xff0c;每个门店下的四个产品的名称、图片路径、评分 思路&#xff1a; 一开始门店动态化好写&#xff0c;用Ajax就行了。但是每个门店下面的…

李宏毅机器学习之RNN

一、应用举例 Slot Filling 假设订票系统听到用户说&#xff1a;“ i would like to arrive Taipei on November 2nd”&#xff0c;你的系统有一些slot(有一个slot叫做Destination&#xff0c;一个slot叫做time of arrival)&#xff0c;系统要自动知道这边的每一个词汇是属于哪…

redis-dump之can't find gem redis-dump

基于上篇博文CentOS6.10安装redis-dump小插曲继续下面的介绍 一、redis-dump工具简单说明 退出bash shell窗口重新登录bash [rootMQ1-S ~]# find / -name redis-dump /usr/local/rvm/gems/ruby-2.3.7/bin/redis-dump /usr/local/rvm/gems/ruby-2.3.7/gems/redis-dump-0.4.0/bi…

ES6 系列之 WeakMap

前言 我们先从 WeakMap 的特性说起&#xff0c;然后聊聊 WeakMap 的一些应用场景。 特性 1. WeakMap 只接受对象作为键名 const map new WeakMap(); map.set(1, 2); // TypeError: Invalid value used as weak map key map.set(null, 2); // TypeError: Invalid value used as…

李宏毅机器学习之Semi-supervised Learning

一、监督学习与半监督学习 在supervised里面&#xff0c;你就是有一大推的training data&#xff0c;这些training data的组成是一个function的input跟output&#xff0c;假设你有R笔train data&#xff0c;每一笔train data有。假设是一张image&#xff0c;是class label。se…

给跳槽伤到腿的你

问&#xff1a;跳槽3次且每段工作不超过1年半&#xff0c;面试官一看到我的简历就说想找个长期稳定的&#xff0c;这种情况下怎么回答&#xff1f; 分析&#xff1a; 这不是一个问句&#xff0c;要尝试去听面试官没有说出来的话。通常面试官问这个问题&#xff0c;隐性的意思是…

day14 知识点串讲(下)--文件属性

第1章 Vim执行故障编辑文件的时候突然断电1.1 #vim快捷键 创建环境 [rootoldboyedu50-lnb ~]# cat /etc/services /etc/sysconfig/network-scripts/ifcfg-eth0 >>/tmp/vim.log[rootoldboyedu50-lnb ~]# cd /tmp/[rootoldboyedu50-lnb /tmp]# vim vim.log 1.2 移动光标1…

概率论与数理统计之随机试验与随机时间样本空间与事件的集合表示

引言 确定性(必然)&#xff1a;一定发生&#xff08;不发生&#xff09;随机&#xff08;偶然&#xff09;&#xff1a;可能发生&#xff0c;可能不发生统计规律&#xff1a;对事情做大量的重复的试验试图找出某种规律 1.1.1 随机试验和随机事件 试验&#xff1a;观察、测量、…

李宏毅机器学习作业之PM2.5预测

import pandas as pd import numpy as np import math import csv数据预处理 # 读取数据csv文件&#xff0c;将csv文件保存为矩阵 # 这里read_csv的作用是读取csv文件 data pd.read_csv("/Users/tiger/Desktop/study/机器学习/李宏毅机器学习/李宏毅机器学习资料/数据/h…

DNS分离解析教学 超简单!

DNS分离解析原理及作用DNS分离解析即将内外网的相同域名解析为不同的IP地址。来自不同地址的请求解析同一个域名时&#xff0c;为提供不同的解析结果。现实网络中一些电商网站为了让用户有更好的体验效果解析速度更快&#xff0c;就把来自不同运营商的用户解析到相对应的服务器…

swagger api 转graphql npm 包试用

graphql 比较方便的进行api 的查询&#xff0c;操作&#xff0c;swagger 是一个方便的open api 描述标准&#xff0c;当前我们有比较多的 restapi 但是转换为graphql 是有成本的&#xff0c;还好swagger-to-graphql 这个npm 包帮助我们简化了操作 基本项目 具体项目参考 https…
最新文章