web-dev-qa-db-ja.com

maven-surefire-pluginを使用して、同じプロジェクトでJUnitテストとTestNGテストを実行するにはどうすればよいですか?

現在、両方のタイプのテストがありますが、「mvn test」と言うと、JUnitではなくTestNGテストのみを実行します。両方を次々に実行したい。何か案が ?

39
ravinikam

thiの未解決の問題 sがあるため、これを行うエレガントな方法はありません。

フレームワークを選択してそれを使用する方がはるかに簡単です。

編集:実行で依存関係を指定できないため、以前の回答は機能しません。私はいくつかの方法を試しましたが、管理できる最善の方法は、TestNG依存関係のプロファイルを作成して、TestNGとJUnitテストを切り替えられるようにすることです。TestNGテストとJunit 4テストの両方を実行する手段がないようです。 。

注意すべきもう1つのポイント: TestUnitからJUnitテストを起動 できますが、これはJUnit 3テストでのみ機能すると思います。

11
Rich Seller

プロバイダーの選択 による公式な方法。

複数のプロバイダーを依存関係として指定することもでき、それらはすべて実行され、共通のレポートを生成します。含まれているプロバイダーを組み合わせるためのユースケースがほとんどないため、これは外部プロバイダーで特に便利です。

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.18.1</version>
    <dependencies>
        <dependency>
            <groupId>org.Apache.maven.surefire</groupId>
            <artifactId>surefire-junit47</artifactId>
            <version>2.18.1</version>
        </dependency>
        <dependency>
            <groupId>org.Apache.maven.surefire</groupId>
            <artifactId>surefire-testng</artifactId>
            <version>2.18.1</version>
        </dependency>
    </dependencies>
</plugin>

これに関する詳細情報: 1つのMavenモジュールでのTestNGテストとJUnitテストの混合– 2013版

maven-surefire-pluginの例 でのこのための現在のリンク。 「Running TestNG and JUnit Tests」を検索します。

次のようにju​​nitテストを無視するようにtestngプロバイダーを設定する必要があります。

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.18.1</version>
    <configuration>        
    <properties>
        <property>
            <name>junit</name>
            <value>false</value>
         </property>
    </properties>        
    </configuration>
    [...providers as dependecies, see above...]
</plugin>
47
MariuszS

より良い解決策 があります。

アイデアは、JUnit用とTestNG用の2つのmaven-surefire-pluginの実行を作成することです。存在しないjunitArtifactNameまたはtestNGArtifactNameを指定することにより、実行ごとにTestNGまたはJUnitのいずれかを無効にできます。

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <executions>
        <execution>
            <phase>test</phase>
            <goals>
                <goal>test</goal>
            </goals>
            <configuration> 
                <testNGArtifactName>none:none</testNGArtifactName>
            </configuration>
        </execution>
        <execution>
            <id>test-testng</id>
            <phase>test</phase>
            <goals>
                <goal>test</goal>
            </goals>
            <configuration> 
                <junitArtifactName>none:none</junitArtifactName>
            </configuration>
        </execution>
    </executions>
</plugin>
13
lexicore

