Java接口多线程并发测试 (一)
本文为作者原创,禁止转载,违者必究法律责任!!!
本文为作者原创,禁止转载,违者必究法律责任!!!
Java接口多线程并发测试
一,首先写一个接口post 请求代码:
- import org.apache.http.HttpEntity;
- import org.apache.http.HttpStatus;
- import org.apache.http.StatusLine;
- import org.apache.http.client.methods.CloseableHttpResponse;
- import org.apache.http.client.methods.HttpPost;
- import org.apache.http.entity.StringEntity;
- import org.apache.http.impl.client.CloseableHttpClient;
- import org.apache.http.impl.client.HttpClients;
- import org.apache.http.util.EntityUtils;
- public class postRequest {
- public static void postRequestTest(String para1, String para2, String para3 ) throws Exception {
- long begaintime = System.currentTimeMillis();//开始系统时间
- CloseableHttpClient httpclient = HttpClients.createDefault();
- String url = "https://www.baidu.com";
- HttpPost httpPost = new HttpPost(url);// 创建httpPost
- httpPost.setHeader("Authorization", "Bearer qwertyu12345678zxcvbnm");
- httpPost.setHeader("Content-Type", "application/json");
- httpPost.setHeader("time", "11234567890");
- httpPost.setHeader("X-Accept-Locale", "zh_CN");
- //添加 body 参数
- String orderToken = postRequest1(para1); //从上一个接口的返回数据里面获取参数
- String body = String.format("{\"Name\":\"%s\",\"age\":\"%s\",\"address\":\"%s\"}", para2, para3,orderToken);
- httpPost.setEntity(new StringEntity(body));
- //设置 params 参数-------------设置了body就不能再设置params
- //String params = "";
- //String charSet = "UTF-8";
- //StringEntity entity = new StringEntity(params, charSet);
- //httpPost.setEntity(entity);
- CloseableHttpResponse response = null;
- try {
- response = httpclient.execute(httpPost);
- StatusLine status = response.getStatusLine();
- int state = status.getStatusCode();
- if (state == HttpStatus.SC_OK) {
- HttpEntity responseEntity = response.getEntity();
- String jsonString = EntityUtils.toString(responseEntity);
- System.out.println("TakegoOrder 接口请求成功");
- //return jsonString;
- System.out.println(jsonString);
- if(jsonString.contains("\"success\":true")&&jsonString.contains("\"time\":\"2018")){
- System.out.println("成功查询!!!!");
- }else {
- System.err.println("查询失败!!----"+body);
- }
- }
- else{
- System.err.println("请求返回:"+state+"("+url+")");
- }
- }
- finally {
- if (response != null) {
- try {
- response.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- try {
- httpclient.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- long endTime = System.currentTimeMillis(); //结束时间
- System.out.println(" 接口请求耗时 : "+(endTime-begaintime));
- }
- //return null;
- }
二,再写一个 MyThread 类 继承Runnable 接口
- import java.util.concurrent.CountDownLatch;
- public class MyThread implements Runnable {
- private String para1;
- private String para2;
- private String para3;
- private CountDownLatch countDownLatch; //多线程结束后,执行后面的代码(计算时间、数量)
- public MyThread(String para1, String para2, String para3, CountDownLatch countDownLatch) {
- this.para1 = para1;
- this.para2 = para2;
- this.para3 = para3;
- this.countDownLatch = countDownLatch;
- }
- public void run() {
- try{
- postRequest.postRequestTest(para1, para2, para3);
- }catch(Exception e){
- e.printStackTrace();
- }finally {
- countDownLatch.countDown();
- }
- }
- }
三,写一个test 类的main方法来执行多线程并发
- public class Test {
- public static void main(String[] args) throws InterruptedException {
- long begaintime = System.currentTimeMillis();//开始系统时间
- //线程池
- ExecutorService pool = Executors.newCachedThreadPool();
- //设置集合点为93
- final int count = 50;
- CountDownLatch countDownLatch = new CountDownLatch(count);//与countDownLatch.await();实现运行完所有线程之后才执行后面的操作
- //final CyclicBarrier barrier = new CyclicBarrier(count); //与barrier.await() 实现并发;
- //创建100个线程
- for(int i = 0; i < count; i++){
- MyThread target = new MyThread("para1", "para2", "para3", countDownLatch);
- //barrier.await();
- pool.execute(target);
- }
- pool.shutdown();
- try {
- countDownLatch.await(); //这一步是为了将全部线程任务执行完以后,开始执行后面的任务(计算时间,数量)
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- long endTime = System.currentTimeMillis(); //结束时间
- System.out.println(count + " 个 接口请求总耗时 : "+(endTime-begaintime)+"-----平均耗时为"+ ((endTime-begaintime)/count));
- }
- }
本文为作者原创,禁止转载,违者必究法律责任!!!
本文为作者原创,禁止转载,违者必究法律责任!!!
Java接口多线程并发测试 (一)的更多相关文章
- Java接口多线程并发测试 (二)
原文地址http://www.cnblogs.com/yezhenhan/archive/2012/01/09/2317636.html 这是一篇很不错的文章,感谢原博主的分享! JAVA多线程实现和 ...
- Selenium & Webdriver 远程测试和多线程并发测试
Selenium & Webdriver 远程测试和多线程并发测试 Selenium Webdriver自动化测试,初学者可以使用selenium ide录制脚本,然后生成java程序导入ec ...
- Java核心-多线程-并发控制器-Semaphore信号量
Semaphore是非常有用的一个多线程并发控制组件(Java还有CountDownLatch.CyclicBarrier.Exchanger多线程组件),它相当于是一个并发控制器,是用于管理信号量的 ...
- Java核心-多线程-并发控制器-CountDownLatch倒数闩
1.基本概念 CountDownLatch,中文名倒数闩,jdk并发工具包中一个并发控制器,它抽象了一个常见的多线程并发场景,开发人员使用它可以写出同时兼顾线程安全性与高效率的代码. 2.抽象模型 相 ...
- Python + gevent模块对单个接口进行并发测试 1
本文知识点 利用gevent模块进行并发测试 代码如下 from gevent import monkey monkey.patch_all() import requests import geve ...
- Java中多线程并发体系知识点汇总
一.多线程 1.操作系统有两个容易混淆的概念,进程和线程. 进程:一个计算机程序的运行实例,包含了需要执行的指令:有自己的独立地址空间,包含程序内容和数据:不同进程的地址空间是互相隔离的:进程拥有各种 ...
- [Java复习] 多线程&并发 知识点补充
0. wait/notify/notifyAll的理解? wait:让持有该对象锁的线程等待: notify: 唤醒任何一个持有该对象锁的线程: notifyAll: 唤醒所有持有该对象锁的线程: 它 ...
- 利用Testng注释实现多线程并发测试
Testng 是一款非常优秀的测试框架,真正从测试角度出发,为测试所想.在测试过程中我们经常会遇到对某一个场景做并发请求,主要想了解该程序在并发时是否会有异常或者没考虑到的其他情况,这时往往不是要做性 ...
- Java核心-多线程-并发控制器-CyclicBarrier同步屏障
1.基本概念 中文译本同步屏障,同样来自jdk并发工具包中一个并发控制器,它的使用和CountDownLatch有点相似,能够完成某些相同并发场景,但是它们却不相同. 2.抽象模型 主要用来实现多个线 ...
随机推荐
- 【Web前端开发最佳实践系列】标准的HTML代码
一.验证代码是否符合标准 优点: 标准的页面会保证浏览器正确的渲染 网页能更容易被搜索引擎搜索,提高网站的搜索排名 提高网站的易用性 网页更好维护和扩展 常用工具: W3 Validator HTML ...
- Firefox --- 火狐浏览器下载
http://www.firefox.com.cn/download/
- sencha touch list css(样式) 详解
/* *自定义列表页面 */ Ext.define('app.view.util.MyList', { alternateClassName: 'myList', extend: 'Ext.List' ...
- ELK系列四:Logstash的在ELK架构中的使用和简单的输入
1.ELK架构中Logstash的位置: 1.1.小规模集群部署(学习者适用的架构) 简单的只有Logstash.Elasticsearch.Kibana,由Logstash收集日志或者流量信息,过滤 ...
- wps插件开发中com组件权限
需要对wps写一个小的插件,也就是几行代码的事情,但却碰到了一个坑 wps中的com组件的调用和MSoffice非常的相似,几乎只需要把包的头修改一下就可以用了. 比如开发wps文档的插件,需要引用 ...
- iOS 8 AutoLayout与Size Class自悟
前言 iOS8和iPhone6发布已经过去蛮久了,广大的果粉终于迎来了大屏iPhone,再也不用纠结为大屏买三星舍苹果了…但是对于iOS开发人员来说,迎来了和Android开发开发一样的问题—> ...
- MVC @RenderBody、@RenderSection、@RenderPage、@Html.RenderPartial、@Html.RenderAction
1.@RenderBody() 作用和母版页中的服务器控件类似,当创建基于此布局页面的视图时,视图的内容会和布局页面合并,而新创建视图的内容会通过布局页面的@RenderBody()方法呈现在标签之间 ...
- .NET中的三种Timer的区别和用法(收集)
最近正好做一个WEB中定期执行的程序,而.NET中有3个不同的定时器.所以正好研究研究.这3个定时器分别是: 1.实现按用户定义的时间间隔引发事件的计时器.此计时器最宜用于 Windows 窗体应用程 ...
- backbone.js之Model篇 简单总结和深入(2)
一.模型属性的一些操作方法 1.mmodel.get() 获取属性的值 2.mmodel.set('age',5) 更新单个属性的值 mmodel.set({name:'aaa',age:6}) ...
- Redis的启动过程
本文主要介绍Redis启动加载过程,总体上可以分为如下几步: 1. 初始化全局服务器配置 2. 加载配置文件(如果指定了配置文件,否则使用默认配置) 3. 初始化服务器 4. 加载数据库 5. 网络监 ...