2

Android プラットフォーム用のライブラリの単体テストに取り組んでいます。JUnit を使用しましたが、非同期メソッドのテストでいくつかの問題が見つかりました。

問題 - ex - Func1() のメソッドがライブラリにあり、これは同期的であり、サーバーと対話してイベントを返すスレッドを作成し、これらのイベントをリッスンするイベント リスナーがあります。Func1() に対するテストを作成すると、すぐに戻りますが、そのスレッドが作成されるかどうかはわかりません。

これを解決するために、Sleep()、CountDownLatch、AsyncTask などを試しました。結果は得られませんでした。

後で、TetNG が Async メソッドのテストをサポートすることを発見しました。TestNG を Eclipse に統合し、サンプル テスト ケースを作成しました。しかし、「テストケース->右クリック->実行->テストNGテスト」を実行してテストケースを実行しようとすると、Eclipseに「リモートTestNGクライアントに接続できませんでした。持っていないことを確認してください」というエラーメッセージボックスが表示されますクラスパスにある古いバージョンの testng.jar ".

だから私の質問は -

Android アプリケーション/ライブラリの単体テストに TestNG フレームワークを使用することはできますか? はいの場合、どうすればそれを達成できますか?

いいえの場合、非同期メソッドでの jUnit WRT テストよりも優れた利用可能な他のフレームワークはありますか?

前もって感謝します。

4

2 に答える 2

0

@assylias - 再生していただきありがとうございます。

それは同じ結果を示しています。作成された新しいスレッドからイベントを取得できません。

これが私がしたことです。

public void testFunc() throws ... { 
final CountDownLatch done = new CountDownLatch(1);
final Event expected = ABC;

Func(); // which is synchronous and will return immediately; but creates a thread which will do some action  and send an Event.

Listener lst = new Listener() {
    public void handle event(Event e) {
        assertEquals(expected, e);
        done.countdown();
    }
};
done.await();

ただし、テスト ケースは無期限に待機し、イベントは生成されません。jUnitは子スレッドを実行しますか、それとも作成時にすぐに殺しますか?

于 2013-09-20T07:22:13.660 に答える
0

これらのイベントをリッスンするイベントリスナーがあります

JUnit は、テストのメイン スレッドが終了するとすぐにテストを停止します。

次のようなことを試しましたか(タイプミスがあるかもしれません):

final CountDownLatch done = new CountDownLatch(1);
final Event expected = ...

Listener lst = new Listener() {
    public void handle event(Event e) {
        assertEquals(expected, e);
        done.countdown();
    }
};
//register listener and run Func1
assertTrue(done.await(1, SECONDS));

これは、追加の調整なしで機能するはずです (そうでない場合、リスナーはおそらく何もしていませんが、その場合、テストが 1 秒間実行されることを確認できます)。

于 2013-09-19T02:27:00.327 に答える