私はmavenプログラムを持っています、それはうまくコンパイルします。 mvn test
を実行してもテストは実行されません(TESTsヘッダーの下にThere are no tests to run.
と表示されます)。
-X
を付けて実行したときの出力に加えて、この問題を非常に単純な設定で再現しました。
単体テストはEclipseから正常に実行されます(デフォルトのjunitパッケージと、代わりにmavenによってダウンロードされたjunit.jarが含まれている場合)。また、mvn test-compile
はtest-classesの下にクラスを正しく作成します。私はMaven 3.0.2とJava 1.6.0_24を使ってOSX 10.6.7でこれを実行しています。
これがディレクトリ構造です。
/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;
}
}
ClassUnderTestTests.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: Sun.misc.Launcher$AppClassLoader@5224ee]
[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 = org.Apache.maven.execution.MavenSession@dfbb43
[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] ------------------------------------------------------------------------
デフォルトでは、Mavenは実行するテストを探すときに次の命名規則を使用します。
Test*
*Test
*TestCase
あなたのテストクラスはこれらの規約に従いません。テストクラスに別のパターンを使用するには、名前を変更するか Maven Surefire Pluginの設定 を実行してください。
私はまた、単体テストのコードはテストフォルダの下に置く必要があることを見出した、あなたがメインフォルダの下にそれを置く場合、それはテストクラスとして認識することはできません。例えば。
間違っています
/my_program/src/main/Java/NotTest.Java
正しい
/my_program/src/test/Java/MyTest.Java
モジュールのパッケージが正しく宣言されていない場合、Mavenがテストを見つけられない原因となる可能性があるもう1つのこと。
最近のケースでは、誰かが<packaging>pom</packaging>
を持っていて、私のテストは実行されませんでした。私はそれを<packaging>jar</packaging>
に変更しました、そして今それはうまく働きます。
アップデート:
@scottyseusがコメントで述べたように、Maven Surefire 2.22.0以降では、以下で十分です。
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
JUnit 5を使用しているとき、私は同じ問題に遭遇しました。 Maven SurefireはJUnit 5テストを実行するためのプラグインを必要とします。これをpom.xml
に追加してください。
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>1.2.0-M1</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.2.0-M1</version>
</dependency>
</dependencies>
</plugin>
出典: https://junit.org/junit5/docs/current/user-guide/#running-tests-build-maven
また、テストクラスのディレクトリ(src/test/Javaなど)が、pom.xmlの<testSourceDirectory>
プロパティの下のプロパティ<build>
にリストされているディレクトリに対応しているかどうかも確認してください。それを見つけるためにしばらく時間がかかりました。
それをチェックしてください(jUnit - 4.12とEclipseの確実なプラグインのために)
プロジェクトに<packaging>pom</packaging>
がある場合、Mavenはテストを実行しません
テストを実行するには、パッケージをjar(またはその他のJavaアーティファクトタイプ)に設定する必要があります。<packaging>jar</packaging>
テストの前に 'Abstract'を付けると、デフォルトでも無視されます。
これらの答えの多くは過去には非常に役に立ちましたが、将来他の人に役立つ可能性があるので、しばらく時間がかかる追加のシナリオを追加したいと思います。
テストクラスとメソッドが公開されていることを確認してください。
私の問題は、私がIDE(IntelliJ)の自動テストクラス/メソッド生成機能を使用していたこと、そして何らかの理由でそれらをパッケージプライベートとして作成したことでした。私はこれが予想以上に見逃しやすいと思います。
Testng依存関係がこの問題の原因であることが判明した後、私も同様の問題を抱えていました。 pomからtestng依存関係を取り除いた後(私はもうそれを必要としないので)、それは私のためにうまく働き始めました。
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.8</version>
<scope>test</scope>
</dependency>
共有のJava/Groovyアプリケーションを使用していて、Groovyの単体テストしかない場合、Mavenはテストを見つけることができません。これは、src/test/Javaの下にユニットテストを1つ追加することで解決できます。
/my_program/src/test/Java/ClassUnderTestTests.Java
あるべき
/my_program/src/test/Java/ClassUnderTestTest.Java
Mavenはそれらのテスト終了を見つけるか、または自動的に実行されるようにテストで始まります。
しかし、あなたは使用することができます
mvn surefire:test -Dtest=ClassUnderTestTests.Java
テストを実行します。
テストクラス名が標準の命名規則に従わない場合(上記の@axtavtで強調表示されているように)、Mavenがテストを選択するためにpom.xml
にパターン/クラス名を追加する必要があります -
...
<build>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<includes>
<include>**/*_UT.Java</include>
</includes>
</configuration>
</plugin>
</plugins>
</build>
...
テストケースを実行しないもう一つの理由は私に起こりました - 私は全く異なる目的のために "test"という名前のプロパティを持っていましたが、それはsurefireプラグインを妨害しました。したがって、POMを確認してください。
<properties>
<test>.... </test>
...
</properties>
そしてそれを取り除きます。
もう1つのヒント(前の回答に加えて):
Eclipseで、プロジェクトの「プロパティー」>「Run/Debug Settings
」をクリックします。
「このページでは、現在選択されているリソースで起動設定を管理できます」
そこにあなたはあなたのプロジェクト(src/test/Java
フォルダ、またはコースの下)にあるJU(JUnit)テストを追加(新規...)または削除(削除)できます。
私は同じ問題に直面しました、それはpom.xmlの以下の変更によって解決されました:
<build>
<testSourceDirectory>test</testSourceDirectory>
...
に変更されました:
<build>
<testSourceDirectory>${project.basedir}/src/test/Java</testSourceDirectory>
これがpom.xmlに追加しなければならなかった正確なコードです。
<build>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>1.2.0-M1</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.2.0</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
そして、これが私の依存関係です:
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.2.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.easytesting</groupId>
<artifactId>fest-assert-core</artifactId>
<version>2.0M10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>1.2.0-M1</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.2.0-M1</version>
</dependency>
</dependencies>
私の場合、それはjunit-vintage-engineを追加して、それをJUnitテストの古いバージョンと互換性を持たせて実行することができます。私はJUnit 5を使っています。
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<scope>test</scope>
</dependency>
JUnit 4でテストを書き、JUnit 5の依存関係をsurefireプラグインに追加した場合、テストは実行されません。
その場合は、surefireプラグインからJUnit 5の依存関係をコメントするだけです。
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<!--<dependencies>-->
<!--<dependency>-->
<!--<groupId>org.junit.platform</groupId>-->
<!--<artifactId>junit-platform-surefire-provider</artifactId>-->
<!--<version>1.0.0</version>-->
<!--</dependency>-->
<!--<dependency>-->
<!--<groupId>org.junit.jupiter</groupId>-->
<!--<artifactId>junit-jupiter-engine</artifactId>-->
<!--<version>${junit.version}</version>-->
<!--</dependency>-->
<!--</dependencies>-->
</plugin>
私の場合、マルチモジュールアプリケーションをSpring Bootに移行しています。残念ながら、Mavenはモジュール内のすべてのテストを実行しませんでした。テストクラスの命名は変更されていません。命名規則に従っています。
最後に、依存関係surefire-junit47
をプラグインmaven-surefire-plugin
に追加すると役立ちました。しかし、私は説明できませんでした、なぜ、それは試行錯誤でしたか:
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.Apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>${maven-surefire-plugin.version}</version>
</dependency>
</dependencies>
JUnit5でsurfireプラグイン3.x.x +を使用し、JUnit4の@Test
アノテーションでテストクラスに誤ってアノテーションを付けると、このような問題が発生する可能性があります。
org.junit.jupiter.api.Test
(Junit4)の代わりにorg.junit.Test
(JUnit5)を使用してください。
注:IDEはJUnit4テストと同じように問題なくこの問題を実行する可能性があるので、これは気付きにくいかもしれません。
次はJunit 5で私のためにちょうどうまく働いた
https://junit.org/junit5/docs/current/user-guide/#running-tests-build-maven
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.0</version>
</plugin>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.22.0</version>
</plugin>
</plugins>
</build>
<!-- ... -->
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.4.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.4.0</version>
<scope>test</scope>
</dependency>
<!-- ... -->
</dependencies>
<!-- ... -->
誰かが検索しても解決しない場合は、さまざまなテスト用のライブラリがあります。
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${org.junit.jupiter.version}</version>
<scope>test</scope>
</dependency>
Junitをインストールしたとき、すべてがうまくいったと思います。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
見落とされがちなもう1つの問題 - クラスファイルの拡張子が.Javaであることを確認してください。
私はこのコードを使って使った
<sourceDirectory>src_controller</sourceDirectory>
<testSourceDirectory>src_test</testSourceDirectory>
私のpom.xmlに、そのtestngファイルを特定の場所に確実に入れ
<suiteXmlFile>/Users/mac/xxx/xxx/xx.xxxx.xx/xxx.restassured.xx/testng.xml</suiteXmlFile>
使用中のJUnitが標準(junit:junit
)ではない場合でもjunitArtifactName
が当てはまりますが、例えば...
<dependency>
<groupId>org.Eclipse.orbit</groupId>
<artifactId>org.junit</artifactId>
<version>4.11.0</version>
<type>bundle</type>
<scope>test</scope>
</dependency>