JUnit,Logback,帶有Maven 3的Maven

在本系列中,我們已經學習了建立基本的Spring MVC應用程序并學習了如何在Spring MVC中處理表單 。 現在該討論更多涉及的主題了。 但是,在我們涉足更深的領域之前,讓我們先進行一些基礎設置。

單元測試

我不是TDD傳播者。 我在那里說了。 我從來沒有能夠編寫任何軟件的地方,對于每段代碼,我都先編寫了一個測試,然后編寫了代碼。 如果您已經這樣做并且被編碼所雇用,請告訴我。 我很想了解你。 說真的

我對TDD的意見分歧到此為止。 除了在代碼之前編寫測試(某種程度上我根本無法動動腦筋)之外,我還是單元測試的大力支持者。 我堅信使用JUnit測試所有功能(公共但非getter設置器,方法)。 我非常喜歡使用cobertura報告代碼覆蓋率。 我是maven的忠實擁護者,它使我只需一個命令就可以將它們整合到一個漂亮HTML報告中。

我將在本系列中使用JUnit 4。 讓我們添加依賴項。

檔案:\ pom.xml

<properties>                                                     <junit.version>4.10</junit.version>
</properties>  <!-- Unit testing framework. -->       
<dependency>                           <groupId>junit</groupId>           <artifactId>junit</artifactId>     <version>${junit.version}</version><scope>test</scope>                
</dependency>

讓我們添加一個啞類來演示測試。

文件:/src/main/java/org/academy/HelloWorld.java

package org.academy;public class HelloWorld {private String message = 'Hello world. Default setting.'; public String greet(){return message; }public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}
}

最后是JUnit對其進行測試。

文件:src / test / java / org / academy / HelloWorldTest.java

package org.academy;import static org.junit.Assert.*;import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class HelloWorldTest {@AutowiredHelloWorld helloWorld;private final static Logger logger = LoggerFactory.getLogger(HelloWorldTest.class);@Testpublic void test() {    logger.debug(helloWorld.greet());assertEquals(helloWorld.greet(), 'Hello world, from Spring.');}
}

您可能已經注意到,單元測試中的helloWorld從未在代碼中初始化。 這就是Spring的IoC魅力 。 為了使這項工作有效,我們使用了@ RunWith,@ ContextConfiguration和@Autowired。 而且我還為Spring提供了足夠的信息,使其能夠創建HelloWorld實例,然后將其注入到HelloWorldTest.helloWorld中。 另外,assertEquals正在檢查與HelloWorld類中實際硬編碼的消息完全不同的消息。 這是在下面提到的xml文件中完成的。 請注意在Maven結構中文件的位置。

文件:/src/test/resources/org/academy/HelloWorldTest-context.xml

<?xml version='1.0' encoding='UTF-8'?>
<beans xmlns='http://www.springframework.org/schema/beans'xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:p='http://www.springframework.org/schema/p'xmlns:context='http://www.springframework.org/schema/context'xsi:schemaLocation='http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd'><bean id='helloWorld' class='org.academy.HelloWorld'><property name='message' value='Hello world, from Spring.' /></bean>
</beans>

我可以通過多種方式將此配置文件提供給單元測試。 @RunWith(SpringJUnit4ClassRunner.class)是很不錯的添加,但不是必需的 。 我在這里提供的只是在大多數情況下都可以使用的香草方法,但我鼓勵觀眾進行試驗。

單元測試范圍/代碼范圍。

對于個人/開發人員和技術主管而言,我認為關于自動/半自動/簡便的代碼覆蓋率報告的重要性還沒有足夠的評論。 除非您虔誠地實踐TDD(以我之前從未提到過的方式進行過實踐),否則即使是單個開發人員也絕對不可能知道單元測試是否涵蓋了代碼的所有邏輯分支。 我什至不打算談論團隊/組織的技術負責人如何確保其產品經過充分的單元測試。 我個人認為,任何未經足夠的單元測試和報告測試范圍的軟件產品,都是無法接受的風險。 期。 誠然有一點硬性立場,但事實就是如此。

我對強硬立場的堅定信念來自這樣一個事實,即報告測試覆蓋率是如此容易。 在此示例中,我將使用cobertura。 您需要將cobertua添加到Maven pom。

檔案:pom.xml

