單元測試
我不是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)是很不錯的添加,但不是必需的 。 我在這里提供的只是在大多數情況下都可以使用的香草方法,但我鼓勵觀眾進行試驗。
單元測試范圍/代碼范圍。
我對強硬立場的堅定信念來自這樣一個事實,即報告測試覆蓋率是如此容易。 在此示例中,我將使用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的代碼覆蓋率報告。 此報告將允許您單擊被測試的源代碼,并為單元測試的代碼提供漂亮的綠色補丁,而對于那些通過裂縫的代碼則為您提供紅色的補丁。
記錄中
如果沒有適當的日志記錄,您可能會走很長一段路。 但是,我花了太多周末和晚上來追蹤生產問題,而企業卻深呼吸,希望有某種方法可以知道應用程序中發生的事情,而不用一味猜測。 如今,借助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