2011-05-30 74 views
284

我有一個Maven的程序,它編譯罰款。當我運行mvn test它不會運行任何測試(在TESTs標題下說There are no tests to run.)。的Maven沒有找到JUnit測試運行

我已經重新創建了這個問題,一個超級簡單的設置,其中在與-X運行我將包括以及下面的輸出。

單元測試從蝕(既使用其默認的junit包,當我代替包括由行家下載的junit.jar)運行正常。 mvn test-compile也正確地創建了測試類下的類。我在OSX 10.6.7上運行Maven 3.0.2和java 1.6.0_24。

這裏是目錄結構:

/my_program/pom.xml 
/my_program/src/main/java/ClassUnderTest.java 
/my_program/src/test/java/ClassUnderTestTests.java 

的pom.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>my_group</groupId> 
    <artifactId>my_program</artifactId> 
    <packaging>jar</packaging> 
    <version>1.0-SNAPSHOT</version> 
    <name>My Program</name> 
    <dependencies> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.8.1</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <configuration> 
        <source>1.5</source> 
        <target>1.5</target> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

ClassUnderTest.java:

public class ClassUnderTest { 

    public int functionUnderTest(int n) { 
     return n; 
    } 

} 

ClassUnderTest Tests.java:

import org.junit.Assert; 
import org.junit.Before; 
import org.junit.Test; 

public class ClassUnderTestTests { 

    private ClassUnderTest o; 

    @Before 
    public void setUp() { 
     o = new ClassUnderTest(); 
    } 

    @Test 
    public void testFunctionUnderTest_testCase1() { 
     Assert.assertEquals(1, o.functionUnderTest(1)); 
    } 

    @Test 
    public void testFunctionUnderTest_testCase2() { 
     Assert.assertEquals(2, o.functionUnderTest(2)); 
    } 
} 

MVN -X測試結束:

[DEBUG] Configuring mojo org.apache.maven.plugins:maven-surefire-plugin:2.7.1:test from plugin realm ClassRealm[plugin>org.apache.maven.plugins:maven-surefire-plugin:2.7.1, parent: [email protected]] 
[DEBUG] Configuring mojo 'org.apache.maven.plugins:maven-surefire-plugin:2.7.1:test' with basic configurator --> 
[DEBUG] (s) basedir = /Users/aaron/Programs/my_program 
[DEBUG] (s) childDelegation = false 
[DEBUG] (s) classesDirectory = /Users/aaron/Programs/my_program/target/classes 
[DEBUG] (s) disableXmlReport = false 
[DEBUG] (s) enableAssertions = true 
[DEBUG] (s) forkMode = once 
[DEBUG] (s) junitArtifactName = junit:junit 
[DEBUG] (s) localRepository =  id: local 
     url: file:///Users/aaron/.m2/repository/ 
    layout: none 

