代码功能测试_性能测试监控工具介绍

代码功能测试_性能测试监控工具介绍ContiPerf 是一个轻量级的测试工具,基于JUnit 4 开发,可用于效率测试等。可以指定在线程数量和执行次数,通过限制最大时间和平均执行时间来进行性能测试。

“这是我参与8月更文挑战的第25天,活动详情查看:8月更文挑战

一、前言

做性能的同学一定遇到过这样的场景:应用级别的性能测试发现一个操作的响应时间很长,然后要花费很多时间去逐级排查,最后却发现罪魁祸首是代码中某个实现低效的底层算法。这种自上而下的逐级排查定位的方法,效率通常都很低,代价也很高。所以,我们就需要在项目早期,对一些关键算法进行代码级别的性能测试,以防止此类在代码层面就可以被发现的性能问题,遗留到最后的系统性能测试阶段才被发现。但是,从实际执行的层面来讲,代码级性能测试并不存在严格意义上的测试工具,通常的做法是:改造现有的单元测试框架

而最常使用的改造方法是:

  • 将原本只会执行一次的单元测试用例连续执行 n 次,这个 n 的取值范围通常是 2000~5000;
  • 统计执行 n 次的平均时间。如果这个平均时间比较长(也就是单次函数调用时间比较长)的话,比如已经达到了秒级,那么通常情况下这个被测函数的实现逻辑一定需要优化。

这里之所以采用执行 n 次的方式,是因为函数执行时间往往是毫秒级的,单次执行的误差会比较大,所以采用多次执行取平均值的做法。

那么有没有现成的这样的测试工具呢?当然也是有的,比如今天我们介绍的主角– ContiPerf

二、ContiPerf 简介

ContiPerf 是一个轻量级的测试工具,基于JUnit 4 开发,可用于效率测试等。可以指定在线程数量和执行次数,通过限制最大时间和平均执行时间来进行性能测试。

官网地址:sourceforge.net/p/contiperf…

三、ContiPerf 使用

接下来我们一起来实践一个例子,

首先,加入 pom 依赖包:

   <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <!--引入 ContiPerf 测试工具-->
        <dependency>
            <groupId>org.databene</groupId>
            <artifactId>contiperf</artifactId>
            <version>2.3.4</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency><dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <scope>test</scope>
    </dependency>

这里为了演示,编写了一个简单的测试接口: UnitTestService.java

/** * 测试接口类 * @author zuozewei * */
public interface UnitTestService {
	
	public String process(String msg);

}

实现类:UnitTestServiceImpl.java

@Service
public class UnitTestServiceImpl implements UnitTestService {

	/** * 为了测试,这里直接返回传入的值 */
	@Override
	public String process(String msg) {
		// TODO Auto-generated method stub
		return msg;
	}
}

编写 UnitTestServiceTest 测试类,进入 ContiPerfRule。

/** * 编写接口性能测试类 * @author zuozewei * */
@RunWith(SpringRunner.class)
@SpringBootTest //SpringBootTest 是springboot 用于测试的注解,可指定启动类或者测试环境等,这里直接默认。
public class UnitTestServiceTest {
	
	@Autowired
	UnitTestService testService;
	
	// 引入 ContiPerf 进行性能测试
	@Rule
	public ContiPerfRule contiPerfRule = new ContiPerfRule();

	@Test
	@PerfTest(invocations = 10000,threads = 100) //100个线程 执行10000次
	public void test() {
		String msg = "this is a test";
		String result = testService.process(msg);
		//断言 是否和预期一致
		Assert.assertEquals(msg,result);
	}
}

注意: @Rule 是J unit 提供的一个扩展接口注解,其接口类为:org.junit.rules.MethodRule,注意在 Junit5 中,已经被 TestRule 所替代了。 也可以通过对类指定 @PerfTest 和 @Required,表示类中方法的默认设置。

@PerfTest注解:

  • invocations:执行次数n,与线程数量无关,默认值为1
  • threads:线程池数量n,并发执行n个线程
  • duration:重复地执行时间n,测试至少执行n毫秒

