2016-12-29 269 views
2

我試圖通過LauncherDiscoveryRequest作爲described in the user guide來發現JUnit 5測試。通過LauncherDiscoveryRequest發現提供的類路徑上的測試

LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request() 
    .filters(includeClassNamePatterns(".*")) 
    .build(); 

TestPlan plan = LauncherFactory.create().discover(request); 

for (TestIdentifier root : plan.getRoots()) { 
    System.out.println("Root: " + root.toString()); 

    for (TestIdentifier test : plan.getChildren(root)) { 
     System.out.println("Found test: " + test.toString()); 
    } 
} 

是否LauncherDiscoveryRequestBuilder只自動發現在運行該代碼的JVM的類路徑測試:我使用起來像下面的代碼?我嘗試使用方法DiscoverySelectors.selectClasspathRootsDiscoverySelectors.selectClasspathResource作爲選擇器來提供根目錄來搜索測試類。但是,我無法發現任何測試。 selectClasspathRootsselectClasspathResource的參數是否必須指向包含按包組織的類文件的根目錄,或者是否提供每個測試類文件的完整路徑?

我嘗試以下其中/some/dir代表包含測試類文件的根目錄:

File classesDir = new File("/some/dir"); 
LauncherDiscoveryRequestBuilder.request() 
    .selectors(selectClasspathRoots(Collections.singleton(Paths.get(classesDir.toURI())))) 
    .build(); 

我看了一下LauncherDiscoveryRequestBuilderTests.java但它搞清楚爲什麼我的示例代碼不工作是不是非常有用。我如何最好地診斷問題?

我使用下面的依賴關係:

  • org.junit.platform:junit-platform-engine:1.0.0-M3
  • org.junit.platform:junit-platform-launcher:1.0.0-M3
+0

一些幫助某人有關... https://stackoverflow.com/questions/46329888/discovering-test-with -junit-5 - 不要 - 執行 - logginglistener的實現-的-T – Sergio

回答

2

是否LauncherDiscoveryRequestBuilder只自動發現在運行該代碼的JVM的類路徑測試?

簡答:是的,Launcher只會自動發現運行代碼的JVM的類路徑上的測試。

一般來說,TestEngine的實施負責解決您通過selectClasspathRoots()創建的ClasspathRootSelector等選擇器。木星和Vintage引擎將掃描所提供的目錄中.class文件,然後嘗試使用當前線程的上下文ClassLoader加載它們。如果後面的步驟失敗了,這個班級將被默默地忽略。

如果要發現尚未在類路徑上的測試,則需要創建一個新的ClassLoader並使其成爲當前線程的上下文ClassLoader。 JUnit的平臺ConsoleLauncher做到這一點,太:

  1. Create custom ClassLoader
  2. Invoke Launcher with replaced context ClassLoader
+0

感謝您的信息。這樣可行。這可能值得在JUnit 5用戶指南中提及這些細節。 –

+0

我現在已經證明這個先決條件的Javadoc'selectClasspathRoots'和'ClasspathRootSelector':https://github.com/junit-team/junit5/commit/2de35be3f5537b4e49a20080125441c9b8376b71 –

+0

大,THX!這種行爲不適用於'selectClasspathResource'嗎? –

1

不LauncherDiscoveryRequestBuilder只自動發現在 類路徑中的JVM上運行的代碼測試?

不,它可以掃描jvm中的每一個類。您將不得不提供至少一個選擇器,但該發現是通過類路徑上的組織文件夾/包結構完成的。

添加過濾器來控制要掃描的類。

這是來自文檔。

目前可以搜索類,方法,包中的所有 類,甚至可以搜索類路徑中的所有測試。

所有的發現選擇器都有各種方式來到達測試類。

可能只有更多的上下文,但這是我可以根據文檔和運行/調試下面的測試找出。

ClasspathScannerTests

輸出

Root: TestIdentifier [uniqueId = '[engine:junit-jupiter]', parentId = null, displayName = 'JUnit Jupiter', source = null, tags = [], test = false, container = true] 
Found test: TestIdentifier [uniqueId = '[engine:junit-jupiter]/[class:discover.suite.Junit5TestCase]', parentId = '[engine:junit-jupiter]', displayName = 'Junit5TestCase', source = ClassSource [className = 'discover.suite.Junit5TestCase', filePosition = null], tags = [], test = false, container = true] 

樣品測試類

package discover.suite; 

import org.junit.jupiter.api.Test; 

public class Junit5TestCase { 

    @Test 
    public void junitMethod() { 
    } 

} 

下面是使用不同的選擇幾個例子。

//By classpath root 
    File classesDir = new File("C:\\Users\\me\\Junit5\\target\\test-classes"); 

    LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request() 
      .selectors(selectClasspathRoots(Collections.singleton(Paths.get(classesDir.toURI())))) 
      .filters(includeClassNamePatterns(".*")) 
      .build(); 

    //By package 
    LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request() 
      .selectors(selectPackage("discover.suite")) 
      .filters(includeClassNamePatterns(".*")) 
      .build(); 

    //By Class 
    LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request() 
      .selectors(selectClass(Junit5TestCase.class)) 
      .filters(includeClassNamePatterns(".*")) 
      .build(); 

    //By Method 
    LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request() 
      .selectors(selectMethod(Junit5TestCase.class, "junitMethod")) 
      .filters(includeClassNamePatterns(".*")) 
      .build(); 
+0

執行幫助測試與LauncherDiscoveryRequest https://stackoverflow.com/questions/46329888/discovering-test-with-junit-5-dont-execute-logginglistener-實施-t – Sergio

相關問題