2012-01-17 50 views
0

我會試着在這裏解釋我的場景,以便清楚我想要什麼。TestNG - Dataprovider Class級別的測試註冊

我有一組方法在執行一些測試的類中,它們都是相互關聯的,必須按順序運行,所以它們的@Test註釋中有DependsOnMethod。我也使用DataProvider,每個測試返回7個值(n行& 7列)。現在,當我將此數據提供者置於方法級別時,它將讀取所有行並使用每組可用數據執行方法1,然後轉到下一個方法。

我想這個順序改變,我希望它運行方法1(數據組1),方法2(數據集1)方法1(數據組2),......我知道這個問題很多人都。我再次發佈這個問題的原因是因爲我嘗試了所有建議的想法。

當使用廠註解,它使我的測試沒有在Eclipse中開始播放,給人一種NullPointerException。我使用@BeforeClass註釋,如果使用工廠註釋,該註釋從不運行。我在該類的構造函數上給出了該工廠註釋。

我試圖在的testng.xml文件中group-by-instance國旗,但仍失敗:它運行在相同的順序測試。

請有人可以解釋以正確的順序對我來說這件事?如果可能,舉個例子,因爲我確信這可以實現,但我想我錯過了某個地方。

任何幫助,這是非常感謝。

P.S.我對Java並不擅長,過去2-3周我一直在使用TestNG。

感謝, 約翰

回答

0

隨着anotation 「數據集」: 的JavaDoc:

org.unitils.dbunit.annotation.DataSet 
@Target(value={METHOD, TYPE}) 
@Retention(value=RUNTIME) 
@Inherited 

註解表明一個數據集應在試運行前加載。

如果一個類被註釋,測試數據集將每個類中的測試方法的執行之前加載。數據集文件名可以明確指定。如果沒有指定這樣的文件名,首先會嘗試一個名爲'classname'。'testmethod'.xml的數據集,如果沒有這樣的文件存在,'classname'.xml將被嘗試。如果該文件也不存在,則會拋出異常。以'/'開頭的文件名被絕對處理。不以'/'開頭的文件名與當前類相關。

的測試方法也可以用在這種情況下,您可以指定需要運行這個測試方法之前要加載的數據集的數據集進行註解。同樣,可以顯式指定文件名,如果未指定,則會使用缺省值:first'classname'。'methodname'.xml,如果該文件不存在'classname'.xml。

例子:

@DataSet 
    public class MyTestClass extends UnitilsJUnit3 { 

     public void testMethod1(){ 
     } 

    @DataSet("aCustomFileName.xml") 
     public void testMethod2(){ 
     } 
    } 

將加載名爲MyTestClass.xml或MyTestClass-testMethod1.xml爲testMethod1在同一目錄類數據集文件。對於testMethod2,加載與該類相同的目錄中名爲aCustomFileName.xml的數據集文件。

public class MyTestClass extends UnitilsJUnit3 { 

     public void testMethod1(){ 
     } 

    @DataSet 
     public void testMethod2(){ 
     } 
    } 

不會加載testMethod1的任何數據集(沒有類級數據集)。將爲testMethod2加載名爲MyTestClass.xml或MyTestClass.testMethod2.xml的數據集文件。 作者:

菲利普的Neven

添Ducheyne

+1

嗨Benoit,謝謝你的回覆。 我使用CSV文件來存儲測試數據,所以不要認爲這對我有很大的幫助。我無法輕鬆切換到XML。 只是出於好奇,將使用數據集註釋運行一個類中的所有方法與第一行的數據,然後拿起XML中的下一行數據數據,並再次運行它的所有方法? – 2012-01-17 12:07:46

0

最簡單的方法是調用手動將這些方法:

@Test(dataProvider = ...) 
public void f(int n1, int n2) { 
    method1(n1, n2); 
    method2(n1, n2); 
} 

然而,通過實例分組應該有工作,你可以通過電子郵件將小類到testng用戶列表,所以我可以重現它?

謝謝。

+0

嗨塞德里克,非常感謝您的回覆,很高興看到製造商親自幫助我們,您的產品簡直太棒了,希望我只知道更多關於Java的知識:)。 這個想法很好,但是這樣會禁用我對這些方法的測試註釋,但我仍然試一試。 如果這對我沒有幫助,我會向testng用戶組發送一個樣本類。 再次感謝,我會保持您的發佈。 – 2012-01-18 09:40:33

+0

剛剛嘗試了您的建議,但它似乎在額外運行一次測試,如果我有兩行數據,並且如果使用方法來讀取這些值,然後在此方法中調用剩餘的@test方法,那麼它會執行它們兩次,因爲其他方法也有對它們的測試註釋,它會再次調用最後一行數據。此外,這也不能幫助我進行報告,因爲我想知道哪個測試失敗了,以及哪一行數據。我會在某個時間將樣例項目郵寄給Testng用戶組。謝謝,約翰 – 2012-01-18 10:14:04

+1

如果你按照我的建議,確保你從method1和method2中刪除了@Test標記,否則TestNG也會運行它們(這將解釋你看到的雙重運行)。 – 2012-01-18 18:06:02