IT评测·应用市场-qidao123.com

标题: 通过AI自动生成springboot的CRUD以及单元测试与压力测试源码(完整版) [打印本页]

作者: 灌篮少年    时间: 2025-3-20 22:38
标题: 通过AI自动生成springboot的CRUD以及单元测试与压力测试源码(完整版)
本篇文章分为三个部分,即:
通过AI自动生成springboot的CRUD以及单元测试与压力测试源码(一)
通过AI自动生成springboot的CRUD以及单元测试与压力测试源码(二)
通过AI自动生成springboot的CRUD以及单元测试与压力测试源码(完整版)


  

在当代软件开发中,快速生成高质量的代码是提高开发服从的关键。SpringBoot作为Java生态中最盛行的框架之一,广泛应用于企业级应用开发。然而,手动编写CRUD(创建、读取、更新、删除)操作及其单元测试和压力测试代码往往耗时且轻易堕落。本文将先容怎样通过AICoder插件自动生成SpringBoot技能栈的CRUD代码及其单元测试和压力测试源码,从而大幅提升开发服从。
本示例利用的是AICoder插件,同类的另有如下所示:

如果你必要一个功能全面、易于集成的工具,GitHub Copilot 和 IntelliJ IDEA 是最佳选择。它们可以帮助你完成从代码补全到重构的整个开发流程。
一、AICoder插件简介

AICoder是一款基于人工智能的代码生成工具,能够根据开发者的需求自动生成高质量的代码。它支持多种编程语言和框架,包括Java、SpringBoot、Python等。通过AICoder,开发者可以快速生成CRUD操作、单元测试和压力测试代码,减少手动编写代码的工作量。
二、情况预备

在开始之前,确保你已经安装了以下工具:

三、自动生成CRUD代码

1、创建SpringBoot项目

在IntelliJ IDEA创建一个maven项目,其他的都可以不必要。目次布局如下:

上图中的htmlReport是覆盖率测试的报告,初始创建的时间是没有了。
2、通过AiCoder生成代码

在aicoder的对话框内输入指令“生成以springboot、mysql技能的curd”,然后aicoder就自动的开始生成代码来,示例如下图。

生成的代码如下

  1. package com.example.demo.model;
  2. import javax.persistence.Entity;
  3. import javax.persistence.GeneratedValue;
  4. import javax.persistence.GenerationType;
  5. import javax.persistence.Id;
  6. @Entity
  7. public class User {
  8.     @Id
  9.     @GeneratedValue(strategy = GenerationType.IDENTITY)
  10.     private Long id;
  11.     private String name;
  12.     private int age;
  13.     private String email;
  14.     // 无参构造函数
  15.     public User() {}
  16.     // 有参构造函数
  17.     public User(Long id, String name, int age, String email) {
  18.         this.id = id;
  19.         this.name = name;
  20.         this.age = age;
  21.         this.email = email;
  22.     }
  23.     // Getter 和 Setter 方法
  24.     public Long getId() {
  25.         return id;
  26.     }
  27.     public void setId(Long id) {
  28.         this.id = id;
  29.     }
  30.     public String getName() {
  31.         return name;
  32.     }
  33.     public void setName(String name) {
  34.         this.name = name;
  35.     }
  36.     public int getAge() {
  37.         return age;
  38.     }
  39.     public void setAge(int age) {
  40.         this.age = age;
  41.     }
  42.     public String getEmail() {
  43.         return email;
  44.     }
  45.     public void setEmail(String email) {
  46.         this.email = email;
  47.     }
  48. }
复制代码

  1. package com.example.demo.repository;
  2. import com.example.demo.model.User;
  3. import org.springframework.data.jpa.repository.JpaRepository;
  4. import org.springframework.stereotype.Repository;
  5. @Repository
  6. public interface UserRepository extends JpaRepository<User, Long> {
  7. }
