單元測試優化:為什么要對程序進行測試?測試有什么好處?

單元測試(Unit Testing)又稱為模塊測試, 是針對程序模塊(軟件設計的最小單位)來進行正確性檢驗的測試工作。 程序單元是應用的最小可測試部件。簡單來說,就是測試數據的穩定性是否達到程序的預期。

我們日常開發時可能在不經意間寫錯,如果等到最后階段去檢驗項目成果時,發現有錯誤,這時候我們很難找到Bug的源頭在哪里。我們都知道,有可能一處出錯會導致步步錯的情況。

測試就在我們的上述說法中,顯得尤為重要,當我們做完項目的一個小模塊,先去測試一下這個小模塊是否正確或達到預期,如果錯誤或者沒有達到預期就需要反復修改,直到正確或達到預期,也就是使用了單元測試。

單元測試的編碼規范一般涉及到以下內容:

類名: 定義測試類,類名是由被測試類名Test構成。例如:CalculatorTest;

包名:定義的測試類需要放在xxx.xxx.xxx.test包中。例如:package com.autodrive.test;

方法名: 測試方法的方法名有兩種定義方式test測試方法和測試方法。例如:testCheck和check;

返回值: 因為我們的方法只是在類中測試,可以獨立運行,所以不需要處理任何返回值,所以這里使用void。例如:public void check();

參數列表: 因為我們的方法是用來測試的,至于參數列表的傳入是沒有必要的。我們在測試的時候自行傳入需要的參數測試即可。所以在此參數列表為空。例如:例如:public void check();

@Test注解: 測試是需要運行來完成的。如果我們只有一個main方法,顯然在結構上還是需要我們去注釋掉測試過的。解決此問題這里我們需要在測試方法上方加@Test注解來完成測試,只要是加該注解的方法,可以單獨運行此方法來完成測試。

IDEA快捷導入Junit4、5: 使用IDEA的小伙伴,你們的福音來了。我們可以先創建測試類和方法,然后在測試方法上方加入@Test注解,此時IDEA顯示的@Test注解是飄紅的,這時候我們使用Alt + Enter組合鍵來打開導入Junit單元測試列表,然后再選擇Junit4或者Junit5確定。

在SpringBoot往往存在單元測試用到如下的注解與寫法:

@RunWith(SpringRunner.class)

@SpringBootTest(classes = Application.class)

@Transactional

@Rollback(true) // 事務自動回滾,默認是true。可以不寫

public class NoticeServiceTest {

@Autowired

private NoticeService noticeService;

@Test

public void sayHello() {

helloService.sayHello("zhangsan");

}

}

在上面這個例子中,@SpringBootTest啟動了SpringBoot環境,掃描應用程序的spring配置,并構建完整的Spring Context,其classes = Application.class啟動了整個項目。通過@SpringBootTest我們可以指定啟動類,或者給@SpringBootTest的參數webEnvironment賦值為SpringBootTest.WebEnvironment.RANDOM_PORT,這樣就會啟動web容器,并監聽一個隨機的端口,同時,為我們自動裝配一個TestRestTemplate類型的bean來輔助我們發送測試請求。

@Transactional表明調用數據庫并作事務處理;@RunWith(SpringRunner.class)聲明在Spring的環境中進行單元測試,這樣Spring的相關注解就會被識別并起效,而@Autowired啟動了Spring。

當項目使用了@Component注解,在SpringBoot項目啟動的時候就會跟著實例化/啟動,這個@Component注解的類里有多線程方法,隨著啟動類中定義的ApplicationStartup類啟動了,那么在你執行單元測試的時候,由于多線程任務的影響,就可能對你的數據庫造成了數據修改,即使你使用了事務回滾注解。

高效的單元測試應該脫離數據庫,以滿足快速啟動完成測試、支持服務間調用的需求。可以通過如下幾點來對上述例子進行優化:

1. 啟動Spring會讓run->Junit Test的時候程序變慢,這是每次運行單元測試都很慢的原因之一。然后單元測試是只針對某一個類的方法來測,啟動Spring很多時候是多余的,所以我們只需要對應的實體類實例就夠了。在需要注入bean的時候,我們直接new。

private NoticeService noticeService = new NoticeService();

2. @SpringBootTest是在SpringBoot項目上使用的,它在@SpringBootContextLoader的基礎上,配置文件屬性的讀取,會讀取、解析一些項目配置文件,還會連接數據庫,然后如果啟動類又帶有別的啟動類、@Component、多線程等,而單元測試很多時候可以避免啟動SpringBoot,減少啟動所耗費的大量時間,即不使用@SpringBootTest注解。

3. 應當使用斷言來判斷單元測試結果是否符合預期。

