2回目のテストでは、getActivity()は決して返されません -- android フィールド と testing フィールド 関連 問題

On second test getActivity() never returns












6
vote

問題

日本語

assertNotNull(mActivity); のような、簡単なテストをいくつかしています(私はM.D.TRRRES「Androidアプリケーションテストガイド」を読んでいます)。テスト中のアクティビティは大丈夫です。すべての単一のテストも大丈夫です。しかし、2番目のテスト getActivity() で一度に複数のテストを実行すると、返されません。 LogCATのエラーはありません(最後の行「Intent ...」)、なしではありません。デバッグは、 getActivity() に署名した場合、ソースコードがないことを不平に言っていれば、 もう1つのテストプロジェクト - GoogleからのActivityTestはいくつかのテストでも大丈夫ですので、Eclipseは正しく設定されています。
誰かがそのようなものに遭遇しましたか?

英語

I have a couple of simple tests, like assertNotNull(mActivity); (I'm reading M.D.Torres "Android Application Testing Guide"). The activity under test runs okay. Every single test runs okay as well. But if I run several tests at once on the second test getActivity() never returns. No errors in logcat (last line "Starting Intent ..."), no nothing. Debugging doesn't help much either, if I step into getActivity() it complains that there is no source code available.
Another test project - ActivityTesting from Google runs okay even with several tests, so Eclipse is configured right.
Did anybody ever encounter something like that?

</div
     

回答リスト

8
 
vote
vote
ベストアンサー
 

私はもう一度テストプロジェクトを再作成し、(「クリーンルーム」のように)働いていました。それから私は2つのプロジェクトを比較し、犯人を見つけました。それは空の涙液でした:

<事前> <コード> protected void tearDown() throws Exception { }

削除した場合、すべてのテストが緑色に実行されます。貼り付けると、2番目のテストがハングします。今、私は説明を読み、それを答えとしてマークする準備ができています。

edit: tearDown6 メソッドの最後に super.tearDown() を呼び出す必要があります。 みんなを悩ませてすみません。

 

I recreated test project once more (like "clean room") and it worked. Then I compared two projects and found the culprit. It was empty teardown:

protected void tearDown() throws Exception { } 

If I remove it, all tests run green. If I paste it back, second test hangs. Now I would like to read the explanation and ready to mark it as answer.

Edit: I should be calling super.tearDown() at the end of the tearDown method. Sorry for bothering everybody.

</div
 
 
   
   
1
 
vote

私はActivityInStrumentationScase2を使用して、エキソプレイヤーと正しいリソースを使用してアクティビティをテストします。クリーンアップと最終チェックはすべてのテストで同じであるため、Teardown()はそれらを実装するのに適した場所です。すべてのテストは問題なく別々に実行されますが、複数のテストを実行すると、GetActivity()が返されませんでした。私のティアダウン()さまざまなことを実装しました:

  • アクティビティの状態をチェックする(さまざまなassert()呼び出し)
  • プレイヤーの状態(さまざまなassert()呼び出し)
  • プレーヤーリソースを手動でクリーンアップする(close()とrelease())
  • setActivity(null)(これはトラブルの原因)
  • super.teardown()

getActivity()をオーバーライドするような推奨される回避策をすべて試し、その他の計装方法を使用してアクティビティを作成してクリーンアップしました。これらの方法は助けませんでした。

とロットのデバッグは、上記のシナリオで前回のテストの活動のOnDestory()が次のテストの活動のoncreate()と重なることがあります。そのため、ログはこの順序でライフサイクルイベントを示しました。

<事前> <コード> test1.getActivity(); test1.tearDown() called; test1.tearDown() over; test2.getActivity() test2.onCreate(); test1.onStop(); --> why is this late? test1.onDestroy(); --> why is this late? test2.tearDown() called; test2.tearDown() over; test3.getActiviy() --> this should call test3.onCreate, but did not and never returned.

テストケースが別々のActiveSInStrumentationScase2クラス/ファイルで実装されていても発生します。そして、この重複がまだトラブルを引き起こさず、2つのテストは常に大丈夫ですが、この重複をもたらす任意の順序で3つのテストを実行すると、返信することはありません。

私は、計装を使って手動でonpause()+ onstop()+ ondestroy()を呼び出してみました。最後に、私の小切手の前に誤って設定性(NULL)を削除し、ライフサイクルイベントが正しく注文されました:

<事前> <コード> test1.tearDown() called; test1.onStop(); test1.onDestroy(); test1.tearDown() over; test2.getActivity() test2.onCreate(); ...

だから私の訴訟の違いを実際になされたもの:tontivitytestcase.setActivity()を呼び出さないでください。これにより、Super.teardown()が直接活動のライフサイクルイベントを呼び出すことはできません、クリーンアップは後で起こり、トラブルが発生します。

 

I used ActivityInstrumentationTestCase2 to test an Activity using ExoPlayer and correct resource clean up as well. As the clean up and final checks are the same for all the tests, I thought that tearDown() is a good place to implement them. All the tests run separately without any problem, but when I run multiple tests, sometimes getActivity() did not return. My tearDown() implemented various things:

  • check state of activity (various assert() calls)
  • check state of player (various assert() calls)
  • clean up player resources manually (calling close() and release())
  • setActivity(null) (this caused the trouble)
  • super.tearDown()

I tried all the suggested workarounds like overriding getActivity() and using the other methods of instrumentation to create and clean up the activity. These methods did not help.

And lots of debugging showed, that with above scenario the onDestory() of the activity of the previous test can overlap with the onCreate() of the activity of the next test. So the logs showed the life cycle events in this order:

test1.getActivity(); test1.tearDown() called; test1.tearDown() over; test2.getActivity() test2.onCreate(); test1.onStop(); --> why is this late? test1.onDestroy(); --> why is this late? test2.tearDown() called; test2.tearDown() over; test3.getActiviy() --> this should call test3.onCreate, but did not and never returned. 

This happens even when the test cases are implemented in separate ActivityInstrumentationTestCase2 classes/files. And the fist time this overlap does not cause trouble yet, so 2 tests are always OK, but running 3 tests in any order that result in this overlap causes the 3rd call to getActivity() to never return.

I tried everything like calling onPause() + onStop() + onDestroy() manually using the instrumentation, introducing really long sleep periods between tests, force clearing the activity of the instrumentationTestCase, reordering checks of my tearDown, but nothing helped. Finally, I accidentally removed setActivity( null) before my checks, and the life cycle events got correctly ordered:

test1.tearDown() called; test1.onStop(); test1.onDestroy(); test1.tearDown() over; test2.getActivity() test2.onCreate(); ... 

So what really made the difference in my case: do not call ActivityTestCase.setActivity(). This causes the super.tearDown() not to call the life cycle events of the activity directly, clean up will happen later and cause trouble.

</div
 
 

関連する質問

3  メモリリークを確認する方法  ( How to check memory leak ) 
コードに入らずにメモリリークを確認することは可能です。私は私と一緒に申し込みを持っていて、私はメモリリークがあるかどうかを確認したいです。 私の現在の組織では、アプリケーションの実行前後のCPU使用率と、アプリケーションのプロセスのCPU使用状況を確認します。...

0  オープンソースまたはフリーテストソリューション[クローズ]  ( Open source or free testing solution ) 
この質問はスタックオーバーフローガイドラインを満たしていません。現在答えを受け付けていません。 この質問を改善したいですか? ...

64  NETユニットテストパッケージ[クローズ]  ( Net unit testing packages ) 
この質問はスタックオーバーフローガイドラインを満たしていません。現在答えを受け付けていません。 この質問を改善したいですか? ...

-1  このアプリケーションにはどのような技術が適していますか? [閉まっている]  ( What technology is suitable for this application ) 
閉鎖。この質問は意見ベースです。現在答えを受け付けていません。 この質問を改善したいですか?この記事を編集することで事実や引用と...

17  Windowsシステムクロックを変更せずに時間を加える  ( Faking time without changing windows system clock ) 
偽の日付/時間をプロセスに報告するためのWindowsツールを知っていますか? 明らかに、システムクロックを実際に修正することなく、ソフトウェアが将来/異なるタイムゾーンでどのように反応するか、またはスケジュールされたタスクをトリガするために使用できるLin...

26  テストデータとしてセットの組み合わせを使用する方法  ( How to use combinations of sets as test data ) 
縞模様の場合と正常値のセットからタプルで機能をテストしたいと思います。たとえば、有効な三角形を形成する3つの長さを指定したときはいつでも true を返す関数をテストしている間、私は特定のケース、負/小/大数、閉鎖されている値などの値を持ちます。さらに、主な目...

43  ユニットテストと統合テストとは何ですか、そして他の種類のテストは何について知っているべきですか?  ( What are unit testing and integration testing and what other types of testing s ) 
私は他の人々がスタックオーバーフローでいくつかの種類のテストについて言及しているのを見ました。 私が思い出すことができるものは単体テストと統合テストです。特に単体テストがたくさん言及されています。正確に単体テストとは何ですか?統合テストとは何ですか?私は知って...

0  Schema_miribations上の固有の制約のためにRails Unitテストが失敗する  ( Rails unit tests fail because of unique constraint on schema migrations ) 
rake test:units を実行しようとしています。 <事前> <コード> Mysql::Error: Duplicate entry '2147483647' for key 1: INSERT INTO `ts_schema_migrations...

29  コードカバレッジツールを書き始める方法[閉まっている]  ( How to get started writing a code coverage tool ) 
この質問はスタックオーバーフローガイドラインを満たしていません。現在答えを受け付けていません。 この質問を改善したいですか? ...

7  テスト中にActiveRecordオブジェクトを保存してデータをレールに保存するレールはどこで保存されますか?  ( Where does rails store data created by saving activerecord objects during tests ) 
テスト中にActiveRecordオブジェクトを保存してデータを保存するデータをどこで保存しますか? 私はその質問に対する答えを知っていたと思いました:明らかに _testデータベース。しかし、それはではないようです! RSPECテスト中に保存されたActi...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有