复制代码

  1. package com.example.demo.service;
  2. import com.example.demo.model.User;
  3. import com.example.demo.repository.UserRepository;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Service;
  6. import java.util.List;
  7. import java.util.Optional;
  8. @Service
  9. public class UserService {
  10.     @Autowired
  11.     private UserRepository userRepository;
  12.     /**
  13.      * 创建用户
  14.      * @param user 用户对象
  15.      * @return 创建的用户对象
  16.      */
  17.     public User createUser(User user) {
  18.         return userRepository.save(user);
  19.     }
  20.     /**
  21.      * 获取所有用户
  22.      * @return 用户列表
  23.      */
  24.     public List<User> getAllUsers() {
  25.         return userRepository.findAll();
  26.     }
  27.     /**
  28.      * 通过ID获取用户
  29.      * @param id 用户ID
  30.      * @return 可选的用户对象
  31.      */
  32.     public Optional<User> getUserById(Long id) {
  33.         return userRepository.findById(id);
  34.     }
  35.     /**
  36.      * 更新用户
  37.      * @param id 用户ID
  38.      * @param user 更新后的用户对象
  39.      * @return 更新后的用户对象
  40.      */
  41.     public Optional<User> updateUser(Long id, User user) {
  42.         Optional<User> existingUser = userRepository.findById(id);
  43.         if (existingUser.isPresent()) {
  44.             User updatedUser = existingUser.get();
  45.             updatedUser.setName(user.getName());
  46.             updatedUser.setAge(user.getAge());
  47.             updatedUser.setEmail(user.getEmail());
  48.             return Optional.of(userRepository.save(updatedUser));
  49.         }
  50.         return Optional.empty();
  51.     }
  52.     /**
  53.      * 删除用户
  54.      * @param id 用户ID
  55.      */
  56.     public void deleteUser(Long id) {
  57.         userRepository.deleteById(id);
  58.     }
  59. }
复制代码

  1. package com.example.demo.controller;
  2. import com.example.demo.model.User;
  3. import com.example.demo.service.UserService;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.http.ResponseEntity;
  6. import org.springframework.web.bind.annotation.*;
  7. import java.util.List;
  8. import java.util.Optional;
  9. @RestController
  10. @RequestMapping("/users")
  11. public class UserController {
  12.     @Autowired
  13.     private UserService userService;
  14.     /**
  15.      * 创建用户
  16.      * @param user 用户对象
  17.      * @return 创建的用户对象
  18.      */
  19.     @PostMapping
  20.     public User createUser(@RequestBody User user) {
  21.         return userService.createUser(user);
  22.     }
  23.     /**
  24.      * 获取所有用户
  25.      * @return 用户列表
  26.      */
  27.     @GetMapping
  28.     public List<User> getAllUsers() {
  29.         return userService.getAllUsers();
  30.     }
  31.     /**
  32.      * 通过ID获取用户
  33.      * @param id 用户ID
  34.      * @return 用户对象
  35.      */
  36.     @GetMapping("/{id}")
  37.     public ResponseEntity<User> getUserById(@PathVariable Long id) {
  38.         Optional<User> user = userService.getUserById(id);
  39.         if (user.isPresent()) {
  40.             return ResponseEntity.ok(user.get());
  41.         } else {
  42.             return ResponseEntity.notFound().build();
  43.         }
  44.     }
  45.     /**
  46.      * 更新用户
  47.      * @param id 用户ID
  48.      * @param user 更新后的用户对象
  49.      * @return 更新后的用户对象
  50.      */
  51.     @PutMapping("/{id}")
  52.     public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User user) {
  53.         Optional<User> updatedUser = userService.updateUser(id, user);
  54.         if (updatedUser.isPresent()) {
  55.             return ResponseEntity.ok(updatedUser.get());
  56.         } else {
  57.             return ResponseEntity.notFound().build();
  58.         }
  59.     }
  60.     /**
  61.      * 删除用户
  62.      * @param id 用户ID
  63.      * @return 删除操作的状态
  64.      */
  65.     @DeleteMapping("/{id}")
  66.     public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
  67.         userService.deleteUser(id);
  68.         return ResponseEntity.noContent().build();
  69.     }
  70. }
复制代码

  1. package com.example.demo;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class DemoApplication {
  6.     public static void main(String[] args) {
  7.         SpringApplication.run(DemoApplication.class, args);
  8.     }
  9. }