[DEBUG] (f) parallelMavenExecution = false 
[DEBUG] (s) pluginArtifactMap = {org.apache.maven.plugins:maven-surefire-plugin=org.apache.maven.plugins:maven-surefire-plugin:maven-plugin:2.7.1:, org.apache.maven.surefire:surefire-booter=org.apache.maven.surefire:surefire-booter:jar:2.7.1:compile, org.apache.maven.surefire:surefire-api=org.apache.maven.surefire:surefire-api:jar:2.7.1:compile, org.apache.maven.surefire:maven-surefire-common=org.apache.maven.surefire:maven-surefire-common:jar:2.7.1:compile, org.apache.maven.shared:maven-common-artifact-filters=org.apache.maven.shared:maven-common-artifact-filters:jar:1.3:compile, org.codehaus.plexus:plexus-utils=org.codehaus.plexus:plexus-utils:jar:2.0.5:compile, junit:junit=junit:junit:jar:3.8.1:compile, org.apache.maven.reporting:maven-reporting-api=org.apache.maven.reporting:maven-reporting-api:jar:2.0.9:compile} 
[DEBUG] (s) printSummary = true 
[DEBUG] (s) project = MavenProject: my_group:my_program:1.0-SNAPSHOT @ /Users/aaron/Programs/my_program/pom.xml 
[DEBUG] (s) projectArtifactMap = {junit:junit=junit:junit:jar:4.8.1:test} 
[DEBUG] (s) redirectTestOutputToFile = false 
[DEBUG] (s) remoteRepositories = [  id: central 
     url: http://repo1.maven.org/maven2 
    layout: default 
snapshots: [enabled => false, update => daily] 
releases: [enabled => true, update => never] 
] 
[DEBUG] (s) reportFormat = brief 
[DEBUG] (s) reportsDirectory = /Users/aaron/Programs/my_program/target/surefire-reports 
[DEBUG] (s) session = [email protected] 
[DEBUG] (s) skip = false 
[DEBUG] (s) skipTests = false 
[DEBUG] (s) testClassesDirectory = /Users/aaron/Programs/my_program/target/test-classes 
[DEBUG] (s) testFailureIgnore = false 
[DEBUG] (s) testNGArtifactName = org.testng:testng 
[DEBUG] (s) testSourceDirectory = /Users/aaron/Programs/my_program/src/test/java 
[DEBUG] (s) trimStackTrace = true 
[DEBUG] (s) useFile = true 
[DEBUG] (s) useManifestOnlyJar = true 
[DEBUG] (s) workingDirectory = /Users/aaron/Programs/my_program 
[DEBUG] -- end configuration -- 
[INFO] Surefire report directory: /Users/aaron/Programs/my_program/target/surefire-reports 
[DEBUG] Setting system property [user.dir]=[/Users/aaron/Programs/my_program] 
[DEBUG] Setting system property [localRepository]=[/Users/aaron/.m2/repository] 
[DEBUG] Setting system property [basedir]=[/Users/aaron/Programs/my_program] 
[DEBUG] Using JVM: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/java 
[DEBUG] Using manager EnhancedLocalRepositoryManager with priority 10 for /Users/aaron/.m2/repository 
[DEBUG] dummy:dummy:jar:1.0 (selected for null) 
[DEBUG] org.apache.maven.surefire:surefire-booter:jar:2.7.1:compile (selected for compile) 
[DEBUG]  org.apache.maven.surefire:surefire-api:jar:2.7.1:compile (selected for compile) 
[DEBUG] Adding to surefire booter test classpath: /Users/aaron/.m2/repository/org/apache/maven/surefire/surefire-booter/2.7.1/surefire-booter-2.7.1.jar Scope: compile 
[DEBUG] Adding to surefire booter test classpath: /Users/aaron/.m2/repository/org/apache/maven/surefire/surefire-api/2.7.1/surefire-api-2.7.1.jar Scope: compile 
[DEBUG] Using manager EnhancedLocalRepositoryManager with priority 10 for /Users/aaron/.m2/repository 
[DEBUG] dummy:dummy:jar:1.0 (selected for null) 
[DEBUG] org.apache.maven.surefire:surefire-junit4:jar:2.7.1:test (selected for test) 
[DEBUG]  org.apache.maven.surefire:surefire-api:jar:2.7.1:test (selected for test) 
[DEBUG] Adding to surefire test classpath: /Users/aaron/.m2/repository/org/apache/maven/surefire/surefire-junit4/2.7.1/surefire-junit4-2.7.1.jar Scope: test 
[DEBUG] Adding to surefire test classpath: /Users/aaron/.m2/repository/org/apache/maven/surefire/surefire-api/2.7.1/surefire-api-2.7.1.jar Scope: test 
[DEBUG] Test Classpath : 
[DEBUG] /Users/aaron/Programs/my_program/target/test-classes 
[DEBUG] /Users/aaron/Programs/my_program/target/classes 
[DEBUG] /Users/aaron/.m2/repository/junit/junit/4.8.1/junit-4.8.1.jar 
[DEBUG] Using manager EnhancedLocalRepositoryManager with priority 10 for /Users/aaron/.m2/repository 
[DEBUG] dummy:dummy:jar:1.0 (selected for null) 
[DEBUG] org.apache.maven.surefire:surefire-booter:jar:2.7.1:compile (selected for compile) 
[DEBUG]  org.apache.maven.surefire:surefire-api:jar:2.7.1:compile (selected for compile) 
[DEBUG] Adding to surefire booter test classpath: /Users/aaron/.m2/repository/org/apache/maven/surefire/surefire-booter/2.7.1/surefire-booter-2.7.1.jar Scope: compile 
[DEBUG] Adding to surefire booter test classpath: /Users/aaron/.m2/repository/org/apache/maven/surefire/surefire-api/2.7.1/surefire-api-2.7.1.jar Scope: compile 
Forking command line: /bin/sh -c cd /Users/aaron/Programs/my_program && /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/java -jar /Users/aaron/Programs/my_program/target/surefire/surefirebooter6118081963679415631.jar /Users/aaron/Programs/my_program/target/surefire/surefire4887918564882595612tmp /Users/aaron/Programs/my_program/target/surefire/surefire9012255138269731406tmp 

------------------------------------------------------- 
T E S T S 
------------------------------------------------------- 
There are no tests to run. 

Results : 

Tests run: 0, Failures: 0, Errors: 0, Skipped: 0 