<!-- Reporting -->                                              
<plugin>                                                              <groupId>org.apache.maven.plugins</groupId>                       <artifactId>maven-site-plugin</artifactId>                        <version>3.0</version>                                            <configuration>                                                   <reportPlugins>                                               <!-- Reporting on success / failure of unit tests -->     <plugin>                                                  <groupId>org.apache.maven.plugins</groupId>           <artifactId>maven-surefire-report-plugin</artifactId> <version>2.6</version>                                </plugin>                                                 <!-- Reporting on code coverage by unit tests. -->        <plugin>                                                  <groupId>org.codehaus.mojo</groupId>                  <artifactId>cobertura-maven-plugin</artifactId>       <version>2.5.1</version>                              <configuration>                                       <formats>                                         <format>xml</format>                          <format>html</format>                         </formats>                                        </configuration>                                      </plugin>                                                 </reportPlugins>                                              </configuration>

完成此操作并添加JUnit并添加實際的JUnit測試后,您只需要運行

mvn -e clean install site

創建一個漂亮的基于HTML的代碼覆蓋率報告。 此報告將允許您單擊被測試的源代碼,并為單元測試的代碼提供漂亮的綠色補丁,而對于那些通過裂縫的代碼則為您提供紅色的補丁。

記錄中

Log4j很好, Logback更好 。 只是不要使用System.out.println()進行日志記錄。

如果沒有適當的日志記錄,您可能會走很長一段路。 但是,我花了太多周末和晚上來追蹤生產問題,而企業卻深呼吸,希望有某種方法可以知道應用程序中發生的事情,而不用一味猜測。 如今,借助slf4j之類的成熟api和諸如logback之類的穩定實現,開發人員只需為每個類添加一條額外的行即可利用企業級日志記錄基礎架構。 從任何項目開始就不使用正確的日志記錄只是沒有意義的。

添加slf4j并重新登錄到Maven依賴項。

文件:\ pom.xml。

<!-- Logging -->                            
<dependency>                                <groupId>ch.qos.logback</groupId>       <artifactId>logback-classic</artifactId><version>${logback.version}</version>   
</dependency>

確保排除了Spring的默認日志記錄,即公共日志。 如果您想知道logback是否真的那么好,我聲稱這就是為什么Spring不選擇它作為開始。 在我的辯護中,這是Spring官方博客上的鏈接 ,他們說:“如果我們可以倒計時并現在作為一個新項目啟動Spring,它將使用不同的日志記錄依賴性。 首選的可能是Java的簡單日志記錄外觀(SLF4J),……”

文件:\ pom.xml。

<!-- Support for testing Spring applications with tooTestNG This artifact is generally always defined the integration testing framework and unit testin
<dependency>                                         <groupId>org.springframework</groupId>           <artifactId>spring-test</artifactId>             <version>${org.springframework.version}</version><scope>test</scope>                              <exclusions>                                     <exclusion>                                  <groupId>commons-logging</groupId>       <artifactId>commons-logging</artifactId> </exclusion>                                 </exclusions>                                    
</dependency>

提供用于注銷的配置。

文件:/src/main/resources/logback.xml

<?xml version='1.0' encoding='UTF-8'?>
<configuration><appender name='CONSOLE' class='ch.qos.logback.core.ConsoleAppender'><encoder><pattern>%d %5p | %t | %-55logger{55} | %m %n</pattern></encoder></appender><logger name='org.springframework'><level value='INFO' /></logger><root><level value='DEBUG' /><appender-ref ref='CONSOLE' /></root>
</configuration>

最后,在每個需要記錄的類(應該是所有類)的開始處添加一個魔術貼。

文件:src / test / java / org / academy / HelloWorldTest.java

[...]                                                    
private final static Logger logger = LoggerFactory  .getLogger(HelloWorldTest.class);           
[...]
logger.debug(helloWorld.greet());
[...]

你們都在那里準備好了。 現在是時候深入春天了。

快樂的編碼。

想了解更多嗎?

這里是本系列早期文章的鏈接。
Hello World with Spring 3 MVC
使用Spring 3 MVC處理表單

而且,當然強烈推薦
Spring 3使用JUnit 4進行測試。
使用Spring Framework運行單元測試 @RunWith JUnit4以及SpringJUnit4ClassRunner和參數化 Junit和Spring的問題。

在Tech for Enterprise博客上,來自我們的JCG合作伙伴 Partho的 參考資料: JUnit,Logback,Maven和Spring 3 。