复制代码

  1. spring.datasource.url=jdbc:mysql://localhost:3306/demo_db
  2. spring.datasource.username=root
  3. spring.datasource.password=root
  4. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  5. spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
  6. spring.jpa.hibernate.ddl-auto=update
  7. spring.jpa.show-sql=true
复制代码

  1. <dependencies>
  2.     <dependency>
  3.         <groupId>org.springframework.boot</groupId>
  4.         <artifactId>spring-boot-starter-web</artifactId>
  5.     </dependency>
  6.     <dependency>
  7.         <groupId>org.springframework.boot</groupId>
  8.         <artifactId>spring-boot-starter-data-jpa</artifactId>
  9.     </dependency>
  10.     <dependency>
  11.         <groupId>mysql</groupId>
  12.         <artifactId>mysql-connector-java</artifactId>
  13.         <scope>runtime</scope>
  14.     </dependency>
  15.     <dependency>
  16.         <groupId>org.springframework.boot</groupId>
  17.         <artifactId>spring-boot-starter-test</artifactId>
  18.         <scope>test</scope>
  19.     </dependency>
  20. </dependencies>
复制代码

  1. CREATE DATABASE demo_db;
  2. USE demo_db;
  3. CREATE TABLE users (
  4.     id BIGINT AUTO_INCREMENT PRIMARY KEY,
  5.     name VARCHAR(255) NOT NULL,
  6.     age INT NOT NULL,
  7.     email VARCHAR(255) NOT NULL
  8. );
复制代码

  1. 创建用户:  
  2. POST /users
  3. Content-Type: application/json
  4. {
  5.   "name": "张三",
  6.   "age": 30,
  7.   "email": "zhangsan@example.com"
  8. }
  9. 获取所有用户:  
  10. GET /users
  11. 通过ID获取用户:  
  12. GET /users/1
  13. 更新用户:  
  14. PUT /users/1
  15. Content-Type: application/json
  16. {
  17.   "name": "李四",
  18.   "age": 35,
  19.   "email": "lisi@example.com"
  20. }
  21. 删除用户:  
  22. DELETE /users/1
复制代码
通过以上的步调就可以完成了代码生成,根据本身的必要举行局部调整就可以正式的利用了。
四、生成UserController的单元测试类

在aicoder的对话框内输入“生成UserController的单元测试类”指令,其就可以自动的生成了代码,示例如下:

生成的源码如下。

  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-test</artifactId>
  4.     <scope>test</scope>
  5. </dependency>
