精华内容
下载资源
问答
  • 因为公司在用java和.net的Netty开发云盘,发现java服务端写得有问题,老断线或返不回数据,所以才写这个测试程序来证明DotNetty的客户端可以实现10W以上的并发,本源代码有提供server和client。代码容易看懂。
  • 主要介绍了在Java内存模型中测试并发程序代码,辅以文中所提到的JavaScript库JCStress进行,需要的朋友可以参考下
  • 并发编程11-测试并发程序

    千次阅读 2015-02-16 15:25:10
    - 安全性 并发不会造成状态错误。 - 活跃度 主要是性能测试 - 吞吐量 段时间定资源内可以处理的任务数量 - 响应性 从请求到完成一些动作之前的延迟(等待执行的时间) - 可伸缩性 增加资源,提高性能

    测试的两个方面:
    - 安全性 并发不会造成状态错误。
    - 活跃度 主要是性能测试
    - 吞吐量 段时间定资源内可以处理的任务数量
    - 响应性 从请求到完成一些动作之前的延迟(等待执行的时间)
    - 可伸缩性 增加资源,提高性能

    正确性测试

    所有加入队列的都会被执行:
    一般的可行的办法是把加入队列的列表和消费的列表保存起来进行比较。但是因为会设计资源的并发,影响对本身的测试,比较好的办法是在队列中加入唯一的id,然后对id求和,消费时同样求和,来比较结果。这样能最小的影响实际要测试的结果。

    public class PutTakeTest {
        private static final ExecutorService pool = Executors.newCachedThreadPool();
        private final AtomicInteger putSum = new AtomicInteger(0);
        private final AtomicInteger takeSum = new AtomicInteger(0);
        private final int nTrials, nPairs;
        private final BlockingQueue<Integer> queue;
    
        public static void main(String[] args) {
            new PutTakeTest(10000).test();
        }
    
        public PutTakeTest(int nTrials){
            nPairs = 10;    // 生产者及消费者的个数
            this.nTrials = nTrials;     // 每次生产或者消费多少个
            queue = new ArrayBlockingQueue<Integer>(10);
        }
    
        public void test(){
            for (int i = 0; i < nPairs; i++) {
                pool.execute(new Producer());
                pool.execute(new Consumer());
            }
            pool.shutdown();
            try {
                pool.awaitTermination(10, TimeUnit.SECONDS);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(putSum.get());
            System.out.println(takeSum.get());
        }
    
        class Producer implements Runnable{
            @Override
            public void run() {
                int sum = 0;
                try {
                    for (int i = 0; i < nTrials; i++) {
                        int seed = new Random().nextInt(10000);     // 随机数,用来做sum,最后跟消费者的sum做比较来确定所有入队的都已经被出队消费
                        sum += seed;
                        queue.put(seed);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                putSum.getAndAdd(sum);
            }
        }
    
        class Consumer implements Runnable{
    
            @Override
            public void run() {
                int sum = 0;
                try {
                    for (int i = 0; i < nTrials; i++) {
                        int seed = queue.take();
                        sum += seed;
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                takeSum.getAndAdd(sum);
            }
        }
    }

    按照上面的代码,实际上出于并行状态的线程并不多,可以使用关卡这种类型的信号量,来让所有的线程同时启动,再同时计算,提升并发的操作。

    性能

    吞吐量
    基于上面的代码,其实在最开始和最后加入时间差的计算就可以粗略估算了
    另外还可以借助关卡的特性,在最后回调的时候得到时间
    响应性
    即完成一个任务所需要的时间

    性能测试陷阱

    如果测试过程中恰巧多次出发了垃圾回收,那么就有可能把gc的时间算到实际运行的实践中。解决办法
    - 使用-verbose:gc来停止垃圾回收的运行
    - 第二种就是运行足够长的时间了
    另外动态编译也可能会造成数据的不准确,可以使用-xx:+PrintCompilation来查看动态编译的时间,长时间运行测试程序,减少动态编译的影响
    另外要考虑不且实际的竞争程度, 影响吞吐量通常是因为边界清晰小人物,大部分的时间都来源于上线问切换,而对于一些锁竞争比较多的程序可能影响最大的是锁竞争的程度,要根据不同情况制定具体的策略。

    代码检查

    • 调用Thread.run,应该是.start
    • 显示锁未释放
    • 空synchronized块
    • 双检查锁, 因为可见性的问题及重排序的问题
    • 从构造函数中启动线程,造成了this的溢出
    • notify通常伴随着状态改变使用
    • wait方法通常会出现在持有锁,循环以及含有测试某个状态的谓词(if())
    • Thread.sleep会持有锁会对活跃度造成影响要注意
    • 忙等待 while(a.equals(“”))这样的结果,如果域不是volatile的可能不会及时得到状态变更,可以使用锁通知等更好的方式。
    展开全文
  • 并发程序测试概述

    千次阅读 2013-08-04 10:45:29
    一 传统程序测试: 二 并发程序测试: (一)非确定性测试: (二)确定性测试: (三)可达性测试

    一  传统程序测试:

    (一)是否关心软件内部和实现划分:

    1.黑盒测试:又称功能测试,通过测试来检验每个功能是否正常。从用户的角度,从输入数据和输出数据的对应关系出发进行测试。

    2.白盒测试:又称结构型测试,按照程序内部的结构来测试程序。六种:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖发现错误的能力呈由弱至强的变化。

    3.灰盒测试:是介于白盒测试与黑盒测试之间的,可以这样理解,灰盒测试关注的是输出对于输入的正确性,同时也关注内部表现。


    (二)从是否执行程序来划分:

    1.静态测试:是指不运行被测程序本身,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性。对需求规格说明书、软件设计说明书、源程序做结构分析、流程图分析、符号执行来找错。

    2.动态测试:指通过运行被测程序,检查运行结果与预期结果的差异,并分析运行效率和健壮性等性能,这种方法由三部分组成:构造测试实例、执行程序、分析程序的输出结果。


    (三)从软件开发阶段划分:

    1.单元测试

    2.集成测试

    3.确认测试

    4.系统测试


    二 并发程序测试:

    (一)并发程序测试概述:

    1.并发测试过程中,不仅需要检查程序输入和输出结果的正确性,还需要验证并发程序中某些同步序列的正确性。同步序列:并发程序的一次执行过程中,由一些并发单元之间的交互或同步活动形成的序列。

    2.并发错误类型:

    *根据规格说明和程序实现的一致性要求,可将并发程序的同步序列分为有效同步序列和可行同步序列。

    *有效同步序列:给定某并发程序CP和输入X,若同步序列Q被程序规约允许,则称Q是CP的有效同步序列。

    *可行同步序列:若同步序列Q被程序实现允许,则称Q为可行同步序列。反之,不可行。

    *当满足下述任一条件时,并发程序在输入X下是错误的:在输入X下至少有一个同步序列可行但不是有效,或者至少有一个同步序列有效但不可行。

    *在所有可能的输入的条件下都是正确的,那么并发程序CP是正确的。


    (二)非确定性测试:

    1.不确定性测试使用的测试输入不包含任何同步序列信息,除了对被测程序提供必要的输入数据,它不控制被测程序的具体执行过程。不确定性测试期望通过并发程序的多次执行尽可能多地执行不同的同步序列,以增加发现错误的机会。


    2.非确定性测试的步骤:

    *选取一组输入数据;

    *使用输入数据执行被测并发程序,记录每次执行的输出数据和执行的同步序列;

    *判断输出数据是否正确以及对应的同步序列是否有效,如果输出数据不等于预期结果或者同步序列无效,都表示并发程序中存在错误。

    *重复2到3,直至到达结束条件。


    3.非确定性测试的问题:

    *同一输入下并发程序的一部分同步序列可能重复执行,而另一部分同步序列可能从未得到执行,测试效率低且充分性得不到保证。

    *非确定性测试是基于程序实现的测试方法,不能检测出规格说明有效但是不可行的同步序列。


    (三)确定性测试:

    1.确定性测试:在给定测试输入下通过程序运行时控制技术,使其按照给定的同步序列执行,从而检查程序的输出结果是否正确,并判断给定的同步序列(有效)是否可行。

    2.确定性测试步骤:

    *选取一组输入数据和一个同步序列集合;

    *控制并发程序在给定输入下按照同步序列集合中的同步序列执行;

    *将程序执行结果与预期结果比较,除了要检查程序输出是否为预期输出外,还要检查程序是否能够执行给定的同步序列。如果输出数据域预期输出不符或同步序列不可行,都表示并发程序存在错误。

    *重复执行2和3,直到在任意输入数据下同步序列集合中的同步序列都已执行。

    3.确定性测试的问题:

    *同步序列的选取是难点。

    *确定性执行被测程序的技术实现:目前有两种方法。第一种,通过语言自身提供的机制确定化程序事件的执行顺序,即基于语言的方式。第二种,通过修改编译器或底层操作系统确定程序的执行过程,即基于实现的方式,对java而言就是修改java虚拟机。

    *基于语言的方式:易于实现,但对被测程序插装可能引入新的错误。

    *基于实现的方式:无需修改被测程序,但实现难度大,不易实现。


    (四)可达性测试:

    (1)定义:可达性测试结合了确定性测试和非确定性测试的优点,动态生成被测程序的同步序列,而且在给定输入的前提下能够穷尽被测程序的可行的同步序列。(这样就可以判断可行的同步序列是否是有效的,从而判断并发程序是否有错,所有可行的同步序列包括所有有效的同步序列)。

    (2)可达性测试的步骤:

    *给定输入下,以非确定性测试执行被测并发程序,收集执行的同步序列。

    *对收集到的同步序列执行竞争分析,计算出竞争变体。

    *以竞争变体为前缀确定性执行被测并发程序,然后以非确定性方式执行程序后续部分,收集执行的同步序列。

    *对每一个新的可行的同步序列,重复执行2和3,直到给定测试输入下没有新的可行的同步序列产生。


































    展开全文
  • Java7并发编程指南——第八章:测试并发应用程序@(并发和IO流)Java7并发编程指南第八章测试并发应用程序 思维导图 项目代码思维导图项目代码GitHub:Java7ConcurrencyCookbook

    Java7并发编程指南——第八章:测试并发应用程序

    @(并发和IO流)

    思维导图

    Java7并发编程指南——第八章:测试并发应用程序

    项目代码

    GitHub:Java7ConcurrencyCookbook

    展开全文
  • 锤子 用于测试高负载、高并发应用程序的负载工具
  • 使用 jcstress 测试并发程序确性

    千次阅读 2016-01-27 14:07:30
    使用 jcstress 测试并发程序确性

    步骤

    1.前往 此网址 ,注意网页左侧有下载链接,下载 jcstress zip 包

    2.下载 Mercurial ,安装。

    3.在 jcstress 主目录下构建并测试。

    mvn clean install -pl tests-custom -am
    java -jar tests-custom/target/jcstress.jar

    [可能遇到的问题]

    1.mvn 构建 jcstress 失败,提示错误为:cmd.exe \K "hg id -i" 执行失败,这是由于 hg id -i 命令执行失败的缘故,此命令是取得当前仓库的版本 id,深入分析发现是当前的 jcstress 目录不是一个仓库,故可以使用 hg -init 命令创建一个仓库,将 jcstress 目录拷入进去,再执行构建即可。

    参考文献

    Code Tools: jcstress


    附录:


    展开全文
  • 基于转换的方法,使用UML活动图测试并发程序
  • SQL并发数据访问的测试程序 描述 此Genero BDL演示可用于测试两个访问同一数据库表行的并发程序SQL命令。 先决条件 Genero BDL 3.20+ Genero Browser Client 1.00.52+ Genero桌面客户端3.20+ Genero Studio 3.20+...
  • java多线程并发之旅-35-并发程序测试.pdf
  • 一种基于转换的方法,用于使用UML活动图测试并发程序
  • 跟踪插装\并发错误模式的Java并发程序动态测试方法 跟踪插装\并发错误模式的Java并发程序动态测试方法 跟踪插装\并发错误模式的Java并发程序动态测试方法跟踪插装\并发错误模式的Java并发程序动态测试方法
  • Python实现的HTTP并发测试程序

    千次阅读 2019-07-09 20:47:47
    可修改变量thread_count指定最大的并发数量,即线程的数量。 完成之后,打印输出失败的次数,以及开始时间和结束时间,单位是毫秒。 主要是学习一下Python,仅供参考。 #!/usr/bin/python3 import sys, time, json,...
  • 并发程序测试 编写并发程序时候,可以采取和串行程序相同的编程方式。唯一的难点在于,并发程序存在不确定性,这种不确定性会令程序出错的地方远比串行程序多,出现的方式也没有固定规则。这对程序的应用会造成...
  • 并发实验 演示并发A / B测试扫描如何相互干扰的应用程序
  • 程序并发执行的特征

    千次阅读 2020-10-13 22:14:34
    1:间断性:程序并发执行的时候,因为是共享资源,以及完成同一项任务而相互合作,致使在这些并发执行的程序之间形成了相互制约的关系,导致程序执行呈现:执行--暂停--执行 2:失去封闭性:当系统中有多个并发...
  • 微信小程序并发的个人见解

    千次阅读 2017-10-29 17:01:35
    微信小程序的接口并发处理
  • ConFuzz将QuickCheck样式的基于属性的测试与覆盖率指导的模糊测试相结合,用于在事件驱动程序中查找并发错误。 ConFuzz基于基于属性的测试库并使用AFL查找并发错误。 有关更多技术详细信息,请参阅在 2021上发布的...
  • 程序并发执行

    2020-03-07 11:16:57
    今天学习了程序并发执行,并发执行,指两个或两个以上程序在计算机系统中,同时处于已开始执行且尚未结束的状态。能够参与并发执行的程序称为并发程序并发程序的执行和程序顺序执行的特征不同。 并发执行的特征...
  • 测试网站并发

    千次阅读 2016-05-26 14:23:26
    测试程序通过多线程模拟并发用户的办法来测试系统的并发处理能力,为了真实模拟用户行为,测试程序并不是启动多线程然后不停地发送请求,而是在两次请求之间加入一个随机等待时间,这个时间被称作思考时间。...
  • 程序并发执行时的特征

    千次阅读 2020-02-13 16:25:28
    间断性。程序并发执行时,由于他们共享资源等原因导致彼此间形成了相互制约的关系。 失去封闭性。 不可再现性。程序并发执行时由于不知道哪个程序会被优先执行导致处理结果可能出现不一致。 ...
  • 并发测试工具

    万次阅读 热门讨论 2019-06-15 14:40:47
    并发测试工具 一、Postman Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便...
  • EBS 并发程序配置

    千次阅读 2017-01-17 11:52:32
    本文档描述了EBS系统中的并发程序(即请求)和可执行程序的配置步骤,简要的介绍了如何配置一个简单的并发程序的过程。 一般的并发程序配置主要包含以下几个方面: 可执行(非必须)、并发程序、参数(非必须) 其中的并发...
  • HyperPacer并发测试

    千次阅读 2016-07-15 22:36:01
    并发测试场景设计用来对应用程序中多用户使用频次较高的单一功能模块,进行并行处理能力的技术性测试。通过并发测试,可以确定功能模块在特定软硬件环境下能够支撑的最大并发用户数、对比不同并发用户数下的用户响应...
  • 我在学习jmeter压力测试java web程序,现在的要求是“调整并发数,压到程序挂为止”,我不知道什么是并发数。 jmeter建好线程组后,有两个参数,一个是线程数,一个是循环次数。 我刚开始是把循环次数设置为1,...
  • 系统上线之前需要压力测试,本文以“模拟大量微信小程序用户对平台进行并发访问的性能测试”为案例说明。 一、用程序生成访客数据,最好是项目中在用编程语言,我这里用的是JAVA;因为是模拟小程序用户,所以需要...
  • 摘自:go并发编程实战 第二版 串行程序: 只能被顺序执行的指令列表。 并发程序: ...并发程序代表了所有可以实现并发行为的程序,包含了并行程序。   进程状态: 1.可运行状态(task_running...
  • 程序是为自己项目写的一个测试性能的小程序。 主要通过对服务器下载文件的并发响应进行统计。 使用多线程对服务器提供的链接地址下载文件, 能统计出并发情况下的下载速度,请不要开辟开多线程,以免导致服务器受...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 791,056
精华内容 316,422
关键字:

如何测试程序的并发