java-利用单元测试junit测试接口的多线程并发性能

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

1.开发中遇到的实际问题

开发一个业务接口功能的过程中由于没有充分考虑到前端的并发调用导致接口数据有误。对于这样一个问题首先要定位问题出现的原因根据网关调用的日志链路排查。接口主要是在reids中存入对应数据也redis写数据进行了幂等。但是没充分考虑到线上的连续调用测试也没有对接口进行并发测试。
确定可能是因为并发导致的接口返回数据问题因此先对接口进行并发测试复现并发调用出现的问题并且提供解决方案

2.利用单元测试来测试多线程

  • 遇到的问题
    当在单元测试中启动多个线程但是多个线程启动或者执行比较耗时的情况下Test线程结束后会直接结束所有的线程创建的多个线程不会去执行。

  • 解决方案
    最简单的方法就是让主线程阻塞等待其他子线程执行完毕之后继续比如可以让主线程睡眠几秒钟。

    TimeUnit.SECONDS.sleep(10);

或者使用join方法join() 的作用让“主线程”等待“子线程”结束之后才能继续运行。

类似

Thread threadA = new Thread(connectionThread);
Thread threadB = new Thread(connectionThread);
threadA.start();
threadB.start();
threadA.join();
threadB.join();

这样多个线程可以一起执行。不过线程多了这样写比较麻烦。

  • 多线程测试接口案例–复现线上问题
  /**
   * 测试单车评价选择接口的多线程并发
   */
  @Test
  public void multiThreadSelectTest() throws InterruptedException {


    OrderRateSettingsSelectReqDTO reqDTO =  new OrderRateSettingsSelectReqDTO();
    reqDTO.setOrderType(BizTypeEnum.BIKE.getValue());
    reqDTO.setOrderGuid("16683970396451200496215");


    for(int i=0;i<2;i++){
      new Thread( () -> {
        System.out.println(Thread.currentThread().getName());
        Result<OrderRateSettingsSelectResDTO> result =  bikeRateService.bikeOrderRateSettingsSelect(reqDTO);
        System.out.println(JSON.toJSONString(result));
      }).start();
    }

    TimeUnit.SECONDS.sleep(10);


  }

上面单测案例运行之后打印输出结果

Thread-34
Thread-33
{"code":0,"data":{"carrierId":"16683970396451200496215","needRate":true,"rateToken":"78f1828b-600e-4392-a708-9cf9b0811894","settingsId":"151889654407250000","userNewId":1200496215},"msg":"ok","success":true}

{"code":0,"data":{"carrierId":"16683970396451200496215","needRate":true,"rateToken":"828b-600e-4392-a708-9cf9b0811894","settingsId":"151889654407250000","userNewId":1200496215},"msg":"ok","success":true}

上述结果表明接口多线程并发的返回结果token结果不一致没有达到接口的幂等需要。底层redis并发调用导致创建的token被覆盖。最简单的解决方案是家并发锁并发调用的时候只有一个线程可以执行接口从而有效的解决了这个线上问题。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java

“java-利用单元测试junit测试接口的多线程并发性能” 的相关文章

shell输出

echo:一般带换行,但unix各版本间互不相同的行为模式使得echo的可移植性变得很困难,不过它仍是最简单的一种输出方式. echo hello world printf:模仿c程序库里的prinf()库程序.它几乎复制了该函数所有的功能.但如果你想换行....

Java单例模式复习(二)

心血来潮,在学学单例模式,以下是代码块,延迟加载的单例的执行,实现代码如下:package singleton; /** * 延迟加载的单例的执行 * @author Administrator * */ public class SingletonLazy { private...

Vim

日常常用到多行合并的功能,记录如下: 第一种, 多行合并成一行,即: AAAAABBBBBCCCCC合并为:AAAAA BBBBB CCCCC 方法1: normal状态下 3J 其中的3是范围,可以是书签或者搜索位置等方式实现,J为合并 注: 如果改为3gJ的话,则合...

Oracle

1、 开始->设置->控制面板->管理工具->服务 停止所有Oracle服务。2、 开始->程序->Oracle - OraHome81->Oracle Installation Products->Universal Installer 卸装所有Oracle产品,但Univer...

linux

查看ubuntu的资源占用的命令为$: top top命令就可以查看内存,cpu和进程了,很方便 top: 主要参数 d:指定更新的间隔,以秒计算。 q:没有任何延迟的更新。如果使用者有超级用户,则top命令将会以最高的优先序执行。 c:显...

Nginx配置IP拦截

最近百家饭团队开源了一个Nginx日志分析工具APIcat这周在生成报告的基础上实现了基于Nginx的自动拦截防护正好研究了一下Nginx配置IP拦截的配置 配置方式 nginx配置ip拦截基本是通过deny和allow两个配置关键字来实现的。可以配置单ip的拦截放行也可以配置网段的拦截放行比如...