Spring Boot實戰(三十六)編寫單元測試

目錄

    • 一、什么是單元測試?
    • 二、Spring Boot 中的單元測試依賴
    • 三、舉例 Spring Boot 中不同層次的單元測試
      • 3.1 Service層
      • 3.2 Controller 層
      • 3.3 Repository層
    • 四、Spring Boot 中 Mock、Spy 對象的使用
      • 4.1 使用Mock對象的背景
      • 4.2 什么是Mock對象,有哪些好處?
      • 4.3 使用 Mock 對象的示例
      • 4.4 什么是Spy對象,有哪些好處?
      • 4.5 使用 Spy 對象的示例

一、什么是單元測試?

單元測試 是指對軟件中的最小可測試單元進行檢查和驗證。在 Java 中,單元測試的最小單元是類。通過編寫針對類或方法的小段代碼,來檢驗被測代碼是否符合預期結果或行為。

執行單元測試可以幫助開發者驗證代碼是否正確實現了功能需求,以及是否能夠適應應用環境或需求變化。


二、Spring Boot 中的單元測試依賴

在 Spring Boot 項目中,要進行單元測試,首先需要添加相應的依賴。Maven 依賴如下:

<dependency><groupId>org.springframework.boot</groupId><artifactid>spring-boot-starter-test</artifactid><scope>test</scope>
</dependency>

這個依賴包含了多個庫和功能,主要有以下幾個:

  • JUnit:JUnit 是 Java 中最流行和最常用的單元測試框架,它提供了一套 注解斷言 來編寫和運行單元測試。例如 @Test 注解表示一個測試方法,assertEquals 斷言表示兩個值是否相等。
  • Spring Test:Spring Test 是一個基于 Spring 的測試框架,它提供了一套注解和工具來配置和管理 Spring 上下文和 Bean。例如 @SpringBootTest 注解表示一個集成測試類,@Autowired 注解表示自動注入一個 Bean。
  • Mockito:Mockito 是一個 Java 中最流行和最強大的 Mock 對象庫,它可以模仿復雜的真實對象行為,從而簡化測試過程。例如 @MockBean 注解表示創建一個 Mock 對象,when 方法表示定義 Mock 對象的行為。
  • Hamcrest:Hamcrest 是一個 Java 中的匹配器庫,它提供了一套語義豐富而易讀的匹配器來進行結果驗證。例如 asserThat 斷言表示驗證一個值是否滿足一個匹配器,is 匹配器表示兩個值是否相等。
  • AssertJ:AssertJ 是一個 Java 中的斷言庫,它提供了一套流暢而直觀的斷言語法來進行結果驗證。例如 assertThat 斷言表示驗證一個值是否滿足一個條件,isEqualTo 斷言表示兩個值是否相等。

除了以上這些庫外,spring-boot-starter-test 還包含了其他一些庫和功能,如 JsonPath、JsonAssert、XmlUnit 等。這些庫和功能可以根據不同的測試場景進行選擇和使用。


三、舉例 Spring Boot 中不同層次的單元測試

如果是通過spring initialize創建的springboot項目(本系列第一篇文章有講解),其實會自動創建一個單元測試類:

在這里插入圖片描述

我們在寫單元測試的時候,直接繼承這個類即可。

3.1 Service層

在 Spring Boot 中,對 Service 層進行單元測試,可以使用 @SpringBootTest 注解來加載完整的 Spring 上下文,從而可以自動注入 Service 層的 Bean。同時,可以使用 @MockBean 注解來創建和注入其他層次的 Mock 對象,從而避免真實地調用其他層次的方法,而是模擬其行為。

例如,假設有一個 UserService 類,它提供了一個根據用戶 ID 查詢用戶信息的方法:

@Service
public class UserService {@Autowiredprivate UserRepository userRepository;public User getUserById(Long id) {return userRepository.findById(id).orElse(null);}
}

要對這個類進行單元測試,可以編寫以下測試類:

@SpringBootTest
public class UserServiceTest {@Autowiredprivate UserService userService;@MockBeanprivate UserRepository userRepository;@Testpublic void testGetUserById() {// 創建一個User對象User user = new User();user.setId(1L);user.setName("ACGkaka");user.setEmail("acgkaka@example.com");// 當調用userRepository.findById(1L)時,返回一個包含user對象的Optional對象when(userRepository.findById(1L)).thenReturn(Optional.of(user));// 調用userService.getUserId()方法,傳入1L作為參數,得到一個User對象。User result = userService.getUserById(1L);// 驗證結果對象與user對象相等assertThat(result).isEqualTo(user);// 驗證userRepository.findById(1L)方法被調用了一次verify(userRepository, times(1)).findById(1L);}
}

在這個測試類中,使用了以下幾個關鍵點和技巧:

  1. 使用 @SpringBootTest 注解表示加載完成的 Spring 上下文,并使用 @Autowired 注解將 UserService 對象注入到測試類中。
  2. 使用 @MockBean 注解表示創建一個 UserRespository 對象,并使用 @Autowired 注解將其注入到測試類中。這樣可以避免真實地調用 UserRepository 的方法,而是模擬其行為。
  3. 使用 when 方法來定義 Mock 對象的行為,例如當調用 userRepository.findById(1L) 時,返回一個包含 user 對象的 Optional 對象。
  4. 使用 userService.getUserById() 方法調用被測方法,得到一個 User 對象。
  5. 使用 AssertJ 的斷言語法來驗證結果對象與 user 對象是否相等。可以使用多種條件和匹配器來驗證結果。
  6. 使用 verify 方法來驗證 Mock 對象的方法是否被調用了指定次數。

3.2 Controller 層

Controller 層是指處理用戶請求和響應的層,它通常使用 @RestController@Controller 注解來標識。在 Spring Boot 中,對 Controller 層進行單元測試,可以使用 @WebMvcTest 注解來啟動一個輕量級的 Spring MVC 上下文,只加載 Controller 層的組件。同時,可以使用 @AutoConfigureMockMvc 注解來自動配置一個 MockMvc 對象,用來模擬 Http 請求和驗證 Http 響應。

例如,假設有一個 UserController 類,它提供了一個根據用戶ID查詢用戶信息的接口:

@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/{id}")public ResponseEntity<User> getUserById(@PathVariable Long id) {User user = userService.getUserById(id);if (user == null) {return ResponseEntity.notFound().build();} else {return ResponseEntity.ok(user);}}
}

要對這個類進行單元測試,可以編寫以下測試類:

@WebMvcTest(UserController.class)
@AutoConfigureMockMvc
public class UserControllerTest {@Autowiredprivate MockMvc mockMvc;@MockBeanprivate UserService userService;@Testpublic vid testGetUserById() throws Exception {// 創建一個 User 對象User user = new User();user.setId(1L);user.setName("ACGkaka");user.setEmail("acgkaka@example.com");// 當調用userService.getUserById(1L)時,返回user對象when(userService.getUserById(1L)).thenReturn(user);// 模擬發送GET請求到/users/1,并驗證響應狀態碼為200,響應內容為JSON格式的user對mockMvc.perform(get("/users/1"))mockMvc.perform(get("/users/1")).andExpect(status().isOk()).andExpect(content().contentType(MediaType.APPLICATION_JSON)).andExpect(jsonPath("$.id").value(1L)).andExpect(jsonPath("$.name").value("ACGkaka")).andExpect(jsonPath("$.email").value("alice@example.com"));// 驗證userService.getUserById(1L)方法被調用了一次。verify(userSerivce, times(1)).getUserById(1L);}
}

在這個測試類中,使用了以下幾個關鍵點和技巧:

  1. 使用 @WebMvcTest(UserController.class) 注解表示只加載 UserController 類的組件,不加載其他層次的組件。
  2. 使用 @AutoConfigureMockMvc 注解表示自動配置一個 MockMvc 對象,并使用 @Autowired 注解將其注入到測試類中。
  3. 使用 @MockBean 注解表示創建一個 UserService 的 Mock 對象,并使用 @Autowired 注解將其注入到測試類中。這樣可以避免真實地調用 UserService 的方法,而是模擬其行為。
  4. 使用 when() 方法來定義 Mock 對象的行為,例如當調用 userService.getUserById(1L) 時,返回 user 對象。
  5. 使用 mockMvc.perform() 方法來模擬發送 Http 請求,并使用 andExpect 方法來驗證 Http 響應。可以使用多種匹配器來驗證響應狀態碼、內容類型、內容值等。
  6. 使用 verify() 方法來驗證 Mock 對象的方法是否被調用了指定次數。

3.3 Repository層

在 Spring Boot 中,對 Repository 層進行單元測試,可以使用 @DataJpaTest 注解來啟動一個嵌入式數據庫,并自動配置 JPA 相關的組件。同時,可以使用 @TestEntityManager 注解來獲取一個 TestEntityManager 對象,用來操作和驗證數據庫數據。

例如,假設有一個 UserRepository 接口,它繼承了 JpaRepository 接口,并提供了一個根據用戶姓名查詢用戶列表的方法:

@Repository
public interface UserRepository extends JpaRepository<User, Long> {List<User> findByName(String name);
}

要對這個接口進行單元測試,可以編寫以下測試類:

@DataJpaTest
public class UserRepositoryTest {@Autowiredprivate UserRepository userRepository;@Autowiredprivate TestEntityManager testEntityManager;@Testpublic void testFindByName() {// 創建兩個User對象,并使用testEntityManager.persist方法將其保存到數據庫中User user1 = new User();user1.setName("Bob");user1.setEmail("bob@example.com");testEntityManager.persist(user1);User user2 = new User();user2.setName("Bob");user2.setEmail("bob2@example.com");testEntityManager.persist(user2);// 調用userRepository.findByName()方法,傳入“Bob”作為參數,得到一個用戶列表。List<User> users = userRepository.findByName("Bob");// 驗證用戶列表的大小為2,且包含了user1和user2assertThat(users).hasSize(2);assertThat(users).contains(user1, user2);}
}

在這個測試類中,使用了以下幾個關鍵點和技巧:

  1. 使用 @DataJpaTest 注解表示啟動一個嵌入式數據庫,并自動配置 JPA 相關的組件。這樣可以避免依賴外部數據庫,而是使用內存數據庫進行測試。
  2. 使用 @Autowired 注解將 UserRepository 和 TestEntityManager 對象注入到測試類中。
  3. 使用 testEntityManager.persist() 方法將 User 對象保存到數據庫中。這樣可以準備好測試數據,而不需要手動插入數據。
  4. 使用 userRepository.findByName() 方法調用自定義的查詢方法,得到一個用戶列表。
  5. 使用 AssertJ 的斷言語法來驗證用戶列表的大小和內容。可以使用多種條件和匹配器來驗證結果。

四、Spring Boot 中 Mock、Spy 對象的使用

4.1 使用Mock對象的背景

在 Spring Boot 中,除了使用 @WebMvcTest 和 @DataJpaTest 等注解來加載特定層次的組件外,還可以使用 @SpringBootTest 注解來加載完整的 Spring 上下文,從而進行更加集成的測試。但是,在這種情況下,可能會遇到一些問題,例如:

  • 測試過程中需要依賴外部資源,如:數據庫、消息隊列、Web服務等。這些資源可能不穩定或不可用,導致測試失敗或超時。
  • 測試過程中需要調用其他組件或服務的方法,但是這些方法的實現或行為不確定或不可控,導致測試結果不可預測或不準確。
  • 測試過程中需要驗證一些難以觀察或測量的結果,如:日志輸出、異常拋出、私有變量值等。這些結果可能需要使用復雜或侵入式的方式來獲取或驗證。

為了解決這些問題,可以使用 Mock 對象來模擬真實對象行為。

4.2 什么是Mock對象,有哪些好處?

Mock 對象是指在測試過程中替代真實對象的虛擬對象,它可以根據預設的規則來返回特定的值或執行特定的操作。使用 Mock 對象有以下好處:

  • 降低測試依賴: 通過使用 Mock 對象來替代外部資源或其他組件,可以減少測試過程中對真實環境的依賴,使得測試更加穩定和可靠。
  • 提高測試控制: 通過使用 Mock 對象來模擬特定的行為或場景,可以提高測試過程中對真實對象行為的控制,使得測試更加靈活和精確。
  • 簡化測試驗證: 通過使用 Mock 對象來返回特定的結果或觸發特定的事件,可以簡化測試過程中對真實對象結果或事件的驗證,使得測試更加簡單和直觀。

4.3 使用 Mock 對象的示例

在 Spring Boot 中,要使用 Mock 對象,可以使用 @MockBean 注解來創建和注入一個 Mock 對象。這個注解會自動使用 Mockito 庫來創建一個 Mock 對象,并將其添加到 Spring 上下文中。同時,可以使用 when() 方法來定義 Mock 對象的行為,以及 verify() 方法來驗證 Mock 對象的方法調用。

例如,假設有一個 EmailService 接口,它提供了一個發送郵件的方法:

public interface EmailService {void sendEmail(String to, String subject, String content);
}

要對這個接口進行單元測試,可以編寫以下測試類:

@SpringBootTest
public class EmailServiceTest {@Autowiredprivate UserService userService;@MockBeanprivate EmailService emailService;@Testpublic void testSendEmail() {// 創建一個User對象User user = new User();user.setId(1L);user.setName("ACGkaka");user.setEmail("acgkaka@example.com");// 當調用emailService.sendEmail方法時,什么也不做doNothing().when(emailService).sendEmail(anyString(), anyString(), anyString());// 調用userService.sendWelcomeEmail方法,傳入user對象作為參數userService.sendWelcomeEmail(user);// 驗證emailService.sendEmail方法被調用了一次,并且參數分別為user.getEmail()、"Welcome"、"Hello, ACGkaka"verify(emailService, times(1)).sendEmail(user.getEmail(), "Welcom", "Hello, ACGkaka");}
}

在這個測試類中,使用了以下幾個關鍵點和技巧:

  1. 使用 @SpringBootTest 注解表示加載完整的 Spring 上下文,并使用 @Autowired 注解將 UserService 對象注入到測試類中。
  2. 使用 @MockBean 注解表示創建一個 EmailService 的 Mock 對象,并使用 @Autowired 注解將其注入到測試類中。這樣可以避免真實地調用 EmailService 的方法,而是模擬其行為。
  3. 使用 doNothing() 方法來定義 Mock 對象的行為,例如當調用 emailService.sendEmail() 方法時,什么也不做。也可以使用 doReturn()、doThrow()、doAnswer() 等方法來定義其他類型的行為。
  4. 使用 anyString() 方法來表示任意字符串類型的參數,也可以使用 anyInt、anyLong、anyObject 等方法來表示其他類型的參數。
  5. 使用 userService.sendEmail() 方法調用被測方法,傳入user對象作為參數。
  6. 使用 verify() 方法來驗證 Mock 對象的方法是否被調用了指定次數,并且參數是否符合預期。也可以使用 never、atLeast、atMost 等方法來表示其他次數的驗證。

4.4 什么是Spy對象,有哪些好處?

除了使用 @MockBean 注解來創建和注入 Mock 對象外,還可以使用 @SpyBean 注解來創建和注入 Spy 對象。Spy 對象是指在測試u工程中部分替代真實對象的虛擬對象,它可以根據預設的規則來返回特定的值或執行特定的操作,同時保留真實對象的其他行為。使用 Spy 對象有以下好處:

  • 保留真實行為: 通過使用 Spy 對象來替代真實對象,可以保留真實對象的其他行為,使得測試更加接近真實環境。
  • 修改部分行為: 通過使用 Spy 對象來模擬特定的行為或場景,可以修改真實對象的部分行為,使得測試更加靈活和精確。
  • 觀察真實結果: 通過使用 Spy 對象來返回特定的結果或觸發特定的事件,可以觀察真實對象的結果或事件,使得測試更加直觀和可信。

4.5 使用 Spy 對象的示例

在 Spring Boot 中,要使用 Spy 對象,可以使用 @SpyBean 注解來創建和注入一個 Spy 對象。這個注解會自動使用 Mockito 庫來創建一個 Spy 對象,并將其添加到 Spring 上下文中。同時,可以使用 when() 方法來定義 Spy 對象的行為,以及 verify() 方法來驗證 Spy 對象的方法調用。

例如,假設有一個 LogService 接口,它提供了一個記錄日志的方法:

public interface LogService {void log(String message);
}

要對這個接口進行單元測試,可以編寫以下測試類:

@SpringBootTest
public class LogServiceTest {@Autowiredprivate UserService userService;@SpyBeanprivate LogService logService;@Testpublic void testLog() {// 創建一個User對象User user = new User();user.setId(1L);user.setName("Alice");user.setEmail("alice@example.com");// 當調用logService.log方法時,調用真實的方法,并打印參數到控制臺doAnswer(invocation -> {String message = invocation.getArgument(0);System.out.println(message);invocation.callRealMethod();return null;}).when(logService).log(anyString());// 調用userService.createUser方法,傳入user對象作為參數userService.createUser(user);// 驗證logService.log方法被調用了兩次,并且參數分別為"Creating user: Alice"、"User created: Alice"verify(logService, times(2)).log(anyString());verify(logService, times(1)).log("Creating user: Alice");verify(logService, times(1)).log("User created: Alice");}
}

在這個測試類中,使用了以下幾個關鍵點和技巧:

  1. 使用 @SpringBootTest 注解表示加載完整的Spring上下文,并使用@Autowired注解將UserService對象注入到測試類中。
  2. 使用 @SpyBean 注解表示創建一個LogService的Spy對象,并使用@Autowired注解將其注入到測試類中。這樣可以保留LogService的真實行為,同時修改部分行為。
  3. 使用 doAnswer() 方法來定義Spy對象的行為,例如當調用logService.log方法時,調用真實的方法,并打印參數到控制臺。也可以使用doReturn、doThrow、doNothing等方法來定義其他類型的行為。
  4. 使用 anyString() 方法來表示任意字符串類型的參數。也可以使用anyInt、anyLong、anyObject等方法來表示其他類型的參數。
  5. 使用 userService.createUser() 方法調用被測方法,傳入user對象作為參數。
  6. 使用 verify() 方法來驗證Spy對象的方法是否被調用了指定次數,并且參數是否符合預期。也可以使用never()、atLeast()、atMost() 等方法來表示其他次數的驗證。

整理完畢,完結撒花~🌻





參考地址:

1.Spring Boot中如何編寫優雅的單元測試,https://blog.csdn.net/TaloyerG/article/details/132487310

2.【快學springboot】在springboot中寫單元測試,https://cloud.tencent.com/developer/article/2385462

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/80271.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/80271.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/80271.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

aws服務(四)文件存儲服務S3 介紹使用代碼集成

一、介紹 1、簡介 Amazon S3 是 Amazon Web Services 提供的一種對象存儲服務(Object Storage),用于在云中存儲和檢索任意數量的數據。它以高可用性、高擴展性和高持久性著稱,非常適合用來存儲網站資源、數據備份、日志文件、大數據、機器學習輸入輸出等。 2、主要特性 …

應用信息1.13.0發布

增加工具箱 增加啟動器功能 增加布局查看器 增加手動安裝和卸載應用 增加APK文件解析 增加應用多選功能 增加查看應用預裝版本 增加應用信息和ADB命令導出 修復其它問題... 百度下載&#xff1a;百度網盤 請輸入提取碼 提取碼&#xff1a;1234

【Vue3 實戰】插槽封裝與懶加載

一、為什么需要插槽&#xff1f;從一個面板組件說起 在電商首頁開發中&#xff0c;經常遇到這樣的場景&#xff1a; 「新鮮好物」「人氣推薦」同樣類型模塊都需要相同的標題欄&#xff0c;但內容區布局不同 這時候&#xff0c;插槽&#xff08;Slot&#xff09;就像一個「內容…

虛無隧穿產生宇宙(true nothing tunneling) 是誰提出的

是 亞歷克斯.維連金 英文名&#xff08;alex vilenkin 或者 Alexander Vilenkin)提出來的。 “虛無隧穿產生宇宙”&#xff08;true nothing tunneling&#xff09;這一概念并非一個標準的物理學術語&#xff0c;它更像是對某些現代宇宙學理論的描述&#xff0c;尤其是涉及宇宙…

postgis:添加索引時提示“對訪問方法 gist 數據類型 geometry 沒有默認的操作符表“

問題 在對gis表的geom字段創建空間索引時&#xff0c;出現“對訪問方法 "gist" 數據類型 geometry 沒有默認的操作符表”的提示報錯。 解決方案 按系列步驟進行排查并解決。 1.先確認已安裝postgis -- 查看postgis版本 SELECT postgis_full_version() 若安裝了則…

圖論---Prim堆優化(稀疏圖)

題目通常會提示數據范圍&#xff1a; 若 V ≤ 500&#xff0c;兩種方法均可&#xff08;樸素Prim更穩&#xff09;。 若 V ≤ 1e5&#xff0c;必須用優先隊列Prim vector 存圖。 #include <iostream> #include <vector> #include <queue> #include <…

代碼隨想錄算法訓練營第一天:數組part1

今日學習的文章鏈接和視頻鏈接 ● 自己看到題目的第一想法 ● 看完代碼隨想錄之后的想法 ● 自己實現過程中遇到哪些困難 ● 今日收獲&#xff0c;記錄一下自己的學習時長 狀態 思路理解完成 30% 代碼debug完成 60% 代碼模板總結并抽象出來 100% 題目 704 二分查找 題目鏈接…

企業為何要求禁用缺省口令?安全風險及應對措施分析

在當今數字化時代&#xff0c;企業網絡安全面臨著前所未有的挑戰。缺省口令的使用是網絡安全中的一個重要隱患&#xff0c;許多企業在制定網絡安全紅線時&#xff0c;明確要求禁用缺省口令。本文將探討這一要求的原因及其對企業安全的重要性。 引言&#xff1a;一個真實的入侵場…

PostgreSQL 中的權限視圖

PostgreSQL 中的權限視圖 PostgreSQL 提供了多個系統視圖來查詢權限信息&#xff0c;雖然不像 Oracle 的 DBA_SYS_PRIVS 那樣集中在一個視圖中&#xff0c;但可以通過組合以下視圖獲取完整的系統權限信息。 一 主要權限相關視圖 Oracle 視圖PostgreSQL 對應視圖描述DBA_SYS_…

【防火墻 pfsense】1簡介

&#xff08;1&#xff09; pfSense 有以下可能的用途&#xff1a; 邊界防火墻 路由器 交換機 無線路由器 / 無線接入點 &#xff08;2&#xff09;邊界防火墻 ->要充當邊界防火墻&#xff0c;pfSense 系統至少需要兩個接口&#xff1a;一個廣域網&#xff08;WAN&#xff0…

數據庫+Docker+SSH三合一!深度評測HexHub的全棧開發體驗

作為一名技術博主&#xff0c;我最近一直被各種開發工具切換搞得焦頭爛額。數據庫要用Navicat&#xff0c;服務器管理得開Termius&#xff0c;Docker操作還得切到命令行&#xff0c;每天光在不同工具間切換就浪費了大量時間。直到團隊里的一位架構師向我推薦了HexHub這個一體化…

第十天 Shader編程:編寫簡單表面著色器 Addressable資源管理系統 DOTS(面向數據技術棧)入門

前言 作為Unity初學者&#xff0c;在實現復雜場景時經常會遇到性能瓶頸。本文將帶你通過四個關鍵技術的實戰學習&#xff0c;掌握現代Unity開發的核心優化方案&#xff1a; Shader編程 - 編寫表面著色器控制物體渲染Addressable系統 - 實現高效資源管理DOTS技術棧 - 解鎖百萬…

項目自動化測試

一.設計測試用例(細致全面) 二.先引入所需要的pom.xml依賴 1.selenium依賴 2.webdrivermanager依賴 3.commons-io依賴 編寫測試用例–按照頁面對用例進行劃分,每個頁面是Java文件,頁面下的所有用例統一管理 三.common包(放入公用包) 類1utils 可以調用driver對象,訪問url …

ap無法上線問題定位(交換機發包沒有剝掉pvid tag)

一中學&#xff0c;新開的40臺appoe交換機核心交換機旁掛ac出口路由的組網&#xff0c;反饋ap無法上線&#xff0c;讓協助解決。 組網如下&#xff1a; 排查過程&#xff1a; 檢查ac的配置&#xff0c;沒有發現問題 發現配置沒有問題&#xff0c;vlan1000配置子接口&#xff…

第十七屆山東省職業院校技能大賽 中職組網絡建設與運維賽項

第十七屆山東省職業院校技能大賽 中職組網絡建設與運維賽項 賽題 B 卷 第十七屆山東省職業院校技能大賽中職組網絡建設與運維賽項 1 賽題說明 一、競賽項目簡介 “網絡建設與運維”競賽共分為以下三個模塊&#xff1a; ? 網絡理論測試&#xff1b; ? 網絡建設與調試&#xf…

關于QT信號、槽、槽函數的講解

也是好久沒有發帖子了&#xff0c;最近博主主要還是在邊學QT邊完成任務&#xff0c;所以進度很慢&#xff0c;但確實在這幾天對于QT自身槽和信號這類特殊的機制有了一定簡單的理解&#xff0c;所以還是想記錄下來&#xff0c;如果有初學者看到帖子對他有一定的幫助&#xff0c;…

YOLOv8 漲點新方案:SlideLoss FocalLoss 優化,小目標檢測效果炸裂!

YOLOv8優化秘籍&#xff1a;用SlideLoss和FocalLoss提升小目標檢測精度&#xff08;附代碼實戰&#xff09;?? ?&#x1f4cc; 核心問題&#xff1a;YOLOv8在檢測小物體時效果不夠好&#xff1f;?? YOLOv8雖然是強大的目標檢測模型&#xff0c;但在處理小物體或類別不平…

基于cubeMX的hal庫STM32實現MQ2煙霧濃度檢測

一、任務目標 使用STM32F103C8T6單片機&#xff0c;使用單片機AD模塊采集MQ2煙霧傳感器的數據&#xff0c;在OLED屏顯示檢測到的AD值、電壓值和濃度值&#xff08;ppm單位&#xff09;。 二、實現過程 1、MQ2煙霧傳感器的濃度轉化方法 &#xff08;1&#xff09;實驗所用的M…

Android之AI自動化測試--Midscene

文章目錄 前言一、準備工作1.安裝2.準備 API Key3.安裝 adb4.連接設備 二、yaml格式自動化腳本1. 腳本案例2.執行結果 三、文件結構變化android 部分 前言 字節 Web Infra團隊官宣Midscene 從 v0.15 開始支持 Android 自動化測試&#xff0c;本篇文章介紹yaml方式的Android自動…

類的六個默認成員函數

如果一個類中什么成員都沒有&#xff0c;簡稱為空類。 空類中真的什么都沒有嗎&#xff1f;并不是&#xff0c;任何類在什么都不寫時&#xff0c;編譯器會自動生成以下6個默認成員函數。 默認成員函數&#xff1a;用戶沒有顯式實現&#xff0c;編譯器會生成的成員函數稱為默認…