复制代码

  1. package com.win.test;
  2. import com.win.bean.User;
  3. import com.win.control.UserController;
  4. import com.win.service.UserService;
  5. import org.junit.jupiter.api.BeforeEach;
  6. import org.junit.jupiter.api.Nested;
  7. import org.junit.jupiter.api.Test;
  8. import org.mockito.Mockito;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
  11. import org.springframework.boot.test.mock.mockito.MockBean;
  12. import org.springframework.http.MediaType;
  13. import org.springframework.test.web.servlet.MockMvc;
  14. import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
  15. import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
  16. import java.util.Arrays;
  17. import java.util.Optional;
  18. @Nested
  19. @WebMvcTest(UserController.class)
  20. class UserControllerTest {
  21.     @Autowired
  22.     private MockMvc mockMvc;
  23.     @MockBean
  24.     private UserService userService;
  25.     private User user1;
  26.     private User user2;
  27.     /**
  28.      * 在每个测试方法执行之前运行的设置方法。
  29.      * 用于初始化测试所需的用户对象。
  30.      */
  31.     @BeforeEach
  32.     public void setUp() {
  33.         // 创建用户1,ID为1,姓名为"alan",年龄为18,邮箱为"alan.chan.chn@163.com"
  34.         user1 = new User(1L, "alan", 18, "alan.chan.chn@163.com");
  35.         // 创建用户2,ID为2,姓名为"alanchan",年龄为18,邮箱为"alan.chan.chn@163.com"
  36.         user2 = new User(2L, "alanchan", 18, "alan.chan.chn@163.com");
  37.     }
  38.     /**
  39.      * 测试获取所有用户的方法。
  40.      */
  41.     @Test
  42.     public void testGetAllUsers() throws Exception {
  43.         // 模拟 userService 的行为
  44.         Mockito.when(userService.getAllUsers()).thenReturn(Arrays.asList(user1, user2));
  45.         // 发送 GET 请求并验证响应
  46.         mockMvc.perform(MockMvcRequestBuilders.get("/users")
  47.                         .accept(MediaType.APPLICATION_JSON))
  48.                 // 验证响应状态码为 200 OK
  49.                 .andExpect(MockMvcResultMatchers.status().isOk())
  50.                 // 验证响应内容为 JSON 格式,包含两个用户对象
  51.                 .andExpect(MockMvcResultMatchers.content().json("[{"id":1,"name":"alan","age":18,"email":"alan.chan.chn@163.com"},{"id":2,"name":"alanchan","age":18,"email":"alan.chan.chn@163.com"}]"
  52.                 ));
  53.     }
  54.     /**
  55.      * 测试 getUserById 方法的单元测试。
  56.      * 该测试方法使用 Mockito 模拟 userService 的行为,并使用 MockMvc 发送 GET 请求以验证响应。
  57.      * 测试包括两个场景:存在用户和不存在用户。
  58.      */
  59.     @Test
  60.     public void testGetUserById() throws Exception {
  61.         // 模拟 userService 的行为
  62.         Mockito.when(userService.getUserById(1L)).thenReturn(Optional.of(user1));
  63.         // 发送 GET 请求并验证响应
  64.         mockMvc.perform(MockMvcRequestBuilders.get("/users/1")
  65.                         .accept(MediaType.APPLICATION_JSON))
  66.                 .andExpect(MockMvcResultMatchers.status().isOk())
  67.                 .andExpect(MockMvcResultMatchers.content().json("{" +
  68.                         ""id":1," +
  69.                         ""name":"alan"," +
  70.                         ""age":18," +
  71.                         ""email":"alan.chan.chn@163.com"}"));
  72.         // 测试不存在的用户
  73.         Mockito.when(userService.getUserById(999L)).thenReturn(Optional.empty());
  74.         // 发送 GET 请求并验证响应
  75.         mockMvc.perform(MockMvcRequestBuilders.get("/users/999")
  76.                         .accept(MediaType.APPLICATION_JSON))
  77.                 .andExpect(MockMvcResultMatchers.status().isNotFound());
  78.     }
  79.     /**
  80.      * 测试创建用户的方法。
  81.      * 该测试方法使用Mockito模拟userService的行为,并使用MockMvc发送POST请求,验证响应状态和内容。
  82.      */
  83.     @Test
  84.     public void testCreateUser() throws Exception {
  85.         // 创建一个用户对象,不包含id
  86.         User user = new User(null, "alanchanchn", 20, "alan.chan.chn@163.com");
  87.         // 模拟 userService 的行为
  88.         // 当调用 userService.createUser(user) 时,返回一个id为3的用户对象
  89.         User createdUser = new User(3L, "alanchanchn", 20, "alan.chan.chn@163.com");
  90.         Mockito.when(userService.createUser(user)).thenReturn(createdUser);
  91.         // 发送 POST 请求并验证响应
  92.         mockMvc.perform(MockMvcRequestBuilders.post("/users")
  93.                         .content("{"name":"alanchanchn","age":20,"email":"alan.chan.chn@163.com"}")
  94.                         .contentType(MediaType.APPLICATION_JSON)
  95.                         .accept(MediaType.APPLICATION_JSON))
  96.                 // 验证响应状态为200 OK
  97.                 .andExpect(MockMvcResultMatchers.status().isOk())
  98.                 // 验证响应内容是否符合预期的JSON格式
  99.                 .andExpect(MockMvcResultMatchers.content().json("{" +
  100.                         ""id":3," +
  101.                         ""name":"alanchanchn"," +
  102.                         ""age":20," +
  103.                         ""email":"alan.chan.chn@163.com"" +
  104.                         "}"));
  105.     }
  106.     /**
  107.      * 测试 updateUser 方法的单元测试。
  108.      * 该测试包括两个场景:更新存在的用户和更新不存在的用户。
  109.      */
  110.     @Test
  111.     public void testUpdateUser() throws Exception {
  112.         // 创建一个用户对象,不包含id
  113.         User userToUpdate = new User(null, "alanchanchn", 20, "alan.chan.chn@163.com");
  114.         // 模拟 userService 的行为
  115.         // 当调用 userService.updateUser(1L, userToUpdate) 时,返回一个id为1的用户对象
  116.         User updatedUser = new User(1L, "alanchanchn", 20, "alan.chan.chn@163.com");
  117.         Mockito.when(userService.updateUser(1L, userToUpdate)).thenReturn(updatedUser);
  118.         // 发送 PUT 请求并验证响应
  119.         mockMvc.perform(MockMvcRequestBuilders.put("/users/1")
  120.                         .content("{"name":"alanchanchn","age":20,"email":"alan.chan.chn@163.com"}")
  121.                         .contentType(MediaType.APPLICATION_JSON)
  122.                         .accept(MediaType.APPLICATION_JSON))
  123.                 // 验证响应状态为200 OK
  124.                 .andExpect(MockMvcResultMatchers.status().isOk())
  125.                 // 验证响应内容是否符合预期的JSON格式
  126.                 .andExpect(MockMvcResultMatchers.content().json("{" +
  127.                         ""id":1," +
  128.                         ""name":"alanchanchn"," +
  129.                         ""age":20," +
  130.                         ""email":"alan.chan.chn@163.com"}"));
  131.         // 测试不存在的用户
  132.         Mockito.when(userService.updateUser(999L, userToUpdate)).thenReturn(null);
  133.         // 发送 PUT 请求并验证响应,期望返回 404 Not Found
  134.         mockMvc.perform(MockMvcRequestBuilders.put("/users/999")
  135.                         .content("{"name":"alanchanchn","age":20,"email":"alan.chan.chn@163.com"}")
  136.                         .contentType(MediaType.APPLICATION_JSON)
  137.                         .accept(MediaType.APPLICATION_JSON))
  138.                 .andExpect(MockMvcResultMatchers.status().isNotFound());
  139.     }
  140.     /**
  141.      * 测试删除用户的功能。
  142.      * 该测试方法使用Mockito模拟userService的行为,并使用MockMvc发送HTTP DELETE请求。
  143.      * 测试包括删除存在的用户和删除不存在的用户。
  144.      */
  145.     @Test
  146.     public void testDeleteUser() throws Exception {
  147.         // 模拟 userService 的行为
  148.         Mockito.doNothing().when(userService).deleteUser(1L);
  149.         // 发送 DELETE 请求并验证响应
  150.         mockMvc.perform(MockMvcRequestBuilders.delete("/users/1")
  151.                         .accept(MediaType.APPLICATION_JSON))
  152.                 .andExpect(MockMvcResultMatchers.status().isNoContent());
  153.         // 测试不存在的用户
  154.         Mockito.doNothing().when(userService).deleteUser(999L);
  155.         // 发送 DELETE 请求并验证响应
  156.         mockMvc.perform(MockMvcRequestBuilders.delete("/users/999")
  157.                         .accept(MediaType.APPLICATION_JSON))
  158.                 .andExpect(MockMvcResultMatchers.status().isNoContent());
  159.     }
  160. }
