0

私は Arquillian に頭を悩ませようとしており、おそらく自分のプロジェクトでそれを使い始めようとしています。Tomcat に WAR としてデプロイする単純な Java Web アプリがあります。

私のプロジェクトでは、ServletContextListenerTomcat がアプリケーションを開始および停止するときにコードを実行できるように impl を定義しています。

ShrinkWrap を使用する超単純なArquillian テスト クラスを作成しようとしています。

  1. バンドルされた WAR を Tomcat にデプロイして、例外をスローすることなく開始できることを確認します。と
  2. アプリが実行されたら ( がServletContextListenerチェックする) シンプルなシステム プロパティにアクセスできます。と
  3. Tomcat のシャットダウン時に例外がスローされないことを確認します (クリーン シャットダウン)。

また、実装する私のクラスは次のServletContextListenerように呼ばれAppLifecycleManagerます:

public class AppLifeCycleManager implements ServletContextListener {
    private String logLevel;

    // Injected by Guice, but that's not really relevant for this question.
    @Inject
    private Logger logger;

    // Getter and setter for logLevel and logger

    @Override
    public void contextInitialized(ServletContextEvent event) {
        logLevel = System.getProperty("log.level");
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        logger.info("Peacefully shutting down the application.");
    }
}

これまでのところ、これが私の最善の試みです:

@RunWith(Arquillian.class)
public class MyFirstRealIntegrationTest {
    @Deployment
    public static Archive<?> createDeployment() {
        // Haven't figured this part out yet, but for the sake of
        // this question lets pretend this returns a properly-packaged
        // WAR of my web app, the same that my Ant build currently produces.
    }

    @Test
    public void shouldBeAbleToStartTomcatWithoutExceptions() {
        // Given
        Archive war = createDeployment();

        // When - deploy war to Tomcat container
        try {
            // ??? how to access/init a Tomcat container?
            TomcatContainer tomcat = new TomcatContainer(); // this is wrong
            tomcat.start();
        } catch(Throwable throwable) {
            // Starting the container should not throw exceptions
            Assert.fail();
        }
    }

    @Test
    public void shouldBeAbleToStopTomcatWithoutExceptions {
        // Same setup as above test but stops tomcat and checks for
        // thrown exceptions. Omitted for brevity.
    }

    @Test
    public void shouldHaveAccessToSysPropsOnceRunning() {
        // Here, deploy to the container and start it.
        // Then, confirm that AppLifecycleManager correctly read
        // the log.level system property.

        // Given
        Archive war = createDeployment();
        TomcatContainer tomcat = new TomcatContainer();

        // When - AppLifeycleManager should now read the system property
        tomcat.start();

        // Then - make sure log.level was set to "DEBUG" and that it was
        // correctly read by AppLifeCycleManager.
        Assert.assertTrue(war.getClass(AppLifeCycleManager.class)
                .getLogLevel().equals("DEBUG"));
    }
}

したがって、ここでの私のアプローチを考えると、すぐにいくつかの問題が発生します。

  1. Tomcat コンテナーにアクセス/インスタンス化して、開始/停止する方法がわからない
  2. 実行中/デプロイ済みの Web アプリ内から実際にテストを実行する方法がわかりません。上記の 3 番目のテストwar.getClass(AppLifeCycleManager.class).getLogLevel()では、「ライブ」クラス インスタンスにアクセスしてそのプロパティのランタイム値をチェックしようとしましたlogLevelが、これが間違っていることはわかっています。

そこで私は質問します: 戦いに慣れた Arquillian のベテランはどのようにこれら 3 つの簡単なテストを作成するのでしょうか? JUnit テスト内から「実行中の」Web アプリで実際にテストを実行するにはどうすればよいでしょうか? 前もって感謝します。

4

2 に答える 2

2

テストでTomcatの起動/シャットダウンを処理する必要はないと思います。組み込みの tomcat コンテナーを使用すると、はるかに簡単になります: https://docs.jboss.org/author/display/ARQ/Tomcat+7.0+-+Embedded。この場合、arquillian は tomcat の起動とシャットダウンを処理します。

@Deployment アノテーションが付けられたメソッドでデプロイメントを作成する必要があります。次のガイドを読んでください: http://arquillian.org/guides/getting_started/

于 2013-02-05T07:23:46.250 に答える
1

あなたはほとんどそこにいます。createDeployment組み込みコンテナーのライフサイクルを管理します (仮想コンテナーを自動的に開始および停止します)。そうすれば、テスト自体に集中できます。統合テストを作成するために、コーディングする「フレームワーク」や「Arquillian API」はありません。メイン コードと同じように、クラスとメソッドを呼び出すだけです。

ここで重要なことは、テストが実際にコンテナ内で実行されているということです。例外が発生した場合、またはアサートが失敗した場合、Arquillian ランナーは例外をスローしてコンテナーを停止します。システムプロパティを読み取れるかどうかをテストしているコード例については、次のとおりです。

@RunsWith(Arquillian.class)
public class MyArquillianTest {
    @Deployment
    public Archive<?> createDeployment() { ... }

    @Test
    public void shouldBeAbleToReadSysPropAtStartup() {
        Assert.assertTrue(System.getProperty("log.level") != null);
    }
}

Assert.assertTrue(System.getProperty("log.level") != null)Arquillian は、設定したコンテナ内でコードを「転送」していることを思い出してください。そのアサートは、デプロイされたコンテナ内で実際に実行されています。

于 2013-02-11T19:13:05.563 に答える