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.完美!

  • 相关阅读:
    github替代品
    【推荐】通用全面的APP测试用例设计
    Jmeter 性能测试,完整入门篇
    2020年,有哪些特别好用的 app 测试工具?
    如何做好Web端性能测试?
    如何做Web服务的性能测试?
    Office 各版本批量授权(VOL)和激活方法
    django中引用bootstrap的几种方式
    list类型数据执行效率测试
    Linux安装python3环境
  • 原文地址:https://www.cnblogs.com/newAndHui/p/15757786.html
Copyright © 2011-2022 走看看