1

Maven 3.0.3、Failsafe プラグイン v2.17、および JUnit 4.11 を使用しています。現在、次の順序でテストとの統合テストを行っています

@RunWith(SpringJUnit4ClassRunner.class)
public class MyTests {

    @Test
    public final void testAdd() {
        …
    }

    @Test
    public final void testUpdate() {
        …
    }

    @Test
    public final void testDelete() {
        …
    }

現在、「mvn clean install」実行の一部として Maven を介してテストを実行すると、「testAdd」または「testUpdate」の前に「testDelete」が実行されます。名前を「testZZZDelete」に変更すると、最後に実行されますが、私はそれが好きではありません。

ファイルで指定した順序でテストを実行するにはどうすればよいですか? 私のフェイルセーフ構成は次のようになります。

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>2.17</version>
        <configuration>
                <reuseForks>true</reuseForks>
                <argLine>-Xmx4096m -XX:MaxPermSize=512M ${itCoverageAgent}</argLine>
        </configuration>
        <executions>
                <execution>
                        <goals>
                                <goal>integration-test</goal>
                                <goal>verify</goal>
                        </goals>
                </execution>
        </executions>
</plugin>
4

4 に答える 4

6

短い答え: いいえ、テストが順番に実行されるように名前を変更する以外に方法はありません。@FixMethodOrder(NAME_ASCENDING)アノテーションを使用して、テストアルファベット順に実行されるようにすることができます。

長い回答: ご存じのとおり、surefire/failsafe では、runOrder構成パラメーターを使用してテストクラスを順序付けするオプションが提供されます。これは、各テスト クラスが実行される順序を制御します。したがって、クラス foobar.Test1 を foobar.Test2 の前に、またはその逆に実行できます。

クラス内のメソッドの実行順序に関して、直面している問題は、JVM がファイルで宣言されているのと同じ順序でメソッドのリストを返さないことです。Java 6 では、通常は宣言の順序で返される順序でしたが、java 7 ではこれが変更されました。そのため、JUnit 4.11 のリリースでは、デフォルトの順序付けがメソッド名のハッシュに基づくように変更され、決定論的ではあるが予測不可能な順序付けを行います。これが、何よりも先に testDelete を実行する理由です。

長い議論の末、JUnit 4.11 にアノテーションを追加しFixMethodOrderて、誰かが少なくともメソッドの名前を変更できるようにしました。これはSpringJUnit4ClassRunner、少なくとも最新バージョンでは動作するよう4.1.0.RELEASEです。他のリリースは試していません。

したがって、予測可能な順序にするために、必要に応じてメソッドの名前を変更して、必要な順序で実行し@FixMethodOrder、クラスに注釈を追加することができます。

@RunWith(SpringJUnit4ClassRunner.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class MyTests {

@Test
public final void step1Add() {
    …
}

@Test
public final void step2Update() {
    …
}

@Test
public final void step3Delete() {
    …
}

詳細については、「JUnit4 はテストの注文のサポートを開始しましたか?」を参照してください。意図的なものですか?.

于 2014-09-18T21:11:25.033 に答える
0

この JUnit パッチは、この機能を実装しますhttps://github.com/adko-pl/junit/commit/4421261dbdcaed8ff0a82f4d5229ac8ad6c97543、作者は、パッチを適用した JUnit を使用して、 org.junit.Test アノテーションに順序パラメーターを追加しなかったようです現在のすべてのテストを別のフレームワーク IMHO に適合させるよりもはるかに簡単です。

JUnit4で特定の順序でテストメソッドを実行する方法を参照してください。

于 2014-09-24T14:50:21.740 に答える
0

まず、テストを相互に依存させることは一般的に悪い習慣ですが、これは最も純粋な見方であり、その状態に到達するのが本当に遅い場合は続行する必要があることを認識しています。個人的には、この投稿で提供された回答で、2 番目のオプションを選択します。これは、注釈が適切で明示的なものになるためです。

于 2014-06-20T21:57:09.470 に答える
0

TestNg は、ユーザー定義の順序でテストを実行するオプションを提供すると思います。

@Test(dependsOnMethods='testAdd')
public final void testAdd() {
    …
}

@Test(dependsOnMethods='testAdd')
public final void testUpdate() {
    …
}

@Test(dependsOnMethods='testUpdate')
public final void testDelete() {
    …
} 

そのため、コンパイラが「testUpdate」テストを実行しようとすると、実行に制限が追加されます。testUpdate 関数は、「testAdd」関数に依存しています。そのため、コンパイラは最初に「testAdd」を実行してから、「testUpdate」関数に進みます。

テストが JUNIT から TestNg に移行されることを願っています。

于 2014-06-22T12:59:38.383 に答える