4. @RunWith 在JUnit中有很多個Runner,他們負責調用具體測試代碼,每一個Runner都有各自的特殊功能,你要根據需要選擇不同的Runner來運行你的測試代碼,且一般都是使用SpringRunner.class。如果我們只是簡單的做普通Java測試,不涉及Spring Web項目,可以省略@RunWith注解,這樣系統會自動使用默認Runner來運行你的代碼。

5.單元測試可以通過Mock數據的方式避開對數據庫的調用,減少很多數據庫連接的時間。Mock是模擬一切操作數據庫的步驟,不執行任何SQL,我們直接模擬這句操作數據庫的代碼執行會是成功的,而且可以模擬任何返回值,主要有兩個注解。只要是本地的,自己寫的bean,都可以使用@MockBean,它會把所有操作數據庫的方法模擬。如果是沒有返回值的方法,我們就可以不管。如果是有返回值的方法,我們可以給它返回各自我們需要模擬的值。如果是我們本地,調用別的公司,別的地方給我們寫好的接口,不是操作我們自己的數據庫,是我們寫好入參,別人給我們返回值,我們就用@SpyBean。

Mock所需依賴如下:

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-test</artifactId>

<scope>test</scope>

</dependency>

通過以上優化,可以大大縮短我們單測的時間,提高我們開發效率。

?

【整整200集】超超超詳細的Python接口自動化測試進階教程合集,真實模擬企業項目實戰

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

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

相關文章

19、SQL注入之SQLMAP繞過WAF

目錄 邏輯層1、邏輯問題2、性能問題 白名單方式一&#xff1a;IP白名單方式二&#xff1a;靜態資源方式三&#xff1a;url白名單方式四: 爬蟲白名單 sqlmap在測試漏洞的時候&#xff0c;選擇了no&#xff0c;它就不會去測試其它的了&#xff0c;我們一般選擇yes&#xff0c;為了…

Deep Learning With Pytorch - 最基本的感知機、貫序模型/分類、擬合

文章目錄 如何利用pytorch創建一個簡單的網絡模型&#xff1f;Step1. 感知機&#xff0c;多層感知機&#xff08;MLP&#xff09;的基本結構Step2. 超平面 ω T ? x b 0 \omega^{T}xb0 ωT?xb0 or ω T ? x b \omega^{T}xb ωT?xb感知機函數 Step3. 利用感知機進行決策…

SpringBoot整合Minio

SpringBoot整合Minio 在企業開發中&#xff0c;我們經常會使用到文件存儲的業務&#xff0c;Minio就是一個不錯的文件存儲工具&#xff0c;下面我們來看看如何在SpringBoot中整合Minio POM pom文件指定SpringBoot項目所依賴的軟件工具包 <?xml version"1.0" …

Ubuntu上安裝RabbitMQ

在Ubuntu上安裝RabbitMQ并設置管理員用戶為"admin"&#xff0c;密碼為"123456"&#xff0c;并開啟開機自啟 更新系統軟件包列表。在終端中執行以下命令&#xff1a; sudo apt update安裝RabbitMQ服務器軟件包。運行以下命令&#xff1a; sudo apt insta…

DaVinci Resolve Studio 18 for Mac 達芬奇調色

DaVinci Resolve Studio 18是一款專業的視頻編輯和調色軟件&#xff0c;適用于電影、電視節目、廣告等各種視覺媒體的制作。它具有完整的后期制作功能&#xff0c;包括剪輯、調色、特效、音頻處理等。 以下是DaVinci Resolve Studio 18的主要特點&#xff1a; - 提供了全面的視…

Linux 設置 ssh 內網穿透

背景&#xff1a;有三臺機器A、B、C&#xff0c;機器 A 位于某局域網內&#xff0c;能夠連接到互聯網。機器 B 有公網 IP&#xff0c;能被 A 訪問到。機器 C 位于另外一個局域網內&#xff0c;能夠連接到互聯網&#xff0c;能夠訪問 B。 目標&#xff1a;以 B 為中介&#xff…

Jmeter-壓測時接口按照順序執行-臨界部分控制器

文章目錄 臨界部分控制器存在問題 臨界部分控制器 在進行壓力測試時&#xff0c;需要按照順序進行壓測&#xff0c;比如按照接口1、接口2、接口3、接口4 進行執行 查詢結果是很混亂的&#xff0c;如果請求次數少&#xff0c;可能會按照順序執行&#xff0c;但是隨著次數增加&a…

Python-OpenCV中的圖像處理-模板匹配

Python-OpenCV中的圖像處理-模板匹配 模板匹配單對象的模板匹配多對象的模板匹配 模板匹配 使用模板匹配可以在一幅圖像中查找目標函數&#xff1a; cv2.matchTemplate()&#xff0c; cv2.minMaxLoc()模板匹配是用來在一副大圖中搜尋查找模版圖像位置的方法。 OpenCV 為我們提…

無線充電底座

<項目>無線充電器 前言 個人DIY的無線充電底座&#xff08;帶磁吸&#xff09;&#xff0c;基于IP6829方案。 Drawn By:67373 硬件部分 3D模型 資料開源鏈接 https://github.com/linggan17/WirelessCharge

