こんにちは、私はAndroid Junitテスト:
MainActivityFunctionalTest.Javaファイルにいくつかのテストコードを記述しました
MainActivityFunctionalTest.Java:
package com.example.myfirstapp2.test;
public class MainActivityFunctionalTest extends ActivityInstrumentationTestCase2<Login>{
private static final String TAG = "MainActivityFunctionalTest";
private Login activity;
public MainActivityFunctionalTest() {
super(Login.class);
}
@Override
protected void setUp() throws Exception {
Log.d(TAG,"Set-Up");
super.setUp();
setActivityInitialTouchMode(false);
activity = getActivity();
}
public void testStartSecondActivity() throws Exception {
// add monitor to check for the second activity
ActivityMonitor monitor =
getInstrumentation().
addMonitor(DisplayMessageActivity.class.getName(), null, false);
//addMonitor(MainActivity.class.getName(), null, false);
// find button and click it
Button view = (Button) activity.findViewById(R.id.btnLogin);
// TouchUtils handles the sync with the main thread internally
TouchUtils.clickView(this, view);
// to click on a click, e.g., in a listview
// listView.getChildAt(0);
// wait 2 seconds for the start of the activity
DisplayMessageActivity startedActivity = (DisplayMessageActivity)
monitor
.waitForActivityWithTimeout(5000);
assertNotNull(startedActivity);
// search for the textView
TextView textView = (TextView) startedActivity.findViewById(R.id.Email);
// check that the TextView is on the screen
ViewAsserts.assertOnScreen(startedActivity.getWindow().getDecorView(),
textView);
// validate the text on the TextView
assertEquals("Text incorrect", "1http://www.vogella.com",
textView.getText().toString());
// press back and click again
this.sendKeys(KeyEvent.KEYCODE_BACK);
TouchUtils.clickView(this, view);
}
}
ただし、エラーが発生します:Java.lang.SecurityException:別のアプリケーションへの注入にはINJECT_EVENTS権限が必要です
com.example.myfirstapp2.test.MainActivityFunctionalTest.testStartSecondActivity(MainActivityFunctionalTest.Java:70)で
TouchUtils.clickView(this, view);
助けてください
私は同じ問題を抱えていて、私のコードは次のようなものでした(通常のログインアクティビティの場合):
onView(withId(R.id.username))
.perform(new TypeTextAction("test_user"));
onView(withId(R.id.password))
.perform(new TypeTextAction("test123"));
onView(withId(R.id.login)).perform(click());
最後の行はSecurityExceptionでクラッシュしていました。最後のテキスト入力後に判明したのは、キーボードが開いたままであるため、別のアプリケーションで次のクリックが考慮されたことです。
これを修正するには、入力後にキーボードを閉じる必要がありました。また、キーボードが閉じていることを確認するためにスリープを追加する必要がありました。そうしないと、テストが時々中断します。したがって、最終的なコードは次のようになりました。
onView(withId(R.id.username))
.perform(new TypeTextAction("test_user"));
onView(withId(R.id.password))
.perform(new TypeTextAction("test123")).perform(closeSoftKeyboard());
Thread.sleep(250);
onView(withId(R.id.login)).perform(click());
これはうまくいきました。
同じ問題があり、closeSoftKeyboard()メソッドを追加すると解決しました。
onView(withId(R.id.view)).perform(typeText(text_to_be_typed), closeSoftKeyboard());
これは、デバイスがロックされているか、他の開いているダイアログボックスが開いているか、ボタンをクリックするテストの機能を妨げている何かのためです。例えば。電話機がロックされている場合、テストがボタンをクリックしようとすると、デバイスがロックされているため、ロックできません。
「ランチャーがクラッシュしました」と常に表示されるため、エミュレータで問題が発生していました。そのため、ボタンをクリックしようとしたときはいつでも、警告ダイアログボックスが開いていたためにできませんでした。
要するに、画面のロックが解除されており、テストを妨げるメッセージボックスがないこと、ボタンをクリックできることを確認してください。
私はこの同じ問題に自分自身で直面していましたが、この問題について私が見つけたものがここにあります。
INJECT_EVENTS権限をアプリに追加すると、Android Studioは、そのような権限は「システムアプリにのみ付与されます」と指摘します。さらに、manifest.permissions状態については Googleのリファレンスガイド この許可は「サードパーティのアプリケーションによる使用ではない」ことです。
現在、私のアプリはシステムアプリではない可能性があります。したがって、この許可を追加することは間違いなく良いことではなく、幸いにもサードパーティのプロジェクトには適用されません。少なくともAndroid Studioで開発する場合。
SetUpメソッドで、setActivityInitialTouchMode(false);を呼び出したことがわかります GoogleのUIテストのベストプラクティス 、UIのテスト時には、タッチモードをtrueに設定する必要があります。そうしないと、テストフィクスチャがUI要素と対話できなくなります。
あともう一つだけ。これは、アプリでのユーザーアクションをエミュレートする自動テストです。デバイス(実際または仮想、重要ではありません)とやり取りする場合、他のものが(テスト対象のアプリ内でも)フォーカスを取得する可能性が高くなり、setUpメソッドのタッチモード設定と競合します行った。
最終的に、それは私に起こっていたことです。テストを実行しているデバイスをクリック/タッチ/操作しないことで問題を解決しました。
ルート化されたデバイスの場合、 このファイル は非常に役立ちました。持っています:
Injector.pressBackButton();
Injector.pressHomeButton();
Injector.pressPowerButton();
Injector.showNotificationCenter();
Injector.swipeLeftRight();
Injector.swipeRightLeft();
Injector.touch(x, y);
エスプレッソテストを実行したときに、まったく同じ問題とエラーメッセージが表示されました。それらの1つは、パッケージ全体を実行すると常に失敗しましたが、単独で実行すると常に失敗しました。興味深いのは、AndroidManifest.xmlのアクティビティの1つに次の行を追加したために問題が発生したことです。
Android:windowSoftInputMode="stateUnchanged|adjustResize"
上記の行を削除または変更した後:
Android:windowSoftInputMode="stateHidden"
パッケージ全体を実行するときにもテストが合格しました。