2012-09-08 192 views
2

我正在嘗試爲Web應用程序編寫一些UI測試,但有一些併發症,我希望你能幫我解決。JUnit:可以(應該)這樣做嗎?

首先應用程序有兩種模式。其中一種模式是「訓練」,另一種是「生活」。在實時模式下,數據直接從我們的數據庫中獲取,並且我的測試所做的任何更改都會反映在數據庫中,然後在「實時」運行每個測試之前,我需要生成測試數據,因爲它每次都是不同的(我已經有了該邏輯到位)。在訓練模式下,所有數據都是靜態的,因此每次都使用相同的測試數據。

由於用戶界面在每種模式下都是相同的,我想針對每種模式運行一次測試,但由於某些特殊因素,我的一些測試只能在實時模式下運行。

我怎麼想最好做,這是有我的測試分成幾類,說: UserTests, PaymentTests, LiveOnlyTests, 等,並有兩個不同的類(延伸的公共接口)提供測試數據。

然後,我想建立2個不同的測試套件,每個模式一個。測試套件將接受包含我傳遞它們的數據並執行測試的對象。

有沒有人知道如果這件事或類似的效果可以在JUnit(或任何其他的Java測試框架)中做到。我能看到完成的唯一方法是通過編寫自己的測試跑步者,但我寧願避免這種情況。

在此先感謝。

+0

聽起來更像集成測試,而不是單元測試。你想寫GUI測試還是單元測試? – daniel

+0

這些是集成測試,但JUnit也可以用於這些測試。 – Maciek

回答

2

我會做的是看看ParameterizedAssume的組合。

參數化允許您爲測試定義一組測試數據。您可以返回培訓/實時數據集(也許基於System屬性)。假設允許你測試一些東西,如果假設是假的,它會中止測試(假設失敗,而不是失敗)。

您也可以使用Categories,但使用Parameterized運行它們會更困難,因爲必須組合兩個跑步者。

因此,假設參數&假設:

@RunWith(Parameterized.class) 
public class MyTest { 
    @Parameters 
    public static List<Object[]> data() { 
    // return different data, depending upon the value of System.getProperty("testType"); 
    return Arrays.asList(new Object[][] { 
     { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } 
    }); 
    } 

    private int fInput; 
    private int fExpected; 

    public MyTest(int input, int expected) { 
    fInput= input; 
    fExpected= expected; 
    } 

    @Test 
    public void testTraining() { 
    Assume("training".equals(System.getProperty("testType")); 

    // test which only runs for training, using the data from data() 
    } 

    @Test 
    public void testBoth() { 
    // test which only runs for both, using the data from data() 
    } 
} 

通過以上的一些組合,你也許可以得到你想要的。