zoukankan      html  css  js  c++  java
  • JUC高并发编程(三)之模拟接口压力测试

    1.背景

    接口压力测试是产品上线前很重要的一项测试,我们可以使用很多开源工具测试,

    当然我们也可以简单的写一个多线程并发测试案例

    2.代码

    controller接口

     /**
         * 查询订单
         *
         * @return
         */
        @RequestMapping("/api/order")
        public Object product(Integer id) {
            // 为了便于分析,设置一个线程号
            Thread.currentThread().setName("thread-" + id);
            log.info("查询订单-" + id);
            // 模拟随机耗时
            ThreadUtil.sleepRandom();
            return "订单编号-" + id;
        }

    3.测试

    测试代码

    package com.ldp.jucproject.controller;
    
    import cn.hutool.http.HttpRequest;
    import cn.hutool.http.HttpUtil;
    import com.ldp.jucproject.utils.ThreadUtil;
    import lombok.extern.slf4j.Slf4j;
    import org.junit.jupiter.api.Test;
    
    import java.util.concurrent.CountDownLatch;
    
    /**
     * @author 姿势帝-博客园
     * @address https://www.cnblogs.com/newAndHui/
     * @WeChat 851298348
     * @create 11/06 10:18
     * @description
     */
    @Slf4j
    class OrderControllerTest {
        /**
         * 简单测试
         */
        @Test
        void product01() {
            Integer id = 1;
            String url = "http://localhost:8001/api/order?id=" + id;
            HttpRequest request = HttpUtil.createGet(url);
            String response = request.execute().body();
            System.out.println("response=" + response);
        }
    
        /**
         * 模拟多个请求
         */
        @Test
        void product02() {
            for (int i = 1; i <= 100; i++) {
                Integer id = i;
                String url = "http://localhost:8001/api/order?id=" + id;
                HttpRequest request = HttpUtil.createGet(url);
                String response = request.execute().body();
                System.out.println("response=" + response);
            }
        }
    
        /**
         * 模拟多线程请求
         */
        @Test
        void product03() throws InterruptedException {
            for (int i = 1; i <= 100; i++) {
                ThreadUtil.sleepRandom();
                Integer id = i;
                new Thread(() -> {
                    String url = "http://localhost:8001/api/order?id=" + id;
                    System.out.println("待查询订单号=" + id);
                    HttpRequest request = HttpUtil.createGet(url);
                    String response = request.execute().body();
                    System.out.println("response=" + response);
                }).start();
            }
            // 避免线程终止
            Thread.sleep(20 * 1000);
        }
    
        /**
         * 模拟多线程并发请求
         */
        @Test
        void product04() throws Exception {
            // 并发请求数
            int num = 100;
            CountDownLatch countDownLatch = new CountDownLatch(num);
            for (int i = 1; i <= num; i++) {
                ThreadUtil.sleepRandom();
                // 计数器减一
                countDownLatch.countDown();
                Integer id = i;
                new Thread(() -> {
                    try {
                        String url = "http://localhost:8001/api/order?id=" + id;
                        // 等待计数器归零,归零前都是处于阻塞状态
                        System.out.println("待查询订单号=" + id);
                        countDownLatch.await();
                        HttpRequest request = HttpUtil.createGet(url);
                        String response = request.execute().body();
                        System.out.println("response=" + response);
                    } catch (Exception e) {
                        log.error("模拟并发出错:{}", e);
                    }
                }).start();
            }
            // 避免线程终止
            Thread.sleep(60 * 1000);
        }
    }

    4.完美!

  • 相关阅读:
    redux dispatch、action、reduce 执行流程
    react中使用react-redux
    npm 全局安装默认地址
    react 组件外js文件路由跳转
    withRouter的作用和适用场景
    react 自定义高阶组件,实现路由拦截,子路由渲染
    移动端原生js使用touch事件监听滑动方向
    Vue.js中this.$nextTick()的使用与理解
    域名等级划分介绍
    nodejs 实现一个账号只能一台设备登录
  • 原文地址:https://www.cnblogs.com/newAndHui/p/15757786.html
Copyright © 2011-2022 走看看