測試資源檔案準備

通常在整合測試時,才會準備外部資源檔案,因為要確認所有的設定與環境搭配起來是沒有問題的。 但一般實作單元測試時,若個別元件需要測試讀寫外部資源,可能就會遇到問題:

外部資源檔案要放在哪裡?

如果放在檔案系統的固定位置,就會遇到測試移植性的問題,顯然不太對。放在/src/test/resources/**/ 下,以classpath:/.. 指定Resource的方式存取是最常見的選擇。

如果我們測試行為不僅讀取檔案,還要寫入時怎麼辦?

建議啟動JVM時設定-Djava.io.tmpdir=指定到獨立目錄,再設法把輸出導到 TempDirectory 目錄下。

  • 設獨立目錄,可以觀察是否有測試後的殘留檔案。
  • 此 TempDirectory 最好位於RAMDISK之下,以應付測試時可能的頻繁存取。

不同測試要搭配不同檔案時,如何處理?

如果撰寫設定值可以決定最好,但是遇到第三方元件要把檔案放在固定位置,或是關連檔案數量較多時,較為麻煩。 UDE環境配合專案檔案路徑處理以上問題。在測試類別中宣告一個TestRule:UdeTestPlaceholder,它會把BASEDIR指向到TempDirectory的暫用目錄,並在每一案例的執行前後,試著清空整個目錄。

@Rule
public UdeTestPlaceholder placeholder = new UdeTestPlaceholder();

接著透過 @UdeTestResource ,指定哪些檔案要在開始測試前,放到專案檔案路徑下。 宣告於類別前的是共用檔案,宣告於測試方法前的,是各自執行時才準備的檔案。

  • resource 參數

    指定放在/src/test/resources/**/下的資源檔案,預設與測試類別放在相同package路徑。若以要絕對路徑指定資源檔,需以「/」或「classpath:」開頭。

  • dest 參數

    指定檔案將放置的位置,可以使用專案檔案路徑的相關變數。dest 也允許指定檔案系統下的其它外部路徑,但不建議,因為可能會誤刪原本應存在系統中的檔案,也可能會失去單元測試的可移稙性。

@UdeTestResource(resource= "RsCommon.properties", dest = "${global.resource.path}/codetable/RsCommon.properties")
@UdeTestResource(resource = "AECD0005.properties", dest = "${resource.path}/codetableA/AECD0005.properties")
@UdeTestResource(resource = "AECD0005.properties", dest = "${resource.path}/codetableA/AECD0005_zh_TW.properties")
public class CodeTableProviderImplTest_Properties {
…
}

results matching ""

    No results matching ""