@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。

运行测试,控制台会生成结果:

com.zuozewei.springbootcontiperfdemo.service.UnitTestServiceTest.test
samples: 10000
max:     331
average: 33.3522
median:  30

同时访问:target/contiperf-report/index.html,会生成图表: 在这里插入图片描述

注意:图表需要科学上网才能显示

图表中的指标:

  • Execution time: 执行时间
  • Throughput: TPS
  • Min. latency: 最小响应时间
  • Average latency: 平均响应时间
  • Median: 响应时间中位数
  • 90%: 90%响应时间范围
  • Max latency: 最大响应时间

四、小结

这里主要是对 Junit 和 ContiPerf 的使用简单的示例,在单元测试阶段的时候考虑做这种代码级性能测试,肯定会提高 ROI(投入产出比)的,而且代价非常小,希望本文对各位同学都能有所启发。

示例代码:

参考资料:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13617.html

(0)

相关推荐

  • MySQL MHA /usr/share/perl5/vendor_perl/MHA/ServerManager.pm, ln301] install_driver(mysql) failed: Attempt to reload DBD/mysql.pm aborted

    MySQL MHA /usr/share/perl5/vendor_perl/MHA/ServerManager.pm, ln301] install_driver(mysql) failed: Attempt to reload DBD/mysql.pm aborted在公司随便找3台测试机搭个MHA,下面这个问题折腾了三天,之前没遇到过,查了OS版本发现一致,可能是不同人弄的OS吧,知道是cpan的问题就是搞不定,郁闷。。。[root@test247 ~]# ma

    2022-12-24
    130
  • mysql -h -u_MySQL date

    mysql -h -u_MySQL date在mysql中,hint指的是“查询优化提示”,会提示优化器按照一定的方式来生成执行计划进行优化,让用户的sql语句更具灵活性;Hint可基于表的连接顺序、方法、访问路径、并行度等规则对DML(数据操

    2023-06-16
    155
  • Nginx 基本配置详解「建议收藏」

    Nginx 基本配置详解「建议收藏」Nginx基本配置备忘从属于笔者的服务端应用程序入门与实践,更多知识体系参阅2016:我的技术体系结构图:Web/ServerSideApplication/MachineLearning。Nginx

    2023-08-19
    136
  • Python:优化环境变量 Path,提高项目安全性

    Python:优化环境变量 Path,提高项目安全性在操作系统中,环境变量 Path 用来指定搜索可执行文件的路径,也就是说,当执行一个命令或者运行一个程序时,操作系统会在环境变量 Path 中所包含的路径下寻找对应的可执行文件。

    2024-04-05
    67
  • MySQL优化之慢查询日志「终于解决」

    MySQL优化之慢查询日志「终于解决」慢查询日志概述 所谓慢查询日志,就是用于记录MySQL中响应时间超过设定阈值的SQL语句,通过打开慢查询开关,MySQL会将大于阈值的SQL记录在日志中,以便于分析性能。 慢查询日志选项默认是关闭的,

    2023-02-12
    166
  • Python的Series用法

    Python的Series用法Python是一种高级编程语言,被广泛应用于数据分析、人工智能、机器学习等领域。在Python的标准库pandas中,Series是一种核心数据结构,用于存储一维数组,并且支持基于标签的索引和数据处理。

    2024-04-15
    101
  • mysql 慢sql查询_web服务器反应慢的排查方法

    mysql 慢sql查询_web服务器反应慢的排查方法company_id和odds_typeid的值并不够散列(company_id表少于1k条就表示不够散列),不必要创建索引。 出现慢sql警告,排查语句是否有问题。 mysql> SELECT *…

    2023-03-26
    169
  • Python使用OS删除文件夹

    Python使用OS删除文件夹在Python中使用OS模块可以方便地对文件进行各种操作,包括创建、复制、移动、查看等等。其中,删除文件夹也是常见的操作之一,比如在清理文件夹时需要删除不需要的文件夹等。下面我们将介绍如何使用Python的OS模块删除文件夹。

    2024-09-13
    25

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注