一文教會你如何在 Spring 中進行內建測試,太贊了
不得不說,測試真的是太重要了!但并不是所有的開發者都這樣認為,這種感覺在我回到洛陽後尤其強烈。竟然有團隊成員不經測試就把代碼送出到代碼庫,并且是會報錯的那種,我天呐,遇到這種隊友我也是醉了。
我之前是在一家日企工作,他們非常注重測試,占用的時間比代碼編寫的時間多多了。從單元測試到內建測試,所有的測試結果都要整理成文檔儲存下來,哪怕你覺得完全沒有必要。但正是這種一絲不苟的态度,成就了日企軟體高品質的美譽。
單元測試通常比較簡單,對運作環境的依賴性不強。但內建測試就完全不同了,需要整個項目是能夠跑起來的,比如說需要資料庫是連接配接的,網絡是通暢的等等。
內建測試最簡單的形式是:把兩個已經測試過的單元組合成一個元件,測試它們之間的接口。從這一層意義上講,元件是指多個單元的內建聚合。在現實方案中,許多單元組合成元件,而這些元件又聚合為程式的更大部分。方法是測試片段的組合,并最終擴充成程序,将子產品與其他組的子產品一起測試。最後,将構成程序的所有子產品一起測試。
Spring 提供了 Spring TestContex Framework 來支援內建測試,它不依賴于特定的測試架構,是以你可以選擇 Junit,也可以選擇 TestNG。本文選擇 Junit,是以需要先将 Junit 和 Spring TestContex Framework 的依賴添加到 pom.xml 檔案中。
org.springframework
spring-test
5.2.2.RELEASE
test
junit
4.12
準備工作完成後,來考慮這樣一個場景,我們需要同時為開發環境和生産環境維護資料源配置,是以我們先建立一個公共的接口 Datasource,内容如下所示:
public interface Datasource {
public void setup();
}
建立 DevDatasource 類,實作 Datasource 接口,該類用于為開發環境配置資料源,内容如下:
@Component
@Profile("dev")
public class DevDatasource implements Datasource {
@Override
public void setup() {
System.out.println("開發環境");
}
@Component 注解用于為 Spring 容器注入一個通用的 Bean 元件。@Profile 注解用于辨別不同環境下要執行個體化的 Bean,字元串“dev” 表示該元件用于開發環境。
建立 ProdDatasource 類,實作 Datasource 接口,該類用于為正式運作環境配置資料源,内容如下:
@Profile("prod")
public class ProdDatasource implements Datasource {
System.out.println("正式環境");
建立配置類 SpringTestConfig,内容如下:
@Configuration
@ComponentScan("test")
public class SpringTestConfig {
@Configuration 注解表示目前類為一個配置類,@ComponentScan 注解用于指定掃描路徑,該路徑下的 Bean 将會自動裝配到 Spring 容器中。
基于 Maven 建構的項目預設有兩個測試目錄,src/test/java 和 src/test/resources,分别對應于 src/main/java 和 src/main/resources。前者用于測試項目源碼,後者用于測試項目資源。
我們在 src/test/java 目錄下建立測試類 DevTest,内容如下:
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles("dev")
@ContextConfiguration(classes = { SpringTestConfig.class })
public class DevTest {
@Autowired
Datasource datasource;
@Test
public void testSpringProfiles() {
Assert.assertTrue(datasource instanceof DevDatasource);
1)@RunWith 注解用于指定 Junit 運作環境,是 Junit 提供給其他架構測試環境的接口擴充,Spring 提供了 org.springframework.test.context.junit4.SpringJUnit4ClassRunner 作為 Junit 測試環境。
2)@ActiveProfile 注解用于指定哪個配置檔案處于活動狀态,本例為開發環境“dev”。
3)@ContextConfiguration 注解用于指定配置類,本例為 SpringTestConfig 類。
4)@Autowired 注解用于指定 Spring 要自動裝配的 Bean。
5)@Test 注解用于表示目前方法為 Junit 測試方法。
程式運作的結果如下圖所示:
再建立一個測試類 ProdTest,内容如下:
@ActiveProfiles("prod")
public class ProdTest {
Environment environment;
for (String profileName : environment.getActiveProfiles()) {
System.out.println("目前激活的 profile - " + profileName);
}
Assert.assertTrue(datasource instanceof ProdDatasource);
這次使用 @ActiveProfiles("prod") 注解指定目前環境為正式運作下的環境。本例中我們裝配了一個新的 Bean environment,使用它的 getActiveProfiles() 方法可以擷取目前激活的 Profile。程式運作的結果如下圖所示:
好了,我親愛的讀者朋友,以上就是本文的全部内容了,是不是感覺在 Spring 中進行內建測試還是挺簡單的?如果覺得文章對你有點幫助,請微信搜尋「 沉默王二 」第一時間閱讀。示例代碼已經上傳到 GitHub,傳送門~
原文位址
https://www.cnblogs.com/qing-gee/p/12671272.html