このリンクのおかげで( http://jira.codehaus.org/browse/SUREFIRE-377 )、これは私の以前の問題の解決策です(2つではなく3つの実行がある)

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.10</version>
    <configuration>
       <testNGArtifactName>none:none</testNGArtifactName>
    </configuration>
    <executions>
       <execution>
          <phase>test</phase>
          <goals>
             <goal>test</goal>
          </goals>
          <configuration>
             <junitArtifactName>none:none</junitArtifactName>
             <testNGArtifactName>org.testng:testng</testNGArtifactName>
          </configuration>
       </execution>
    </executions>
</plugin>

これには別の方法があります。 TestNGにJunitテストケースを実行するよう依頼することもできます。以下は、すべてのテストケースを実行するためのサンプルtestng.xmlです

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
 
<suite name="TestAll">
 
        <test name="junitTestCases" junit="true">
                <packages>
                        <package name="com.test.*" />
                        
                </packages>
        </test>
 
 <test name="testNGTestCases" >
                <packages>
                        <package name="com.test.*" />
                        
                </packages>
        </test>
</suite>
6
jean joseph

ビルドツールの構成を変更せずにTestNGで両方のテストタイプを実行するソリューションを見つけました。

私はGradleでテストしましたが、Mavenでも動作するはずです。

これはTestNG内でJUnitテストを実行しますが、逆は実行しないことに注意してください。

トリックは、テストクラスで両方のフレームワークの注釈を使用し、JUnit互換性のためにTestNGアサートを使用することです。

import static org.testng.AssertJUnit.*;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

@org.testng.annotations.Test
public final class ApplicationTest {

    @org.testng.annotations.BeforeClass
    @BeforeClass
    public static void setup () {}

    @org.testng.annotations.AfterClass
    @AfterClass
    public static void cleanup () {}

    @Test public void json () throws IOException {
        assertTrue (true);
    }
}

このハックを使用すると、TestNGを使用して既存のJUnitテストを簡単に実行でき、時間の許す限りそれらを移行するのに役立ちます。

それが役に立てば幸い!

2
jaguililla

JUnitの場合---

<plugin>
   <groupId>org.Apache.maven.plugins</groupId>
   <artifactId>maven-surefire-plugin</artifactId>
   <version>2.19.1</version>
   <dependencies>
  <dependency>
    <groupId>org.Apache.maven.surefire</groupId>
    <artifactId>surefire-junit47</artifactId>
    <version>2.19.1</version>
  </dependency>
</dependencies>

同様に、必要に応じてTestNGの依存関係を使用します

2
sathish p

jUnitのためにこれは私の問題を解決しました

<plugin>
   <groupId>org.Apache.maven.plugins</groupId>
   <artifactId>maven-surefire-plugin</artifactId>
   <version>2.19.1</version>
   <dependencies>
  <dependency>
    <groupId>org.Apache.maven.surefire</groupId>
    <artifactId>surefire-junit47</artifactId>
    <version>2.19.1</version>
  </dependency>
</dependencies>
1
Mauricio

解決策は、確実なプラグインにJUnitを使用させることでした。次のように、特定のプロジェクトでsurefireプラグインをオーバーライドしてこれを行いました。依存関係により、確実にJUnitを使用する必要があります。

<build>
    <plugins>
        <!-- force sure fire to use junit instead of testng -->
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.10</version>
            <dependencies>
                <dependency>
                    <groupId>org.Apache.maven.surefire</groupId>
                    <artifactId>surefire-junit47</artifactId>
                    <version>2.10</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>
1
Clayton

以前のソリューションに基づいています。これが私たちにとって最も効果的であることがわかりました。私たちが直面していたもう1つの問題は、TestNGが古いJUnitテストを実行しようとすることでした。すべてのTestNGテストに異なる名前を付けることでこれを回避しました(例:* TestNG.Java)。以下は、surefire-pluginを2回実行した構成です。

    <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.12.4</version>
            <configuration>           
                <testNGArtifactName>none:none</testNGArtifactName>   
                <excludes>
                    <exclude>**/*TestNG.Java</exclude>
                </excludes> 
            </configuration>
            <executions>
                <execution>
                    <id>test-testng</id>
                    <phase>test</phase>
                    <goals>
                        <goal>test</goal>
                    </goals>
                    <configuration> 
                        <junitArtifactName>none:none</junitArtifactName>          
                        <testNGArtifactName>org.testng:testng</testNGArtifactName>   
                        <includes>
                            <include>**/*TestNG.Java</include>
                        </includes>
                        <excludes>
                            <exclude>**/*Test.Java</exclude>
                        </excludes> 
                    </configuration>
                </execution>
            </executions>
        </plugin>
1
chinto

testngプロバイダーを指定しただけの場合、junitテストとtestngテストの両方が一度だけ実行されます。
テストの名前に制限はありません。

プラグインのバージョン:
surefire-plugin 2.16(junit47およびtestngプロバイダーの両方のバージョンが2.16に設定されています)
testng依存関係6.8.7
junit依存関係4.7

0
user200905
<build>
    <plugins>
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.0</version>
            <configuration>
                <source>${Java.version}</source>
                <target>${Java.version}</target>
            </configuration>
        </plugin>
        <!-- ********* Skip Test for Success BUILD ******** -->
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.10</version>
            <configuration>
                <skip>true</skip>
            </configuration>
        </plugin>
        <!-- *********************************************** -->
    </plugins>
</build>

<profiles>
    <!-- ********** Profiles for run test cases ************ -->
    <!-- Profile for run JUnit test dependent tests -->
    <profile>
        <id>junit-tests</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.Apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.10</version>
                    <configuration>
                        <skip>false</skip>
                    </configuration>
                    <dependencies>
                        <dependency>
                            <groupId>org.Apache.maven.surefire</groupId>
                            <artifactId>surefire-junit47</artifactId>
                            <version>2.10</version>
                        </dependency>
                    </dependencies>
                </plugin>
            </plugins>
        </build>
    </profile>

    <!-- Profile for run TestNG dependent tests -->
    <profile>
        <id>testNG-tests</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.Apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.10</version>
                    <configuration>
                        <skip>false</skip>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>

    <!-- ***************************************************** -->
</profiles>

単に実行するより:mvn test -Pjunit-tests(junitに基づく実行テストの場合)またはmvn test -PtestNG-tests(TestNGテストベースの場合)。

0
MolodecSerg