iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java高并发测试框架JCStress详解
  • 337
分享到

Java高并发测试框架JCStress详解

2024-04-02 19:04:59 337人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

前言 如果要研究高并发,一般会借助高并发工具来进行测试。JCStress(Java Concurrency Stress)它是Openjdk中的一个高并发测试工具,它可以帮助我们研

前言

如果要研究高并发,一般会借助高并发工具来进行测试。JCStress(Java Concurrency Stress)它是Openjdk中的一个高并发测试工具,它可以帮助我们研究在高并发场景下JVM,类库以及硬件等状况。

JCStress学起来很简单,而且官方也提供了许多高并发场景下的测试用例,只要引入一个jar包,即可运行研究。

如何使用JCStress

此演示用Maven工程,首先需要引入jar包,核心包是必须要的,样例包非必须要,此是为了演示其中的例子。


<dependencies>
    <!-- jcstress 核心包 -->
    <dependency>
        <groupId>org.openjdk.jcstress</groupId>
        <artifactId>jcstress-core</artifactId>
        <version>0.3</version>
    </dependency>
    <!-- jcstress测试用例包 -->
    <dependency>
        <groupId>org.openjdk.jcstress</groupId>
        <artifactId>jcstress-samples</artifactId>
        <version>0.3</version>
    </dependency>
</dependencies>

先写一个简单测试用例,一些注解不明白可以先不管,后面会讲解。此样例会在高并发下调用actor1和actor2方法各一次,按照正常逻辑,x最后的值要么是-1要么是5,如果actor2方法内的2行代码发生了指令重排序,就会导致x的值可能为0。


package com.nobody;

import org.openjdk.jcstress.annotations.*;
import org.openjdk.jcstress.infra.results.I_Result;


@JCStressTest // 标记此类为一个并发测试类
@Outcome(id = {"0"}, expect = Expect.ACCEPTABLE_INTERESTING, desc = "wrong result") // 描述测试结果
@Outcome(id = {"-1", "5"}, expect = Expect.ACCEPTABLE, desc = "nORMal result") // 描述测试结果
@State //标记此类是有状态的
public class TestInstructionReorder {

    private boolean flag ;
    private int x;

    public TestInstructionReorder() {}

    @Actor
    public void actor1(I_Result r) {
        if (flag) {
            r.r1 = x;
        } else {
            r.r1 = -1;
        }
    }

    @Actor
    public void actor2(I_Result r) {
        this.x = 5;
        flag = true;
    }
}

配置程序的主类,org.openjdk.jcstress.Main是JCStress自带的一个启动类;然后可以配置-t参数设置需要测试的类,当然 -t 后面也可以指定包名,表示执行指定包下的所有测试类。如果不指定-t参数,默认会扫描项目下所有包的类。

运行程序,结果显示,x的值出现了0,-1,5三种结果,其中值为0不是我期待的,但是它在高并发下确实出现了,虽然相比其他值(几十万次)出现的概率(200多次)很低。

有些人会说用jmeter工具不也可以测试高并发,但是它们的侧重点还是不一样的,jmeter侧重对于接口整体的响应速度等进行测试,而JCStress框架能对某块逻辑代码进行高并发测试,更加侧重JVM,类库等领域的研究。

而且,JCStress会考虑不同JVM参数设置下的测试,而且自动帮我们设置,例如上图所示[-XX:-TieredCompilation]。

除了命令行窗口显示的测试结果之外,还会在项目所在的目录下生成 results文件夹,生成测试结果文档,其中index.html是测试总览,其他html文件是每个测试类的报告,结合结果数据结构可视化图形更加容易理解。

JCStress 注解说明

@JCStressTest

标记一个类为并发测试的类,它有一个org.openjdk.jcstress.annotations.Mode枚举类型的属性value。Mode.Continuous模式表示会运行几个Actor,Ariter线程,并收集统计结果。Mode.Termination模式代表运行具有阻塞/循环操作的单个Actor,看是否响应Singal信号。

@State

标记一个类是有状态的,即拥有可以读写的数据,例如上例的x和falg。State类只能是public的,不能是内部类(可以是静态内部类),并且得有一个默认构造方法。

@Outcome