复制代码
五、生成UserController压力测试类

在aicoder的对话框内输入"生成UserController压力测试类"指令,其就可以自动的生成代码了,示例如下。

更改了生成源码所在的包。
  1. package com.win.test;
  2. import com.fasterxml.jackson.databind.ObjectMapper;
  3. import com.win.bean.User;
  4. import com.win.control.UserController;
  5. import com.win.service.UserService;
  6. import org.junit.jupiter.api.BeforeEach;
  7. import org.junit.jupiter.api.Test;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
  10. import org.springframework.boot.test.mock.mockito.MockBean;
  11. import org.springframework.test.web.servlet.MockMvc;
  12. import org.springframework.test.web.servlet.MvcResult;
  13. import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
  14. import java.util.ArrayList;
  15. import java.util.List;
  16. import java.util.Optional;
  17. import java.util.concurrent.CountDownLatch;
  18. import java.util.concurrent.ExecutorService;
  19. import java.util.concurrent.Executors;
  20. import java.util.concurrent.atomic.AtomicInteger;
  21. import static org.mockito.Mockito.*;
  22. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
  23. @WebMvcTest(UserController.class)
  24. public class UserControllerStressTest {
  25.     @Autowired
  26.     private MockMvc mockMvc;
  27.     @MockBean
  28.     private UserService userService;
  29.     private final int threadCount = 1000; // 并发线程数
  30.     private final int requestCount = 10000; // 总请求数
  31.     @BeforeEach
  32.     public void setUp() {
  33.         // 模拟 userService 的行为
  34.         List<User> users = new ArrayList<>();
  35.         users.add(new User(1L, "Alice",18, "alice@example.com"));
  36.         users.add(new User(2L, "Bob",20, "bob@example.com"));
  37.         when(userService.getAllUsers()).thenReturn(users);
  38.         when(userService.getUserById(1L)).thenReturn(Optional.ofNullable(users.get(0)));
  39.         when(userService.getUserById(2L)).thenReturn(Optional.ofNullable(users.get(1)));
  40.     }
  41.     @Test
  42.     public void testGetAllUsersStress() throws Exception {
  43.         AtomicInteger successCount = new AtomicInteger(0);
  44.         AtomicInteger failureCount = new AtomicInteger(0);
  45.         CountDownLatch latch = new CountDownLatch(requestCount);
  46.         ExecutorService executorService = Executors.newFixedThreadPool(threadCount);
  47.         for (int i = 0; i < requestCount; i++) {
  48.             executorService.submit(() -> {
  49.                 try {
  50.                     MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/users"))
  51.                             .andExpect(status().isOk())
  52.                             .andReturn();
  53.                     successCount.incrementAndGet();
  54.                 } catch (Exception e) {
  55.                     failureCount.incrementAndGet();
  56.                 } finally {
  57.                     latch.countDown();
  58.                 }
  59.             });
  60.         }
  61.         latch.await();
  62.         executorService.shutdown();
  63.         System.out.println("成功请求: " + successCount.get());
  64.         System.out.println("失败请求: " + failureCount.get());
  65.     }
  66.     @Test
  67.     public void testGetUserByIdStress() throws Exception {
  68.         AtomicInteger successCount = new AtomicInteger(0);
  69.         AtomicInteger failureCount = new AtomicInteger(0);
  70.         CountDownLatch latch = new CountDownLatch(requestCount);
  71.         ExecutorService executorService = Executors.newFixedThreadPool(threadCount);
  72.         for (int i = 0; i < requestCount; i++) {
  73.             executorService.submit(() -> {
  74.                 try {
  75.                     MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/users/1"))
  76.                             .andExpect(status().isOk())
  77.                             .andReturn();
  78.                     successCount.incrementAndGet();
  79.                 } catch (Exception e) {
  80.                     failureCount.incrementAndGet();
  81.                 } finally {
  82.                     latch.countDown();
  83.                 }
  84.             });
  85.         }
  86.         latch.await();
  87.         executorService.shutdown();
  88.         System.out.println("成功请求: " + successCount.get());
  89.         System.out.println("失败请求: " + failureCount.get());
  90.     }
  91.     @Test
  92.     public void testCreateUserStress() throws Exception {
  93.         AtomicInteger successCount = new AtomicInteger(0);
  94.         AtomicInteger failureCount = new AtomicInteger(0);
  95.         CountDownLatch latch = new CountDownLatch(requestCount);
  96.         ExecutorService executorService = Executors.newFixedThreadPool(threadCount);
  97.         for (int i = 0; i < requestCount; i++) {
  98.             final int index = i; // 将 i 复制为 final 变量
  99.             executorService.submit(() -> {
  100.                 try {
  101.                     User user = new User((long) (index + 1000), "User" + index,11, "user" + index + "@example.com");
  102.                     MvcResult result = mockMvc.perform(MockMvcRequestBuilders.post("/users")
  103.                                     .contentType("application/json")
  104.                                     .content(objectMapper.writeValueAsString(user)))
  105.                             .andExpect(status().isOk())
  106.                             .andReturn();
  107.                     successCount.incrementAndGet();
  108.                 } catch (Exception e) {
  109.                     failureCount.incrementAndGet();
  110.                 } finally {
  111.                     latch.countDown();
  112.                 }
  113.             });
  114.         }
  115.         latch.await();
  116.         executorService.shutdown();
  117.         System.out.println("成功请求: " + successCount.get());
  118.         System.out.println("失败请求: " + failureCount.get());
  119.     }
  120.     @Test
  121.     public void testUpdateUserStress() throws Exception {
  122.         AtomicInteger successCount = new AtomicInteger(0);
  123.         AtomicInteger failureCount = new AtomicInteger(0);
  124.         CountDownLatch latch = new CountDownLatch(requestCount);
  125.         ExecutorService executorService = Executors.newFixedThreadPool(threadCount);
  126.         for (int i = 0; i < requestCount; i++) {
  127.             final int index = i; // 将 i 复制为 final 变量
  128.             executorService.submit(() -> {
  129.                 try {
  130.                     User user = new User((long) (index + 1000), "User" + index, 12,"user" + index + "@example.com");
  131.                     MvcResult result = mockMvc.perform(MockMvcRequestBuilders.put("/users/1")
  132.                                     .contentType("application/json")
  133.                                     .content(objectMapper.writeValueAsString(user)))
  134.                             .andExpect(status().isOk())
  135.                             .andReturn();
  136.                     successCount.incrementAndGet();
  137.                 } catch (Exception e) {
  138.                     failureCount.incrementAndGet();
  139.                 } finally {
  140.                     latch.countDown();
  141.                 }
  142.             });
  143.         }
  144.         latch.await();
  145.         executorService.shutdown();
  146.         System.out.println("成功请求: " + successCount.get());
  147.         System.out.println("失败请求: " + failureCount.get());
  148.     }
  149.     @Test
  150.     public void testDeleteUserStress() throws Exception {
  151.         AtomicInteger successCount = new AtomicInteger(0);
  152.         AtomicInteger failureCount = new AtomicInteger(0);
  153.         CountDownLatch latch = new CountDownLatch(requestCount);
  154.         ExecutorService executorService = Executors.newFixedThreadPool(threadCount);
  155.         for (int i = 0; i < requestCount; i++) {
  156.             executorService.submit(() -> {
  157.                 try {
  158.                     MvcResult result = mockMvc.perform(MockMvcRequestBuilders.delete("/users/1"))
  159.                             .andExpect(status().isOk())
  160.                             .andReturn();
  161.                     successCount.incrementAndGet();
  162.                 } catch (Exception e) {
  163.                     failureCount.incrementAndGet();
  164.                 } finally {
  165.                     latch.countDown();
  166.                 }
  167.             });
  168.         }
  169.         latch.await();
  170.         executorService.shutdown();
  171.         System.out.println("成功请求: " + successCount.get());
  172.         System.out.println("失败请求: " + failureCount.get());
  173.     }
  174.     private ObjectMapper objectMapper = new ObjectMapper();
  175. }
复制代码
六、验证

正常功能验证,比较轻易,不再赘述,基本上不会堕落。
单元测试的用例可能必要调整一下,由于其没有有参构造函数。
只要单元测试通过,压力测试效果会通过。
示例如下,本示例利用的覆盖率运行,能看到单元测试的覆盖率。
单元测试覆盖率报告可以导出成html文件,可以本身试一试。



压力测试,运行的时间会自动纪录成功与错误的纪录数,以及可以观察一下运行呆板的网络、cpu、内存以及硬盘的利用情况,固然如果更专业的压力测试则是利用jmeter等专业的软件。
七、Aicoder其他的功能

1、针对某个方法生成单元测试


点击单元测试,在AiCoder的面板上就生成了该方法对应的单元测试类,示例如下

2、针对代码生成解释

示例如下

3、代码解释

点击代码解释,示例如下

4、缺陷检测

点击缺陷检测,示例如下

以上通过AICoder插件,我们可以快速生成SpringBoot技能栈的CRUD代码及其单元测试和压力测试源码。本示例没有生产前端代码,也可以根据必要举行生成,不再赘述。这不但大大提高了开发服从,还确保了代码的质量和同等性。希望本文能帮助你更好地利用AICoder插件,提升你的开发体验。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4