2011-06-03 118 views
22

我在類似於this answer中描述的設置中使用JUnit類別和ClassPathSuite。總結一下:如何使用Ant在類別/套件中運行所有JUnit測試?

public interface FastTests { 
} 

@RunWith(Categories.class) 
@Categories.IncludeCategory(FastTests.class) 
@Suite.SuiteClasses(AllTests.class) 
public class FastTestSuite { 
} 

@RunWith(ClasspathSuite.class) 
public class AllTests { 
} 

...其中AllTests中利用了ClasspathSuite庫。

測試類是這樣的FastTests類別的一部分應該是這樣的:

@Category(FastTests.class) 
public class StringUtilsTest { 
    // ... 
} 

當我跑在我的IDE「FastTestSuite」,與FastTests註釋所有測試執行,漂亮&平穩:

enter image description here

現在,我想要做同樣的事情用Ant。 (令我吃驚的是,我無法輕易地在SO上找到這個指示。)換句話說,我需要一個Ant目標,它可以用FastTests註釋運行所有測試。

我使用<test><batchtest>嘗試了一些簡單的方法...

<junit showoutput="true" printsummary="yes"> 
    <test name="fi.foobar.FastTestSuite"/> 
    <formatter type="xml"/> 
    <classpath refid="test.classpath"/> 
</junit> 

...但沒有運氣,到目前爲止。

編輯:除了IDE,它正常工作與JUnitCore在命令行上:

$ java -classpath "classes:WebContent/WEB-INF/lib/*" org.junit.runner.JUnitCore fi.foobar.FastTestSuite 
............. 
Time: 0.189 

OK (13 tests) 
+0

是name =「...」類似org/test/TestSuite的路徑還是在包註釋org.test.TestSuite中?什麼是錯誤? – oers 2011-06-03 11:00:13

+0

@oers:後者;完全合格的類名。沒有真正的錯誤消息,它只是...失敗。 'unittest-fast: [junit]正在運行fi.foobar.FastTestSuite [junit]測試運行:1,失敗:0,錯誤:1,所用時間:0.053秒 [junit] Test fi.foobar.FastTestSuite FAILED' – Jonik 2011-06-03 11:24:00

+0

將格式化程序更改爲純文本,並將打印摘要更改爲withOutAndErr。這應該顯示錯誤的原因。我認爲那裏有個例外。您的設置絕對是執行套件的正確方法。 – oers 2011-06-03 11:32:40

回答

14

好吧,我得到了它與<batchtest>的工作很簡單:

<junit showoutput="true" printsummary="yes" fork="yes"> 
    <formatter type="xml"/> 
    <classpath refid="test.classpath"/> 
    <batchtest todir="${test.reports}"> 
     <fileset dir="${classes}"> 
      <include name="**/FastTestSuite.class"/> 
     </fileset> 
    </batchtest> 
</junit> 

我早些時候嘗試過<batchtest>,但卻犯了使用的愚蠢錯誤而不是在<include>"**/FastTestSuite.class"元件...很抱歉,:-)

NB:有必要設置fork="yes"(即,運行測試在一個單獨的VM);否則這也會在java.lang.reflect.Constructor.newInstance(Constructor.java:513)處產生「initializationError」,如<test>(請參閱問題的評論)。但是,即使使用fork="yes",我也無法使<test>正常工作。

唯一的缺憾的是,這將產生只有一個JUnit的XML報告文件(TEST-fi.foobar.FastTestSuite.xml),這使得它看起來像所有的(幾百個)的測試是在一個類(FastTestSuite)。如果有人知道如何調整它以顯示其原始類&包中的測試,請告訴我。

+3

使用隨機測試捆綁內的junit4 Ant任務來自carrotsearch的項目:[http://labs.carrotsearch.com/randomizedtesting.html]我可以使用類別和ClassPathSuite運行測試 - 但不需要在之內。他們的JSON類型的報告生成的輸出報告的測試按原始軟件包進行了細分 - 並且看起來也很不錯。 – 2012-04-17 01:15:31

+2

有沒有辦法通過在build.xml中指定類別名稱(類)本身?就像在maven裏你可以說'mvn test -Dgroups = test.classpath.FastTests' – Illidanek 2014-05-20 14:01:28

+0

你的缺點的解決方法是在junitreport之前應用xslt。您只需將最初的xml拆分爲較小的那個 – 2016-03-22 16:21:14

1

我找到了一個解決方法,使用Ant的junit任務運行特定Category的測試:

<target name="test" description="Run Selenium tests by category"> 
    <fail unless="category.name" message="Please specify 'category.name' property"/> 

    <junit showoutput="true" printsummary="true" fork="true"> 
     <formatter type="xml"/> 
     <classpath refid="test.classpath"/> 

     <batchtest todir="${test.reports}" haltonfailure="false"> 
      <fileset dir="${classes}"> 
       <!-- regex '^\s*@Category' part added to ensure @Category annotation is not commented out --> 
       <containsregexp expression="^\s*@Category.*${category.name}"/> 
      </fileset> 
     </batchtest> 
    </junit> 
</target> 

通過提供category.name財產執行測試到Ant這樣的:

ant -Dcategory.name=FastTests test 

使用batchtest也會爲每個測試生成單獨的JUnit XML報告文件(e 。G。 TEST-fi.foobar.FastTestClassN.xml)。

相關問題