描述测试的结果,它有3个属性,id属性为一个字符串数组,表示接收的结果,支持正则表达式;expect表示对观测结果的期望,它的值是一个枚举值;desc属性指定一个易于人类理解的对结果的描述。@Outcomes注解可以组合多个结果注解。

@Actor

@Actor是一个中心测试注解,它标记的方法会被一个特定的线程调用,每一个对象的方法只能被调用一次。多个Actro方法调用顺序是不保证的,它们是并发执行的,方法可以抛出异常并且会导致测试失败。Actor方法所在的类必须有State或者Result注解。

@Arbiter

它的作用其实和@Actor差不多,但是Arbiter标记的方法调用是在所有@Actor标记的方法调用之后,所以它标记的方法一般作为收集最后的结果来使用。

@Signal

此注解也是标记方法的,但是它是在JCStressTest的Termination模式下工作的,它的调用是在所有Actor之后。

@Result

它标记的类被作为测试结果的类,JCStress自带的org.openjdk.jcstress.infra.results包下就有大量的测试结果类,不同的类可以用来保持不同的结果。例如I_Result类有一个int类型的变量r1;II_Result类有2个int类型的变量r1和r2。

JCStress 插件

有一个插件集成了JCStress和Gradle,我们只需要在build.gradle中引入此插件,即可使用插件命令来进行测试。插件依赖为jcstress-gradle-plugin。

build.gradle文件如下,不同版本的插件集成了默认的JCStress版本,当然我们也可以自定义更改,如下最后一行所示。


apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'jcstress'

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'com.GitHub.erizo.gradle:jcstress-gradle-plugin:0.8.1'
    }
}


ext {
    jcstressVersion = '0.7'
}

repositories {
    jcenter()
}

dependencies {
    compile "org.openjdk.jcstress:jcstress-core:${jcstressVersion}"
}

jcstress {
    jcstressDependency "org.openjdk.jcstress:jcstress-core:${jcstressVersion}"
}

然后在项目即可编写测试类,例如还是上面那个例子,最后我们在项目根目录下执行 gradle jcstress,即可显示测试结果。也可以通过参数指定要测试的类,例如 gradle jcstress --tests "TestInstructionReorder"

插件源码地址:https://github.com/jerzykrlk/jcstress-gradle-plugin

到此这篇关于Java高并发测试框架JCStress的文章就介绍到这了,更多相关Java高并发JCStress内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java高并发测试框架JCStress详解