面試熱題(每日溫度)

請根據每日 氣溫 列表 temperatures &#xff0c;重新生成一個列表&#xff0c;要求其對應位置的輸出為&#xff1a;要想觀測到更高的氣溫&#xff0c;至少需要等待的天數。如果氣溫在這之后都不會升高&#xff0c;請在該位置用 0 來代替。 輸入: temperatures [73,74,75,71,69…

SpringBoot + Mybatis多數據源

一、配置文件 spring: # datasource: # username: root # password: 123456 # url: jdbc:mysql://127.0.0.1:3306/jun01?characterEncodingutf-8&serverTimezoneUTC # driver-class-name: com.mysql.cj.jdbc.Driverdatasource:# 數據源1onedata:jdbc-url: j…

SCF金融公鏈新加坡啟動會 鏈結創新驅動未來

新加坡迎來一場引人矚目的金融科技盛會&#xff0c;SCF金融公鏈啟動會于2023年8月13日盛大舉行。這一受矚目的活動將為金融科技領域注入新的活力&#xff0c;并為廣大投資者、合作伙伴以及關注區塊鏈發展的人士提供一個難得的交流平臺。 在SCF金融公鏈啟動會上&#xff0c; Wil…

CentOS7的journalctl日志查看方法

多臺服務器間免密登錄|免密拷貝 Cenos7 搭建Minio集群部署服務器(一) Cenos7 搭建Minio集群Nginx統一訪問入口|反向動態代理(二) Spring Boot 與Minio整合實現文件上傳與下載(三) CentOS7的journalctl日志查看方法 MySQL8.xx一主兩從復制安裝與配置 1、概述 日志管理工…

【ElasticSearch入門】

目錄 1.ElasticSearch的簡介 2.用數據庫實現搜素的功能 3.ES的核心概念 3.1 NRT(Near Realtime)近實時 3.2 cluster集群&#xff0c;ES是一個分布式的系統 3.3 Node節點&#xff0c;就是集群中的一臺服務器 3.4 index 索引&#xff08;索引庫&#xff09; 3.5 type類型 3.6 doc…

【佳佳怪文獻分享】MVFusion: 利用語義對齊的多視角 3D 物體檢測雷達和相機融合

標題&#xff1a;MVFusion: Multi-View 3D Object Detection with Semantic-aligned Radar and Camera Fusion 作者&#xff1a;Zizhang Wu , Guilian Chen , Yuanzhu Gan , Lei Wang , Jian Pu 來源&#xff1a;2023 IEEE International Conference on Robotics and Automat…

kubernetes企業級高可用部署

目錄 1、Kubernetes高可用項目介紹 2、項目架構設計 2.1、項目主機信息 2.2、項目架構圖 1、Kubernetes高可用項目介紹 2、項目架構設計 2.1、項目主機信息 2.2、項目架構圖 2.3、項目實施思路 3、項目實施過程 3.1、系統初始化 3.2、配置部署keepalived服務 3.3、…

強制Edge或Chrome使用獨立顯卡【WIN10】

現代瀏覽器通常將圖形密集型任務卸載到 GPU&#xff0c;以改善你的網頁瀏覽體驗&#xff0c;從而釋放 CPU 資源用于其他任務。 如果你的系統有多個 GPU&#xff0c;Windows 10 可以自動決定最適合 Microsoft Edge 自動使用的 GPU&#xff0c;但這并不一定意味著最強大的 GPU。 …

Linux/centos上如何配置管理NFS服務器?

Linux/centos上如何配置管理NFS服務器&#xff1f; 1 NFS基礎了解1.1 NFS概述1.2 NFS工作流程 2 安裝和啟動NFS服務2.1 安裝NFS服務器2.2 啟動NFS服務 3 配置NFS服務器和客戶端3.1 配置NFS服務器3.2 配置NFS客戶端 4 實際示例4.1 基本要求4.2 案例實現 1 NFS基礎了解 NFS&…

LAXCUS如何通過技術創新管理數千臺服務器

隨著互聯網技術的不斷發展&#xff0c;服務器已經成為企業和個人獲取信息、進行計算和存儲的重要工具。然而&#xff0c;隨著服務器數量的不斷增加&#xff0c;傳統的服務器管理和運維方式已經無法滿足現代企業的需求。LAXCUS做為專注服務器集群的【數存算管】一體化平臺&#…

Jtti:Windows server如何備份與還原注冊表

在 Windows Server 中&#xff0c;備份和還原注冊表是一項重要的任務&#xff0c;可以幫助你在系統配置更改之前創建一個恢復點&#xff0c;以防止出現問題。以下是在 Windows Server 上備份和還原注冊表的步驟&#xff1a; 備份注冊表&#xff1a; 1.打開“運行”對話框&…