翻譯自: https://www.javacodegeeks.com/2012/07/junit-logback-maven-with-spring-3.html

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

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

相關文章

Gradle中的buildScript,gradle wrapper,dependencies等一些基礎知識

就想收藏一篇好文&#xff0c;哈哈&#xff0c;無他 Gradle中的buildScript代碼塊 - 黃博文 然后記錄一些gradle的基礎知識&#xff1a; 1.gradle wrapper就是對gradle的封裝&#xff0c;可以理解為項目內部內置了gradle 2.dependencies的參數 上官方參數表https://docs.gradle…

phonegap工程中修改app的名字

針對phonegap比較高的版本&#xff0c;我的是6.4.0。 在phonegap工程中&#xff0c;當添加了iOS和android平臺或多個平臺后&#xff0c;工程進行了開發&#xff0c;然后覺得app的名字想修改一下&#xff08;比如在手機上顯示的app名字&#xff0c;或者通過ipa導入安裝或者apk包…

ac ap方案 華為_華為無線_AC+AP小型無線網絡配置實驗_v1

【如果在實驗中有什么疑問&#xff0c;歡迎關注微信公眾號“IT后院”給我留言&#xff0c;我會抽空回答你的問題】華為無線-ACAP小型無線網絡配置實驗_v1網絡結構圖&#xff1a;步驟一&#xff1a;配置網絡連通性SW:interface Vlanif100ip address 192.168.0.1 255.255.255.0in…

css類選擇器或邏輯,深入理解CSS中選擇器的邏輯處理

在過去的很長一段時間中&#xff0c;我們都說 CSS 是不帶有任何邏輯的&#xff0c;意思是在 CSS 中沒有控制流&#xff0c;也沒有某種類似于其他編程語言的方式來組織 CSS。CSS 天生缺乏邏輯性的問題導致了預處理器的出現。然而業界卻對 CSS 預處理器褒貶不一&#xff0c;支持預…

JSF基于事件的交流:新派方法

在上一篇文章中 &#xff0c;我們學習了基于Observer / Event Listener和Mediator模式的基于事件的通信。 由于它們的缺點&#xff0c;我想展示基于事件的通信的更有效方法。 我們將從Google Guava EventBus開始&#xff0c;以CDI &#xff08;Java EE平臺的上下文和依賴注入&a…

菜鳥之路-淺談設計模式之單例設計模式

單例設計模式 定義&#xff1a;確保一個類僅僅有一個實例&#xff0c;并且自行實例化并向整個系統提供這個實例。單例模式是一種經常使用的軟件設計模式。在它的核心結構中僅僅包括一個被稱為單例的特殊類。通過單例模式能夠保證系統中一個類僅僅有一個實例并且該實例易于外界訪…

python 32bit數據結構_python實現bitmap數據結構詳解

bitmap是很常見的算法設計&#xff0c;例如用以Bloom Filter中&#xff1b;用以無反復整數金額的排列這些。bitmap一般根據數組來完成&#xff0c;數組中每一個原素能夠當做是一系列二進制數&#xff0c;全部元素組成更高的二進制結合。針對Python而言&#xff0c;整數金額種類…

MVC如何使用開源分頁插件shenniu.pager.js

最近比較忙&#xff0c;前期忙公司手機端接口項目&#xff0c;各種開發調試發布現在幾乎上線無問題了&#xff1b;雖然公司項目忙不過在期間抽空做了兩件個人覺得有意義的事情&#xff0c;一者使用aspnetcore開發了個人線上項目&#xff08;要說線上其實只能ip訪問&#xff0c;…

四. 基于環視Camera的BEV感知算法-PETR

目錄 前言0. 簡述1. 算法動機&開創性思路2. 主體結構3. 損失函數4. 性能對比5. PETRv2總結下載鏈接參考 前言 自動駕駛之心推出的《國內首個BVE感知全棧系列學習教程》&#xff0c;鏈接。記錄下個人學習筆記&#xff0c;僅供自己參考 本次課程我們來學習下課程第四章——基…

Java EE 6 VS Spring 3:Java EE已經殺死了Spring? 沒門!

介紹 幾天前&#xff0c;我在聽Java Spotlight Podcast的插曲85 。 在這次演講中&#xff0c; Bert Ertman和Paul Bakker討論了從Spring遷移到Java EE。 基本上&#xff0c;在他們的介紹中&#xff0c;他們說&#xff0c;如今&#xff0c;選擇Spring而不是Java EE是沒有意義的。…