[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESS 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 2.089s 
[INFO] Finished at: Mon May 30 12:03:09 EDT 2011 
[INFO] Final Memory: 7M/62M 
[INFO] ------------------------------------------------------------------------ 

回答

497

默認的Maven尋找時使用以下命名約定的測試運行:

  • Test*
  • *Test
  • *TestCase

你的測試類沒有遵守這些約定。您應該重命名它或configure Maven Surefire Plugin以使用其他模式進行測試。

+1

這確實是發生了什麼 - 我沒有注意到我搞砸了命名約定。非常感謝你! – Zugwalt 2011-05-30 16:33:25

+41

我只是浪費了一個小時,試圖找出我的POM文件出了什麼問題。我不敢相信它和命名慣例一樣簡單。 – 2011-09-17 01:40:00

+8

我用了差不多30分鐘的時間搞清楚了這一點。雖然我的IDE很高興。 (即使我的IDE聲稱100%maven嚴格)。謝謝! :) – 2012-01-04 14:36:56

57

我還發現,單元測試代碼應該測試文件夾下的說,它不能被識別爲測試類,如果你把它的主文件夾下。 例如。

錯誤

/my_program/src/main/java/NotTest.java 

/my_program/src/test/java/MyTest.java 
+1

Thaaank你!這和設置範圍來測試(' test ')在'pom.xml'文件中爲我做了。 – dinesharjani 2017-05-22 18:28:49

4

如果你有一個共享的Java/Groovy的應用程序,你必須是Groovy進行單元測試,然後Maven會找不到任何測試。這可以通過在src/test/java下添加一個單元測試來解決。

22

此外,請檢查您的測試類目錄(例如src/test/java)是否對應於您的pom.xml屬性<testSourceDirectory><build>屬性下所列的目錄。花了我一段時間才發現。

9

檢查(針對JUnit - 4.12和Eclipse保命插件)

  1. 添加所需的JUnit版本中的pom.xml依賴關係。做Maven - >更新項目以查看項目中導出的必需jar文件。
  2. 測試類位於該文件夾的src/test/java和子目錄下(或者可以在配置testSourceDirectory中的POM中指定基礎文件夾)。班級名稱應該有'Test'字樣。
  3. 在測試類測試方法應該有註釋@Test
+1

這更多的是java配置問題,但除了正確命名測試類並將測試文件放在src下的測試目錄之外,測試類的包名稱必須與您正在測試的類的包名稱相匹配。 – Paul 2015-05-29 13:39:39

+2

@Paul False - Maven將執行[在src/test/java'下匹配約定的所有類](http://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html) 。包約定用於結構並允許測試訪問包私有方法。 – 2015-08-24 18:02:09

+0

我明白了,多謝@ michael – Paul 2015-08-25 11:53:46

35

,可能會導致Maven來找不到測試,如果如果模塊的包裝上未正確申報另一件事。

在最近的一個案例中,有人有<packaging>pom</packaging>,我的測試從未跑過。我將其更改爲<packaging>jar</packaging>,現在它工作正常。

+1

非常好的建議!演示將單個模塊Maven構件拆分爲多個時,「複製粘貼」的危險性。 – morsor 2017-11-15 07:51:13

+0

它拯救了我的生命。 – user5698801 2017-12-26 11:01:39

7

如果您在「抽象」前加一個測試,它會被默認忽略。

+2

請在相關文件指向這個 – 2016-02-29 09:34:43

+1

https://maven.apache.org/guides/getting-started/ ''' 和默認排除的因素: ** /摘要* Test.java ** /摘要* TestCase.java ''' – 2017-11-29 15:52:37

+0

它似乎也忽略'*/TestAbstractSomeClassName.java'。 – 2018-03-01 06:06:33

6

Maven將不會運行測試,如果該項目有<packaging>pom</packaging>

您需要設置爲測試封裝到罐子(或某些其他Java的人工製品類型)來運行:<packaging>jar</packaging>

0

junitArtifactName也可能是如果在使用JUnit是不是標準(junit:junit),但例如...的情況下

<dependency> 
    <groupId>org.eclipse.orbit</groupId> 
    <artifactId>org.junit</artifactId> 
    <version>4.11.0</version> 
    <type>bundle</type> 
    <scope>test</scope> 
</dependency> 
2

我也有類似的問題,探討後發現,TestNG的依賴關係是CA使用這個問題。從pom中移除testng依賴項(因爲我不再需要它),它開始爲我工作得很好。

<dependency> 
     <groupId>org.testng</groupId> 
     <artifactId>testng</artifactId> 
     <version>6.8</version> 
     <scope>test</scope> 
    </dependency> 
+0

刪除testng解決了我的問題,但爲什麼? – hogi 2017-11-04 11:21:27

1

的另一個原因是沒有運行測試案例發生在我身上 - 我有一個名爲「test」爲完全不同的用途屬性,但它與神火插件干擾。因此,請檢查您的POM:

<properties> 
    <test>.... </test> 
    ... 
</properties> 

並將其刪除。

1
/my_program/src/test/java/ClassUnderTestTests.java 

應該

/my_program/src/test/java/ClassUnderTestTest.java 

行家認定這些目標測試或測試開始自動運行。

但是,您可以使用

mvn surefire:test -Dtest=ClassUnderTestTests.java 

運行測試。