閱讀337 返回首頁    go 阿裏雲 go 技術社區[雲棲]


PicoContainer(Ioc容器)在測試用例中的應用(一)

PicoContainer是一個輕量級Ioc(Inversion of Control)容器, 最重要的特征是它的尺寸,它沒有攔截器、AOP 或相似類型的服務,但它具有完整的依賴注入容器。 PicoContainer 支持 Java 配置技術,而不支持 XML 配置技術,也就是說容器內各組件的依賴規則都是通過java程序來配置的。
為什麼要使用ioc容器
話說第一天我們要完成一個數據庫的讀測試,讀的行為分別為順序和隨機。按照傳統的做法我們會寫兩個case分別實現順序讀和隨機讀過程,很簡單我們一會就完成了。第二天我們需要完成一個寫測試,同樣有兩個行為:順序、隨機。我們用同樣的方法寫了順序寫和隨機寫兩個case。第三天我們要完成一個讀寫混合測試,老板要求順序隨機的行為都需要覆蓋到,悲催得我們難道要把讀寫行為來個排列組合?現實就是這樣,隨著讀寫場景的越來越複雜我們發現我們把同樣的準備數據、寫入數據、讀取數據、刪除數據這個過程完成n遍。case越來越多越來越複雜,突然有一天開發把讀寫接口重構了=。=!……
顯然,做為一個立誌不做2青年的同學,我們有很多辦法來避免這種情況的發生。其中就有我們的PicoContainer。下麵筆者就一步一步介紹它是怎麼來幫我們的做到的。
PicoContainer有什麼用

Ioc的概念大家都很清楚,下麵筆者用讀寫的這個實例來介紹下使用Ioc容器如何來構建我們的測試用例。

1、分析測試用例
回到上麵那個場景,經過我們的分析發現不管是怎樣的讀寫行為用例的要完成過程都是一樣:準備環境、寫入數據、讀取數據、判斷結果、清理環境。於是我們把這個過程抽象出來,先不要管他具體需要怎麼的讀寫行為,先把過程完成了。

2、抽象接口
有了過程的抽象,我們發現很有必要創建兩個接口Reader和Writer,有了這兩個接口,我們就可以完成我們的case腳本。

public interface Reader {
  public void read();
}

public interface Writer {
  public void write();
}

public class TestWriteAndRead extends TestCase {
  protected Writer writer;
  protected Reader reader;
  public void setUp() {
    // 準備環境
  }

  public void test() {
    // 寫入數據
    writer.write();
    // 讀取數據
    reader.read();
    // 判斷結果
  }

  public void tearDown() {
    // 清理環境
  }
}

3、實現接口
要想測試腳本能夠運行,還必須有具體的讀寫行為。於是我們還需要實現Reader和Writer接口,於是我們完成了RandomRead和RandomWrite兩個具體的讀寫類。

public class RandomReader implements Reader {
  public void read() { 
  // 隨機讀取數據 



public class RandomWriter implements Writer { 
  public void write() { 
  // 隨機寫入數據 

}

4、使用PicoContainer組裝用例
有了讀寫測試過程,有了隨機讀寫的實現,我們如何將這兩者組合起來變成一個能夠跑起來的用例呢?ok,我們的主角PicoContainer上場了。PicoContainer在這裏的作用就像一個池子一樣,我們把測試過程和測試過程中所需要使用的組件都放到這個池子裏麵,他們之間通過接口的實現關係自己來實現組裝。於是我們可以在不同的池子中扔進去不同的組件,這些組件都可以跑在相同的測試過程中。下麵我們利用PicoContainer的inject功能來實現用例。

在TestWriteAndRead類中添加PicoContainer
public class TestWriteAndRead extends TestCase {

  protected Writer writer; 
  protected Reader reader; 
  protected PicoContainer pico; 

  public void setUp() { 
    // 準備環境 
  

  public void test() { 
    // 寫入數據 
    // 從容器中取出組件 
    writer = pico.getComponent(Writer.class);         
    writer.write(); 
     
    // 讀取數據 
    reader = pico.getComponent(Reader.class); 
    reader.read(); 
     
    // 判斷結果 
  

  public void tearDown() { 
    // 清理環境 
  
}

5、建立隨機讀寫的測試腳本

public class TestRandomWriteAndRead extends TestWriteAndRead {
  public TestRandomWriteAndRead() { 
    // 建立PicoContainer容器並放入組件 
    pico = new DefaultPicoContainer(); 
    pico.addComponent(RandomReader.class); 
    pico.addComponent(RandomWriter.class); 
  
}
到這裏用例就完成了,有了PicoContainer編寫測試用例就像搭積木一樣,不管有多少的讀寫行為我們隻需要實現它並在用例中對他們進行組裝就可以了。被測程序的變更也僅僅隻影響到具體的實現類,維護腳本變得非常方便。
PicoContainer還有什麼功能

PicoContainer提供了我們最常用依賴注入功能,比如構造函數注入、annotation注入等等,還提供了容器內類的生命周期管理,基本涵蓋和滿足了測試用例編寫的需要。下一篇文章筆者會仔細的介紹PicoContainer常用的功能,敬請期待。


來源:https://www.taobaotest.com/blogs/2019

最後更新:2017-04-02 16:48:16

  上一篇:go Spinner Animation
  下一篇:go FrameLayout.xml