2016-10-28 34 views
7

我有一堆JUnit測試擴展了我的基本測試類BaseTest,這又擴展了Assert。我的一些測試有一個@Category(SlowTests.class)註釋。如何在Junit中使用類別時使用自定義運動員?

我的BaseTest類用下列註釋@RunWith(MyJUnitRunner.class)註釋。

我已經設置了一個Gradle任務,預計只能運行SlowTests。這是我的Gradle任務:

task integrationTests(type: Test) { 
    minHeapSize = "768m" 
    maxHeapSize = "1024m" 
    testLogging { 
     events "passed", "skipped", "failed" 
     outputs.upToDateWhen {false} 
    } 
    reports.junitXml.destination = "$buildDir/test-result" 
    useJUnit { 
     includeCategories 'testutils.SlowTests' 
    } 
} 

當我運行任務時,我的測試不運行。我已經指出這個問題與BaseTest上的定製跑步者MyJUnitRunner有關。如何設置我的Gradle或測試結構,以便在使用Suite時可以使用自定義亞軍。

+0

我認爲如果您發佈了您的跑步者,樣本測試或BaseTest會很有幫助。它對類別跑步者運行良好嗎? – MrKiller21

+0

@ MrKiller21我編輯了我的答案。請看下面。 –

回答

3

解決這個問題的辦法變得比我想像的要小和棘手。 Gradle正在使用我的自定義測試運行器並正確調用filter方法。但是,我的runner通過自己的類加載器爲Javaassist增強功能重新加載所有測試類。

這導致了SlowTest註釋通過Gradle類加載器加載的問題,但是當傳遞給我的自定義運行器時,運行器會檢查該類是否使用該註釋註釋。由於通過兩個不同的類加載器加載的SlowTest註釋的等式不同,因此該檢查從未正確解析。

-

既然我已經做了研究,我就離開這個位置。經過Gradle和(神祕的)JUnit資源挖掘了幾天之後,我得到了這些。

Gradle根本不處理除測試分類之外的任何高級JUnit功能。當您使用包含類別或排除類別條件創建Gradle任務時,它會構建一個CategoryFilter。如果您不知道,JUnit會給測試運行者一個決定是否應該過濾掉測試或測試方法的東西Filter。測試運行者必須實現Filterable接口。

JUnit自帶多個跑步者,其中Categories只是其中之一。它擴展了一個稱爲Suite的測試運動員家族。這些基於套件的跑步者旨在運行「套件」測試。一套測試可以通過註釋自省來構建,通過明確定義套件中的測試或者任何其他構建測試套件的方法。

Categories轉輪的情況下,JUnit有它自己的CategoryFilter,但Gradle不使用它,它使用它自己的CategoryFilter。兩者都提供或多或少相同的功能,並且是JUnit過濾器,因此可以由實現Filterable的任何套件使用。

負責運行JUnit測試的Gradle中的實際類名爲JUnitTestClassExecuter。一旦它解析了命令行選項,它就會請求JUnit檢查運行器是否應該用於測試。對於每個測試,都會調用此方法,如here

其餘的只是JUnit。 Gradle剛剛創建了一個自定義RunNotifier來生成代表測試結果的標準XML文件。

我希望有人認爲這有用,並保存自己無數小時的調試。

TLDR:您可以在Gradle中使用任何跑步者。 Gradle沒有關於跑步者的具體細節。這是JUnit決定參賽者。如果您想知道您的測試將使用哪個跑步者,您可以致電 Request.aClass(testClass).getRunner()進行調試。將此文件解壓到您的代碼庫並將其打印到控制檯。 (我並不是非常成功地將一個調試器附加到Gradle上。)

相關問題