天天看點

一文教會你如何在 Spring 中進行內建測試,太贊了

一文教會你如何在 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