8

Maven で非常にうまく機能する JUnit 用の単純な RunListener を作成しました。経由で maven-failsafe-plugin に登録できます

<properties>
    <property>
        <name>listener</name>
        <value>com.asml.lcp.middleware.common.jboss.test.tps.TestDocumentationListener</value>
    </property>
</properties>

リスナーからの正しい出力を確認します。

ここで、テストを実行するときに同じ出力を表示するために、Eclipse に同じ RunListener を登録したいと考えています。

これは可能ですか?テスト目的で一貫性を保つために、同じ出力が得られると便利です。

4

3 に答える 3

2

データベースを実行する必要がある一連のテストがあります。実行の開始時にデータベースを作成し、最後に削除したいと考えています。

Maven から、 RunListenerを maven-surefire-plugin に追加しましたが、正常に動作します。また、 ismavenという名前のシステム プロパティ変数も追加しました。Maven からテストを実行すると、この変数は初期化されますが、Eclipse からテストを実行すると、この変数は null になります ( System.getPropertyで変数にアクセスします)。

<configuration>
  <properties>
    <property>
      <name>listener</name>
      <value>com.mycompany.MyRunListener</value>
    </property>
  </properties>
  <systemPropertyVariables>
    <ismaven>true</ismaven>
  </systemPropertyVariables>
</configuration>

すべてのデータベース テストは、@BeforeClass メソッドと @AfterClass メソッドを持つクラスから継承します。これらのメソッドは、テストが Maven によって実行されているか、またはismavenプロパティーの値をチェックする Eclipse によって実行されているかをチェックします。テストが maven によって実行されている場合、ismavenプロパティには値があり、それらは何でもします。しかし、テストが Eclipse によって実行されている場合、ismaven変数は null であり、データベースを開始 (@BeforeClass) または停止 (@AfterClass) します。

@BeforeClass
public static void checkIfStartDatabase() {   
  String ismaven = System.getProperty("ismaven");
  // If it is not maven, start the database
  if (ismaven == null) {
    startDatabase();
  }
}

@AfterClass
public static void checkIfStopDatabase() {
  String ismaven = System.getProperty("ismaven");
  // If it is not maven, stop the database
  if (ismaven == null) {
    stopDatabase();
  }
}

このソリューションは問題を 100% 解決するわけではありませんが、実装すると、Eclipse を使用して 1 つの JUnit クラスのすべてのテストを実行 (およびデバッグ) でき、Maven を使用してプロジェクトのすべてのテストを実行することもできます。すべてのテストの実行前または実行後にコードを 1 回実行します。

于 2014-10-03T08:20:10.897 に答える
1

はい、可能です。基本的に、独自の Runner を実装する必要があり、run メソッド内で、カスタムの実行リスナーを追加できます。この投稿、ポイント2に基づいてこれを理解しました。

これが私のリスナーです

public class TestLogger extends RunListener
{
    public void testFinished(Description description)
    {
        System.out.println("Successful " + description.getMethodName());
    }
}

これが私のランナーです

public class TestRunner extends BlockJUnit4ClassRunner
{
    public TestRunner(Class<?> klass) throws InitializationError
    {
        super(klass);
    }

    @Override
    public void run(RunNotifier notifier)
    {
        notifier.addListener(new TestLogger());   // THIS IS THE IMPORTANT LINE
        super.run(notifier);
    }
}

ここに私の実際のjunitテストがあります

@RunWith(TestRunner.class)           // THIS LINE IS ALSO IMPORTANT
public class MyTest1
{
    @Test
    public void Test1() throws Exception
    {
        if (Math.random() < .5) throw new Exception("ouch");
        assertFalse(Math.random() < .5);
    }
}    

Eclipse のコンテキスト メニューを使用して MyTest1 または Test1 メソッドを実行すると、期待どおりに testLogger が呼び出されます。

于 2014-11-21T21:41:06.383 に答える
0

私はこれについてさらに調査を行いました。私が今見る限り、実行リスナーを追加する方法はなく、JUnit は Eclipse で実行されます。

于 2012-07-05T11:53:00.823 に答える