本文链接: https://www.lsjlt.com/news/123056.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java高并发测试框架JCStress详解
    前言 如果要研究高并发,一般会借助高并发工具来进行测试。JCStress(Java Concurrency Stress)它是OpenJDK中的一个高并发测试工具,它可以帮助我们研...
    99+
    2022-11-12
  • Java优秀测试框架TestNG详解
    目录我们为什么需要TestNG?TestNG搭建TestNG注解及功能TestNG配置文件1.新增配置文件2.配置测试套件(suit)3.配置测试案例TestNG测试1.异常测试2....
    99+
    2022-11-13
  • UnitTest单元测试框架详解
    一、什么是Unittest框架 unittest是python自带的一个单元测试框架,不仅适用于单元测试,还可用于Web、Appium、接口自动化测试用例的开发与执行;此框架可以组织执行测试用例,并且...
    99+
    2023-09-03
    python 单元测试
  • Python测试框架pytest高阶用法全面详解
    目录前言1.pytest安装1.1安装1.2验证安装1.3pytest文档1.4 Pytest运行方式1.5 Pytest Exit Code 含义清单1.6&n...
    99+
    2022-11-11
  • Python+selenium自动化测试框架详解
    目录自动化测试框架1.基础层(通用层)2.功能层(页面层)3.业务层4.用例层4层框架对应的项目工程总结 自动化测试框架 项目自动化测试框架设计为4层 1.基础层(通用层) 基础层:...
    99+
    2022-11-12
  • Java多线程高并发中的Fork/Join框架机制详解
    1.Fork/Join框架简介 Fork/Join 它可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出。Fork/Join 框架要完成...
    99+
    2022-11-12
  • 详解Java单元测试之Junit框架使用教程
    目录单元测试Junit单元测试框架单元测试快速入门单元测试 单元测试就是针对最小的功能单元编写测试代码,Java程序最小的功能单元是方法,因此,单元测试就是针对Java方法的测试,进...
    99+
    2022-11-13
  • Java并发中的Fork/Join 框架机制详解
    什么是 Fork/Join 框架 Fork/Join 框架是一种在 JDk 7 引入的线程池,用于并行执行把一个大任务拆成多个小任务并行执行,最终汇总每个小任务结果得到大任务结果的特...
    99+
    2022-11-12
  • Java使用junit框架进行代码测试过程详解
    我写了一个时间工具类 DateTimeUtil, 里边有一个格式化为字符串的方法 现在我写了一个main函数来测试这个方法 package com.example; import j...
    99+
    2023-02-27
    Java junit代码测试 Java代码测试
  • Python测试框架pytest核心库pluggy详解
    目录代码案例实例化:添加到钩子定义中 (add_hookspecs)注册插件 register运行插件 pm.hook.myhook代码案例 import pluggy # Hook...
    99+
    2022-11-11
  • Java使用JMeter进行高并发测试
    目录常见的压力测试工具:使用JMeter进行高并发测试1.下载并安装JMeter2.使用JMeter进行测试3.生成测试报告4.分析测试报告软件的压力测试是一种保证软件质量的行为.在...
    99+
    2022-11-12
  • React团队测试并发特性详解
    目录引言遇到的困境1. 如何表达渲染结果?2. 如何测试并发环境?React的应对策略实现一个渲染器如何测试并发环境?总结引言 React18进入大家视野已经有一段时间了,不知道各位...
    99+
    2022-11-13
  • java高并发的并发级别详解
    目录阻塞无饥饿(Starvation-Free)无障碍(Obstruction-Free)无锁(Lock-Free)等待总结阻塞、无饥饿、无障碍、无锁、无等待几种。 阻塞 一个线程是...
    99+
    2022-11-12
  • 使用Java中的并发库和框架实现高并发
    文章目录 使用Java中的并发库和框架实现高并发背景介绍技术原理及概念基本概念解释技术原理介绍 Java多线程Java线程池Java异步编程Java并发控制相关技术比较实现步骤与流程准备...
    99+
    2023-10-06
    java jvm 网络
  • Java面试必备之JMM高并发编程详解
    目录一、什么是JMM二、JMM定义了什么原子性可见性有序性三、八种内存交互操作四、volatile关键字可见性volatile一定能保证线程安全吗禁止指令重排序volatile禁止指...
    99+
    2022-11-13
  • Python自动化测试框架之unittest使用详解
    目录1 unittest框架2 批量执行脚本2.1 构建测试套件2.2 用例的执行顺序2.3 忽略用例执行3 unittest断言4 HTML报告生成5 异常捕捉与错误截图6 数据驱...
    99+
    2023-05-18
    Python unittest Python 自动化测试框架 Python unittest框架
  • Java如何使用JMeter进行高并发测试
    这篇文章主要介绍了Java如何使用JMeter进行高并发测试,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。软件的压力测试是一种保证软件质量的行为.在金融,电商等领域应用比较普...
    99+
    2023-06-25
  • 面试Java开发岗位必备技能之Load框架详解!
    Load框架是一种轻量级的Java Web框架,它是由国内知名的互联网公司开发的,具有简单易用、高效稳定、灵活扩展等特点,目前已经广泛应用于各大互联网公司的Java Web项目中。 下面,我们将详细介绍Load框架的核心特性和使用方法。 ...
    99+
    2023-11-09
    load 框架 面试
  • 基于Selenium+Python的web自动化测试框架详解
    目录 一、什么是Selenium? 二、自动化测试框架 三、自动化框架的设计和实现 四、需要改进的模块 五、总结 一、什么是Selenium? Selenium是一个基于浏览器的自动化测试工具,它提供了一种跨平台、跨浏览器的端到端的we...
    99+
    2023-09-28
    python selenium 前端 pytest 职场和发展 自动化 运维
  • google c++程序测试框架googletest使用教程详解
    目录什么是googletest?googletest简介谁在使用 GoogleTest?相关开源项目googletest的下载与编译cmake gui编译在vs2019中使用...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作