2012-01-30 30 views
5

我試圖將JUnit添加到大型項目中,並且嵌套測試套件時遇到困難。例如:如何在JUnit 4.x中創建嵌套的TestSuite?

@RunWith(Suite.class) 
@Suite.SuiteClasses({Test2.class, .....}) 
public class Test1{ 
} 

@RunWith(Suite.class) 
@Suite.SuiteClasses({Test3.class, .....}) 
public class Test2{ 
    //might have tests 
} 

@RunWith(Suite.class) 
public class Test3{ 
    //tests here 
} 

每個類運行在它自己的包測試,以及所有子包測試套件

運行在java.lang.Exception的Test1的結果:沒有可運行的方法。我如何得到這個工作?有沒有更好的方法來組織測試,沒有一個沒有巨大的列表的地方?

+0

刪除所有Test3上的@RunWith(Suite.class)並添加一個錯過的註釋,其中一個Test2s修復了所有問題。然而,這似乎並不是做這件事的最好方法。有沒有更好的方法來運行特定目錄下的所有測試? – Spyder 2012-01-30 20:52:37

回答

5

第一個問題是Test3使用@RunWith(Suite.class),但不包含@Suite.SuiteClasses({Test3.class, .....})。這產生了一個IntializationError: class 'Test3' must have a SuiteClasses annotation。既然你不打算在Test3下面有任何類,這個註解應該被刪​​除。

Exception: No runnable methods的第二個問題幾乎總是由於忘記將@Test添加到測試中。你沒有把樣品放在你的樣品中,所以我不知道這是否是真實的情況,但這是最可能的原因。

以下是你的代碼的工作版本,它允許測試從任何類運行:

Test1.java

import org.junit.runner.*; 
import org.junit.runners.*; 
import org.junit.runners.Suite.SuiteClasses; 

@RunWith(Suite.class) 
@SuiteClasses({Test2.class}) 
public class Test1 { 

} 

Test2.java

import org.junit.runner.*; 
import org.junit.runners.*; 
import org.junit.runners.Suite.SuiteClasses; 

@RunWith(Suite.class) 
@SuiteClasses({Test3.class}) 
public class Test2 { 

} 

Test3.java

import static org.junit.Assert.*; 

import org.junit.*; 

public class Test3 { 

    @Test 
    public void testTrue(){ 
     assertTrue(true); 
    } 
} 

至於是否有更好的方法來組織東西,我想這隻取決於你如何決定創建類。由於您可以將套件添加到套件中,因此如您所示,您可以創建依賴於所有內容的更小的套件塊,如樹。例如,我通常所做的是:

AllTestSuite 
    TextParsingSuite 
    GuiSuite 
     SwingSuite 
     JavaFXSuite 
    FileIOSuite 

將測試添加到最相關的套件中。最後,我認爲我沒有任何超過10個測試課程或套件的套件。如果我這樣做,是時候創建一個新的子套件。換句話說,沒有「巨大的名單」,只是很多較小的名單被組合成另一個名單,以便有效地製作一個大名單。

我想你可以使用一些工具來動態找到所有包含測試的Java類,但JUnit本身不支持這種行爲(它只運行你告訴它的測試,我個人認爲這是一件好事)。

0

就我個人而言,我使用maven/ant/Eclipse來運行測試集。

如果您使用的是maven,請看surefire。要運行一個模塊的所有JUnit測試,添加以下到POM:

<build> 
    <pluginManagement> 
     <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <version>2.11</version> 
     </plugin> 
     </plugins> 
    </pluginManagement> 
</build> 

對於螞蟻,看JUnit task

<junit printsummary="yes" haltonfailure="yes"> 
    <classpath> 
    <pathelement location="${build.tests}"/> 
    <pathelement path="${java.class.path}"/> 
    </classpath> 

    <formatter type="plain"/> 

    <test name="my.test.TestCase" haltonfailure="no" outfile="result"> 
    <formatter type="xml"/> 
    </test> 

    <batchtest fork="yes" todir="${reports.tests}"> 
    <fileset dir="${src.tests}"> 
     <include name="**/*Test*.java"/> 
     <exclude name="**/AllTests.java"/> 
    </fileset> 
    </batchtest> 
</junit> 

對於Eclipse,右鍵單擊該包,然後選擇「運行作爲JUnit'。這將運行它可以在這些軟件包中找到的所有測試。 Intellij中將會有類似的功能。