134

私はJunitテストの負荷を継承しましたが、これらのテスト(ほとんどが機能しないことを除く)は、実際の単体テストと統合テスト(外部システム、dbなどが必要)を組み合わせたものです。

そこで、実際にそれらを分離して、単体テストとその後の統合テストをすばやく実行できるようにする方法を考えています。

オプションは..

  1. それらを別々のディレクトリに分割します。

  2. Junit4(v3から)に移動し、クラスに注釈を付けてそれらを分離します。

  3. ファイルの命名規則を使用して、クラスが何であるか、つまりAdapterATestとAdapterAIntergrationTestを指定します。

3には、Eclipseに「選択したプロジェクト/パッケージまたはフォルダーですべてのテストを実行する」オプションがあるという問題があります。したがって、統合テストを実行するだけでは非常に困難になります。

2:開発者が単体テストクラスで統合テストを書き始める可能性があり、それが面倒になるリスクがあります。

1:最も近い解決策のように見えますが、私の腸はそこにもっと良い解決策があるに違いないと言います。

それが私の質問です。統合テストと適切な単体テストをどのように分解しますか?

4

6 に答える 6

153

JUnitカテゴリとMavenを使用して、それらを非常に簡単に分割できます。

これは、ユニットの分割と統合テストによって、非常に簡単に以下に示されています。

マーカーインターフェイスを定義する

カテゴリを使用してテストをグループ化する最初のステップは、マーカーインターフェイスを作成することです。

このインターフェースは、統合テストとして実行するすべてのテストをマークするために使用されます。

public interface IntegrationTest {}

テストクラスにマークを付ける

テストクラスの先頭にカテゴリアノテーションを追加します。新しいインターフェースの名前が付けられます。

import org.junit.experimental.categories.Category;
@Category(IntegrationTest.class)
public class ExampleIntegrationTest{
  @Test
  public void longRunningServiceTest() throws Exception {
  }
}

Mavenユニットテストの構成

このソリューションの優れている点は、単体テストの側面では実際には何も変わらないことです。

統合テストを無視するように、mavensurefireプラグインにいくつかの構成を追加するだけです。

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.11</version>
  <dependencies>
   <dependency>
     <groupId>org.apache.maven.surefire</groupId>
     <artifactId>surefire-junit47</artifactId>
     <version>2.12</version>
   </dependency>
  </dependencies>
  <configuration>
    <includes>
      <include>**/*.class</include>
    </includes>
    <excludedGroups>com.test.annotation.type.IntegrationTest</excludedGroups>
  </configuration>
</plugin>

mvn cleanテストを実行すると、マークされていない単体テストのみが実行されます。

Maven統合テストの構成

この場合も、この構成は非常に簡単です。

統合テストのみを実行するには、次を使用します。

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.11</version>
  <dependencies>
   <dependency>
     <groupId>org.apache.maven.surefire</groupId>
     <artifactId>surefire-junit47</artifactId>
     <version>2.12</version>
   </dependency>
  </dependencies>
  <configuration>
    <groups>com.test.annotation.type.IntegrationTest</groups>
  </configuration>
</plugin>

これをidのプロファイルでラップすると、ITを使用して高速テストのみを実行できますmvn clean install。統合/低速テストのみを実行するには、を使用しますmvn clean install -P IT

ただし、ほとんどの場合、デフォルトで高速テストを実行し、すべてのテストを-P IT。その場合は、トリックを使用する必要があります。

<profiles>
    <profile>
        <id>IT</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <configuration>
                        <excludedGroups>java.io.Serializable</excludedGroups> <!-- An empty element doesn't overwrite, so I'm using an interface here which no one will ever use -->
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

ご覧のとおり、で注釈が付けられているテストは除外していjava.io.Serializableます。<excludedGroups/>プロファイルはSurefireプラグインのデフォルト構成を継承するため、これが必要です。したがって、またはと言っても<excludedGroups></excludedGroups>、値com.test.annotation.type.IntegrationTestが使用されます。

noneまた、クラスパス上のインターフェースである必要があるため、使用できません(Mavenがこれをチェックします)。

ノート:

  • への依存関係surefire-junit47は、MavenがJUnit4ランナーに自動的に切り替わらない場合にのみ必要です。groupsor要素を使用するとexcludedGroups、スイッチがトリガーされます。ここを参照してください
  • 上記のコードのほとんどは、Mavenフェイルセーフプラグインのドキュメントから取得したものです。このページの「JUnitカテゴリーの使用」のセクションを参照してください。
  • @RunWith()テスト中に、アノテーションを使用してスイートまたはSpringベースのテストを実行する場合でもこれが機能することがわかりました。
于 2012-04-30T09:52:54.020 に答える
45

Maven Surefireプラグインを使用して単体テストを実行し、Mavenフェイルセーフプラグインを使用して統合テストを実行します。単体テストは、**/Test*.java **/*Test.java **/*TestCase.java命名規則、統合テストに従います- **/IT*.java **/*IT.java **/*ITCase.java。つまり、実際にはオプション番号3です。

