單元測試
單元測試是小型的(測試一種用例或單元),在內存中運行(不與數據庫,消息隊列等交互),可重復且快速的測試。 對于我們的對話,讓我們將其限制為開發人員編寫的基于JUnit的測試用例,以檢查其各自的代碼。
整合測試
集成測試更大(測試一個流程或組件集成),不一定只在內存中運行(與數據庫,文件系統,消息隊列等交互),肯定較慢,并且不一定可重復(因為結果可能會更改)以防萬一,例如在數據庫中做了一些更改)。
為什么這種差異化很重要?
在敏捷編程中,其基本概念是每隔一段時間(一天在開發人員盒中多次)運行單元測試,并強制集成測試每天運行一次(在連續集成服務器上而不是在開發人員盒上)。 。 請注意,開發人員應該能夠在需要時運行集成測試,這僅僅是因為它與單元測試是分開的,因此開發人員現在可以選擇不在每次運行測試時都運行集成測試。
這種靈活性究竟有何幫助?
- 開發人員的構建頻率更高。 在敏捷世界中,這意味著開發人員會更頻繁地運行單元測試(每天通常運行幾次)。
- 開發人員可以更快地了解錯誤,并減少浪費的時間來編碼損壞的代碼庫。 這意味著節省時間和金錢。
- 修復錯誤更容易,更快。 考慮到構建的頻率,可以提交較少數量的“違規代碼”,因此更容易將錯誤歸零并進行修復。
- 最后但并非最不重要的一點是,任何進行過任何專業編碼的人都將證明,雖然偶爾可以休息10分鐘,這比等待1小時才能更有效地殺死編碼人員的創造力。 。 對士氣的影響是無形的,但卻是巨大的。
我到底該如何減少構建時間?
沒有一個適合所有人的尺碼(從來沒有)。 縮短構建和發布時間的確切可執行步驟將是許多變量的因素,其中包括產品的技術堆棧(Java,DotNet,php),構建和發布技術(批處理文件,Ant,Maven)以及許多其他因素。
對于Java,Maven和JUnit組合……
讓我們首先使用Maven創建一個簡單的Java應用程序來演示這種情況。
\ MavenCommands.bat
ECHO OFF REM =============================
REM Set the env. variables.
REM =============================
SET PATH=%PATH%;C:\ProgramFiles\apache-maven-3.0.3\bin;
SET JAVA_HOME=C:\ProgramFiles\Java\jdk1.7.0REM =============================
REM Create a simple java application.
REM =============================
call mvn archetype:create ^-DarchetypeGroupId=org.apache.maven.archetypes ^-DgroupId=org.academy ^-DartifactId=app001
pause
如果運行此批處理文件,則將從為您準備好的標準Java應用程序開始。
默認的Java應用程序不附帶最新的JUnit。 您可能想要更改Maven配置以添加最新的JUnit。
\ pom.xml
[...]4.10[...]junitjunit${junit.version}test
現在,繼續添加一個JUnit測試類。
/app001/src/test/java/org/academy/AppTest.java
public class AppTest {private final static Logger logger = LoggerFactory.getLogger(AppTest.class);@Test
public void smallAndFastUnitTest() {logger.debug("Quick unit test. It is not expected to interact with DB etc.");assertTrue(true);
}@Test
@Category(IntegrationTest.class)
public void longAndSlowIntegrationTest() {logger.debug("Time consuming integration test. It is expected to interact with DB etc.");assertTrue(true);
}
}
您可能會注意到有一個IntegrationTest.class標記。 您還必須創建此類。
/app001/src/test/java/org/academy/annotation/type/IntegrationTest.java
public interface IntegrationTest {// Just a marker interface.
}
創建標記接口并注釋測試方法(或類,如果選擇的話)是代碼中要做的全部工作。
現在,剩下要做的就是告訴Maven僅在集成測試階段運行“集成測試”。 這意味著開發人員在大多數情況下可以選擇僅運行單元測試(與數據庫,隊列等隔離??的快速測試)。 持續集成服務器(即Hudson(或類似產品))將運行單元測試和集成測試(由于預期將與數據庫等交互,因此運行速度會較慢),并且可能在一夜之間發生。
因此,這是您的操作方式。
/pom.xml
org.apache.maven.pluginsmaven-surefire-plugin2.12org.apache.maven.surefiresurefire-junit472.12-XX:-UseSplitVerifierorg.academy.annotation.type.IntegrationTest
這意味著開發人員只需使用一根襯管即可運行所有單元測試。
mvn clean test
這將不會運行任何注釋為集成測試的測試。
對于集成測試,請添加以下內容。
/pom.xml
maven-failsafe-plugin2.12org.apache.maven.surefiresurefire-junit472.12org.academy.annotation.type.IntegrationTestintegration-test**/*.class
這意味著Hudson或開發人員(如果他選擇的話)可以通過一個命令運行所有測試,單元和集成。
mvn clean verify
當然,如果您選擇全部進行編譯,運行單元測試,打包,運行集成測試和部署,那么也可以使用單行命令來完成。
mvn clean deploy
而已。 您已朝著更快的構建和更敏捷的工作方式邁出了一步。 快樂的編碼。
進一步閱讀
- 也可以通過Javalobby的此鏈接獲得本文的一個版本-稍作編輯。
- 這是另一篇文章 ,涉及使用相同技術的類似主題。
參考:對 測試進行分類以減少構建時間。 從我們的JCG合作伙伴 Partho在Tech for Enterprise博客上獲得。
翻譯自: https://www.javacodegeeks.com/2012/07/categorize-tests-to-reduce-build-time.html