本文为作者原创,禁止转载,违者必究法律责任!!!

本文为作者原创,禁止转载,违者必究法律责任!!!

Java接口多线程并发测试

一,首先写一个接口post 请求代码:

  1. import org.apache.http.HttpEntity;
  2. import org.apache.http.HttpStatus;
  3. import org.apache.http.StatusLine;
  4. import org.apache.http.client.methods.CloseableHttpResponse;
  5. import org.apache.http.client.methods.HttpPost;
  6. import org.apache.http.entity.StringEntity;
  7. import org.apache.http.impl.client.CloseableHttpClient;
  8. import org.apache.http.impl.client.HttpClients;
  9. import org.apache.http.util.EntityUtils;
  10.  
  11. public class postRequest {
  12.  
  13. public static void postRequestTest(String para1, String para2, String para3 ) throws Exception {
  14. long begaintime = System.currentTimeMillis();//开始系统时间
  15. CloseableHttpClient httpclient = HttpClients.createDefault();
  16.  
  17. String url = "https://www.baidu.com";
  18. HttpPost httpPost = new HttpPost(url);// 创建httpPost
  19. httpPost.setHeader("Authorization", "Bearer qwertyu12345678zxcvbnm");
  20. httpPost.setHeader("Content-Type", "application/json");
  21. httpPost.setHeader("time", "11234567890");
  22. httpPost.setHeader("X-Accept-Locale", "zh_CN");
  23.  
  24. //添加 body 参数
  25. String orderToken = postRequest1(para1); //从上一个接口的返回数据里面获取参数
  26. String body = String.format("{\"Name\":\"%s\",\"age\":\"%s\",\"address\":\"%s\"}", para2, para3,orderToken);
  27.  
  28. httpPost.setEntity(new StringEntity(body));
  29.  
  30. //设置 params 参数-------------设置了body就不能再设置params
  31. //String params = "";
  32. //String charSet = "UTF-8";
  33. //StringEntity entity = new StringEntity(params, charSet);
  34. //httpPost.setEntity(entity);
  35.  
  36. CloseableHttpResponse response = null;
  37. try {
  38. response = httpclient.execute(httpPost);
  39. StatusLine status = response.getStatusLine();
  40. int state = status.getStatusCode();
  41. if (state == HttpStatus.SC_OK) {
  42. HttpEntity responseEntity = response.getEntity();
  43. String jsonString = EntityUtils.toString(responseEntity);
  44. System.out.println("TakegoOrder 接口请求成功");
  45. //return jsonString;
  46. System.out.println(jsonString);
  47. if(jsonString.contains("\"success\":true")&&jsonString.contains("\"time\":\"2018")){
  48. System.out.println("成功查询!!!!");
  49. }else {
  50. System.err.println("查询失败!!----"+body);
  51. }
  52.  
  53. }
  54. else{
  55. System.err.println("请求返回:"+state+"("+url+")");
  56. }
  57. }
  58. finally {
  59. if (response != null) {
  60. try {
  61. response.close();
  62. } catch (IOException e) {
  63. e.printStackTrace();
  64. }
  65. }
  66. try {
  67. httpclient.close();
  68. } catch (IOException e) {
  69. e.printStackTrace();
  70. }
  71. long endTime = System.currentTimeMillis(); //结束时间
  72. System.out.println(" 接口请求耗时 : "+(endTime-begaintime));
  73. }
  74. //return null;
  75. }

二,再写一个 MyThread 类 继承Runnable 接口

  1. import java.util.concurrent.CountDownLatch;
  2.  
  3. public class MyThread implements Runnable {
  4.  
  5. private String para1;
  6. private String para2;
  7. private String para3;
  8. private CountDownLatch countDownLatch; //多线程结束后,执行后面的代码(计算时间、数量)
  9.  
  10. public MyThread(String para1, String para2, String para3, CountDownLatch countDownLatch) {
  11. this.para1 = para1;
  12. this.para2 = para2;
  13. this.para3 = para3;
  14. this.countDownLatch = countDownLatch;
  15. }
  16.  
  17. public void run() {
  18.  
  19. try{
  20. postRequest.postRequestTest(para1, para2, para3);
  21. }catch(Exception e){
  22. e.printStackTrace();
  23. }finally {
  24. countDownLatch.countDown();
  25. }
  26. }
  27.  
  28. }

三,写一个test 类的main方法来执行多线程并发

  1. public class Test {
  2.  
  3. public static void main(String[] args) throws InterruptedException {
  4.  
  5. long begaintime = System.currentTimeMillis();//开始系统时间
  6.  
  7. //线程池
  8. ExecutorService pool = Executors.newCachedThreadPool();
  9. //设置集合点为93
  10. final int count = 50;
  11. CountDownLatch countDownLatch = new CountDownLatch(count);//与countDownLatch.await();实现运行完所有线程之后才执行后面的操作
  12. //final CyclicBarrier barrier = new CyclicBarrier(count); //与barrier.await() 实现并发;
  13. //创建100个线程
  14. for(int i = 0; i < count; i++){
  15.  
  16. MyThread target = new MyThread("para1", "para2", "para3", countDownLatch);
  17. //barrier.await();
  18. pool.execute(target);
  19. }
  20.  
  21. pool.shutdown();
  22. try {
  23. countDownLatch.await(); //这一步是为了将全部线程任务执行完以后,开始执行后面的任务(计算时间,数量)
  24. } catch (InterruptedException e) {
  25. e.printStackTrace();
  26. }
  27. long endTime = System.currentTimeMillis(); //结束时间
  28. System.out.println(count + " 个 接口请求总耗时 : "+(endTime-begaintime)+"-----平均耗时为"+ ((endTime-begaintime)/count));
  29. }
  30.  
  31. }

本文为作者原创,禁止转载,违者必究法律责任!!!

本文为作者原创,禁止转载,违者必究法律责任!!!

Java接口多线程并发测试 (一)的更多相关文章

  1. Java接口多线程并发测试 (二)

    原文地址http://www.cnblogs.com/yezhenhan/archive/2012/01/09/2317636.html 这是一篇很不错的文章,感谢原博主的分享! JAVA多线程实现和 ...

  2. Selenium & Webdriver 远程测试和多线程并发测试

    Selenium & Webdriver 远程测试和多线程并发测试 Selenium Webdriver自动化测试,初学者可以使用selenium ide录制脚本,然后生成java程序导入ec ...

  3. Java核心-多线程-并发控制器-Semaphore信号量

    Semaphore是非常有用的一个多线程并发控制组件(Java还有CountDownLatch.CyclicBarrier.Exchanger多线程组件),它相当于是一个并发控制器,是用于管理信号量的 ...

  4. Java核心-多线程-并发控制器-CountDownLatch倒数闩

    1.基本概念 CountDownLatch,中文名倒数闩,jdk并发工具包中一个并发控制器,它抽象了一个常见的多线程并发场景,开发人员使用它可以写出同时兼顾线程安全性与高效率的代码. 2.抽象模型 相 ...

  5. Python + gevent模块对单个接口进行并发测试 1

    本文知识点 利用gevent模块进行并发测试 代码如下 from gevent import monkey monkey.patch_all() import requests import geve ...

  6. Java中多线程并发体系知识点汇总

    一.多线程 1.操作系统有两个容易混淆的概念,进程和线程. 进程:一个计算机程序的运行实例,包含了需要执行的指令:有自己的独立地址空间,包含程序内容和数据:不同进程的地址空间是互相隔离的:进程拥有各种 ...

  7. [Java复习] 多线程&并发 知识点补充

    0. wait/notify/notifyAll的理解? wait:让持有该对象锁的线程等待: notify: 唤醒任何一个持有该对象锁的线程: notifyAll: 唤醒所有持有该对象锁的线程: 它 ...

  8. 利用Testng注释实现多线程并发测试

    Testng 是一款非常优秀的测试框架,真正从测试角度出发,为测试所想.在测试过程中我们经常会遇到对某一个场景做并发请求,主要想了解该程序在并发时是否会有异常或者没考虑到的其他情况,这时往往不是要做性 ...

  9. Java核心-多线程-并发控制器-CyclicBarrier同步屏障

    1.基本概念 中文译本同步屏障,同样来自jdk并发工具包中一个并发控制器,它的使用和CountDownLatch有点相似,能够完成某些相同并发场景,但是它们却不相同. 2.抽象模型 主要用来实现多个线 ...

随机推荐

  1. 【Web前端开发最佳实践系列】标准的HTML代码

    一.验证代码是否符合标准 优点: 标准的页面会保证浏览器正确的渲染 网页能更容易被搜索引擎搜索,提高网站的搜索排名 提高网站的易用性 网页更好维护和扩展 常用工具: W3 Validator HTML ...

  2. Firefox --- 火狐浏览器下载

    http://www.firefox.com.cn/download/

  3. sencha touch list css(样式) 详解

    /* *自定义列表页面 */ Ext.define('app.view.util.MyList', { alternateClassName: 'myList', extend: 'Ext.List' ...

  4. ELK系列四:Logstash的在ELK架构中的使用和简单的输入

    1.ELK架构中Logstash的位置: 1.1.小规模集群部署(学习者适用的架构) 简单的只有Logstash.Elasticsearch.Kibana,由Logstash收集日志或者流量信息,过滤 ...

  5. wps插件开发中com组件权限

    需要对wps写一个小的插件,也就是几行代码的事情,但却碰到了一个坑 wps中的com组件的调用和MSoffice非常的相似,几乎只需要把包的头修改一下就可以用了. 比如开发wps文档的插件,需要引用 ...

  6. iOS 8 AutoLayout与Size Class自悟

    前言 iOS8和iPhone6发布已经过去蛮久了,广大的果粉终于迎来了大屏iPhone,再也不用纠结为大屏买三星舍苹果了…但是对于iOS开发人员来说,迎来了和Android开发开发一样的问题—> ...

  7. MVC @RenderBody、@RenderSection、@RenderPage、@Html.RenderPartial、@Html.RenderAction

    1.@RenderBody() 作用和母版页中的服务器控件类似,当创建基于此布局页面的视图时,视图的内容会和布局页面合并,而新创建视图的内容会通过布局页面的@RenderBody()方法呈现在标签之间 ...

  8. .NET中的三种Timer的区别和用法(收集)

    最近正好做一个WEB中定期执行的程序,而.NET中有3个不同的定时器.所以正好研究研究.这3个定时器分别是: 1.实现按用户定义的时间间隔引发事件的计时器.此计时器最宜用于 Windows 窗体应用程 ...

  9. backbone.js之Model篇 简单总结和深入(2)

    一.模型属性的一些操作方法 1.mmodel.get()  获取属性的值 2.mmodel.set('age',5) 更新单个属性的值  mmodel.set({name:'aaa',age:6}) ...

  10. Redis的启动过程

    本文主要介绍Redis启动加载过程,总体上可以分为如下几步: 1. 初始化全局服务器配置 2. 加载配置文件(如果指定了配置文件,否则使用默认配置) 3. 初始化服务器 4. 加载数据库 5. 网络监 ...