usb檢測串口是哪個角_怎樣測試串口和串口線是否正常

一步&#xff1a;把串口線或者USB轉串口線插到計算機上。二步&#xff1a;打開串口調試助手接著選擇串口&#xff0c;串口線和 USB 轉串口的端口號查看路徑&#xff1a;電腦上--右鍵--屬性--硬件--設備管理器-端口(COM 和LPT),點開端口前面的號查看即可。注釋&#xff1a;1、US…

NodeJS常用模塊介紹

收集了NodeJS開發中常用的一些模塊。MVC框架 - Express Express 是輕量靈活的Nodejs Web應用框架&#xff0c;它可以快速地搭建網站。Express框架建立在Nodejs內置的Http模塊上&#xff0c;并對Http模塊再包裝&#xff0c;從而實際Web請求處理的 功能。它支持多種前端模板&…

Java泛型面試問題

Java面試中的通用面試問題在相當長的時間內在Java 5周圍越來越普遍&#xff0c;許多應用程序都轉移到Java 5上&#xff0c;并且幾乎所有新的Java開發都發生在Tiger&#xff08;Java 5的代號&#xff09;上。 泛型和Java 5功能&#xff08;例如Enum&#xff09;的重要性&#xf…

隱層元素閃一下_太陽一直依靠什么元素在燃燒,地球上的重元素又是怎么來的?...

本文基于回答網友一個這樣的問題&#xff1a;太陽目前氫核聚變是氦碳氧穩定燃燒地球上的鐵鎳重元素哪里來的&#xff1f;可以說&#xff0c;這是一個毫無邏輯亂七八糟的問題&#xff0c;但既然邀請回答&#xff0c;就從中挑出幾個稍顯合理的問題說明一下。太陽核心每時每刻都在…

基于Token的WEB后臺認證機制

基于Token的WEB后臺認證機制 幾種常用的認證機制 HTTP Basic Auth HTTP Basic Auth簡單點說明就是每次請求API時都提供用戶的username和password&#xff0c;簡言之&#xff0c;Basic Auth是配合RESTful API 使用的最簡單的認證方式&#xff0c;只需提供用戶名密碼即可&#xf…

JSF基于事件的溝通:過時的方法

用JSF編寫的Web應用程序由相互交互的bean組成。 在開發Web應用程序時&#xff0c;bean之間的通信是主要的設計模式之一。 有時&#xff0c;一個bean需要向其他bean發送事件&#xff0c;以通知它們某些更改或其他任何更改。 我們通常可以將托管bean或Spring bean注入另一個bean的…

mysql調優 基礎

MySQL調優可以從幾個方面來做&#xff1a;1. 架構層&#xff1a;做從庫&#xff0c;實現讀寫分離&#xff1b;2.系統層次&#xff1a;增加內存&#xff1b;給磁盤做raid0或者raid5以增加磁盤的讀寫速度&#xff1b;可以重新掛載磁盤&#xff0c;并加上noatime參數&#xff0c;這…

saltstack

第一&#xff1a;安裝前準備&#xff1a; 聲明我用的是ubuntu 16.04的系統 1.修改主機名&#xff0c;并保證兩臺機器可以互相ping同主機名 ip1 master_hostname ip2 slave_hostname 第二&#xff1a;安裝 服務器安裝 yum install salt-master -y客戶端安裝 yum install salt…

ios 百度地圖指定區域_獲取百度地圖可視區域范圍的數據

有個業務場景&#xff0c;需要根據獲取到的地圖區域顯示&#xff0c;根據相應的經緯度反查 左側區域的會議室。思路&#xff1a;1.得到百度地圖可視區域--可視區域的中心點2.可視區域的四個角的其中兩個(東北角西南角)http://lbsyun.baidu.com/cms/jsapi/reference/jsapi_refer…

使用WS-Trust / STS采樣器擴展JMeter

JMeter沒有對WS-Security或WS-Trust的任何內置支持&#xff0c;這使我為JMeter開發了此STS Sampler –可以在負載測試STS時使任何人的生活變得更好。 首先&#xff0c;您需要擁有Apache JMeter發行版。 我正在使用v2.7。 然后&#xff0c;您可以從此處下載sts.sampler.zip –解…