6

カスタムJavaFXコンポーネントのセットを含むかなり大きなプロジェクトに取り組んでいます。再利用するカスタム コンポーネントごとに、JemmyFX と JUnit を使用して一連の自動テストを作成し始めました。開発中は、これらを Eclipse Juno 内から実行します。

テスト スイート全体を一度に実行するのは難しいことがわかっています。この問題は、複数のコンポーネントをテストしたいので、理想的にはそれぞれに異なるアプリケーションを実行するという事実に起因しているようです (1 つのコンポーネントで実行されたテストが他のテストに影響を与えないようにするため)。

次のことを行う基本クラスを作成しました。

@BeforeClass
public static void beforeClass() {

    Thread t = new Thread("JavaFX Init Thread") {

        @オーバーライド
        public void run() {
            Application.launch(UITester.class, new String[0]);
        }
    };

    t.setDaemon(真);
    t.start();
}

@Testこの基本クラスを使用して、各カスタム コントロールのテストを含む個別のクラスを作成しました。このテスト スイートを実行すると、最初のテスト ケースは正常に実行されますが、残りは失敗します。

スレッド「JavaFX Init Thread」の例外 java.lang.IllegalStateException: アプリケーションの起動を複数回呼び出すことはできません

この問題に対処するために、次の方法を試しました。

アプリケーションをシャットダウンします

基本クラスに以下を追加しました。

@放課後
public static void afterClass() {
    Platform.exit();
}

同じ問題が続きます。おそらく、VM がテスト間で再起動されていないためでしょうか?

アプリケーションの再起動を防ぐ

おそらくアプリケーションがすでに実行されているかどうかを確認するために、静的変数を入れました。これにより、Eclipse からテストを実行すると問題が解消されます。コマンドラインから実行しても問題は解決しません。これらのテストを統合サーバーで実行しようとする場合には適していません。

IllegalStateException をキャッチする

これは奇妙なものです。例外をキャッチすることができ、Ubuntu のテスト スイート全体を 4 ~ 5 回実行するたびにシェルがクラッシュし、再度ログインする必要があるという事実を除いて、ほとんどの問題は解決しました。

では、大規模なカスタム コントロール スイートのテストを作成するにはどうすればよいでしょうか。私のアプローチは間違っていますか?

4

1 に答える 1

3

MarvinFXのソースを調べた後、問題に対処する方法でテスト フレームワークを実装することができました。この問題の修正に最も貢献したと思われるのは、次の (疑似) コードで示されているように、テストごとにステージとシーンを再構築することでした。

@Before
public void before() {
    Node node = generateComponentToTest();
    Parent parent = StackPaneBuilder.create().children(node).build();
    Scene scene = SceneBuilder.create().root(parent).build();

    if (this.currentStage != null) {
        this.currentStage.close();
    }

    Stage stage = new Stage();
    stage.setScene(scene);
    stage.centerOnScreen();
    stage.show();

    this.currentStage = stage;
}
于 2013-09-30T20:36:28.217 に答える