いくつかのプロジェクトでは、TestNGを使用し、統合/単体テスト用にさまざまなテストグループを定義していますが、これはおそらく適切ではありません。

于 2010-04-09T12:58:14.650 に答える
13

私はそれを持っているという理由だけでJunit4に移動します:)

それらを異なるテストスイートに分けることができます。Junit3でそれらがどのように編成されているかはわかりませんが、Junit4では、テストスイートを構築し、すべての実際の単体テストをそれらの1つに入れて、統合テストに2番目のスイートを使用するだけで簡単です。

ここで、Eclipseで両方のスイートの実行構成を定義すると、単一のスイートを簡単に実行できます。これらのスイートは、自動化されたプロセスから起動することもできます。これにより、ソースが変更されるたびに単体テストを実行でき、統合テスト(非常に大きい場合)を1日1回または1時間に1回実行できます。

于 2010-04-09T10:34:53.753 に答える
10

私は現在、組織のポリシー(およびJunit 3のレガシー)のために別々のディレクトリを使用していますが、Junit 4を使用しているので、自分でアノテーションに移行することを検討しています。

開発者が単体テストクラスに統合テストを配置することについてはあまり心配しません。必要に応じて、コーディング標準にルールを追加します。

アノテーションやクラスを物理的に分離する以外に、どのようなソリューションがあるのか​​知りたいです。

于 2010-04-09T10:43:03.837 に答える
10

IfProfileValue Springアノテーションを使用すると、Mavenプラグインや構成を必要とせずにこれを実現できます

IfProfileValueを使用して、統合テストのクラスまたはメソッドに注釈を付けます

import org.springframework.test.annotation.IfProfileValue;

@IfProfileValue(name="test-groups", value="integration")
public class ExampleIntegrationTest{
    @Test
    public void longRunningServiceTest() throws Exception {
    }
} 

単体テストのみを使用して実行するには:

mvn clean test

統合テストと単体テストを使用して実行するには:

mvn clean test -Dtest-groups=integration

また、IDEの「すべてのテストを実行」は単体テストのみを実行します。VM引数に追加-Dtest-groups=integrationして、統合テストと単体テストの両方を実行します。

于 2015-12-12T20:40:43.110 に答える
6

正しい答えは1つではありません。あなたが説明したように、それを行うにはいくつかの方法があります。私はファイルの命名スキームと物事を異なるディレクトリに分割することの両方を行いました。

物事を別のディレクトリに分割する方がうまくいくように思えますが、それは私には少し明確に思えるので、私はそれに傾倒します。

注釈は私にはもっときめ細かいように見えるので、私は注釈を試さないと思います。これらの2つのタイプのテストを同じファイルに混在させたいですか?私はしません。

于 2010-04-11T04:42:46.827 に答える