2013-06-27 78 views
2

我的集成測試順序運行,但我想並行化它們。問題是,它們都設置並拆卸了同一個數據庫行,所以如果它們並行運行,那麼當另一個測試清理完成時,它們的數據會在它們中間消失。在JUnit中,我如何獲得所有集成測試的列表?

我打算改變這種方式,以便每次測試都能設置好並且每次測試都將一個獨特的行撕下來,這樣它們就不會相互干擾。我已經開始了將每個測試的id變成同名的常量的過程,如ROW_ID。但是我們有很多測試,而且很容易錯過其中的一個,而且我也不希望人們在將來增加重複的值,所以我認爲編寫測試可能是一個好主意爲我的測試。

下面是我想象它的工作方式:迭代所有IntegrationTest類,使用反射來獲取其ROW_ID字段的值,將其放入數據結構中,然後檢查重複項。我的問題是我不知道如何迭代所有的IntegrationTest類。它們都具有「* IntegrationTest」的通用命名模式。有人可以幫助我完成這一步嗎?

如果還有更好的方法可以完成我想要做的事情,那麼請儘量將其作爲答案。

+4

而不是手動提供行ID,爲什麼不使用數據庫序列呢? –

+0

@MarlonBernardes這是一個好主意。也許我可以做到這一點。 –

+2

或者可能創建一個線程安全的方法,它會增加並返回一個id計數器。就像'Long row_id = SequenceNumberGenerator.nextVal()' –

回答

2

你有很多的關於唯一行標識的問題不同的選擇:

  1. 使用的,而不是你的ID的手動設置數據庫序列。
  2. 實現線程安全計數器並將其用作ROW_ID(請參見下面的示例);

public class SequenceNumberGenerator { 

    private static AtomicInteger counter = new AtomicInteger(); 

    public static int nextVal() { 
     return counter.incrementAndGet(); 
    }  
} 

我也不會建立在每一個測試類恆定ROW_ID(避免重複)。相反,我認爲你可以在一個超類(它將被所有的集成測試擴展)上定義它,在測試執行之前設置它的值,並簡單地爲它提供一個getter訪問器。像這樣的:

//superclass 
private int rowId; 

@Before 
public void generateRowId() { 
    rowId = SequenceNumberGenerator.nextVal(); 
} 

protected int getRowId() { 
    return rowId; 
} 
+0

並完成。還有更多的角色。 –

1

您可以使用JUnit類別。閱讀this網頁,也許this one以及。還有其他框架允許更好的過濾(通過包/包括子包/包括那些以x/etc開頭的包),但我不記得它的名字......但是,我認爲你需要的只是簡單的@Categories。

+0

您是指TestNG? –

+0

另外,這看起來像是朝着正確方向邁出的一步,但我不知道如何使用類別來獲取類別中測試的實例/類。 –

+0

好吧,我查了一下,這個框架叫做[ClasspathSuite](http://johanneslink.net/projects/cpsuite.jsp)。我沒有親自使用它,但我的同事說這是有史以來最好的事情。正如您在網頁中看到的,您可以按照您喜歡的任何可能的標準進行過濾,例如,即使通過* IntegrationTest – Csaba