私自身の賞金の質問に答えるのは少し厄介ですが、ここにあります...
私はこれを高低で検索しましたが、どこにも回答が公開されていないなんて信じられません。とても近づきました。今は間違いなくアクティビティにまたがるテストを実行できますが、私の実装には、テストが常に確実に合格するとは限らないタイミングの問題があるようです。これは、複数のアクティビティにわたるテストが成功したことを私が知っている唯一の例です。うまくいけば、それを抽出して匿名化してもエラーが発生しませんでした。これは、ログインアクティビティにユーザー名とパスワードを入力し、別の「ウェルカム」アクティビティに適切なウェルカムメッセージが表示されることを確認する単純なテストです。
package com.mycompany;
import android.app.*;
import android.content.*;
import android.test.*;
import android.test.suitebuilder.annotation.*;
import android.util.*;
import android.view.*;
import android.widget.*;
import static org.hamcrest.core.Is.*;
import static org.hamcrest.core.IsNull.*;
import static org.hamcrest.core.IsInstanceOf.instanceOf;
import static org.junit.Assert.*;
import static com.mycompany.R.id.*;
public class LoginTests extends InstrumentationTestCase {
@MediumTest
public void testAValidUserCanLogIn() {
Instrumentation instrumentation = getInstrumentation();
Instrumentation.ActivityMonitor monitor = instrumentation.addMonitor(AuthenticateActivity.class.getName(), null, false);
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setClassName(instrumentation.getTargetContext(), AuthenticateActivity.class.getName());
instrumentation.startActivitySync(intent);
Activity currentActivity = getInstrumentation().waitForMonitorWithTimeout(monitor, 5);
assertThat(currentActivity, is(notNullValue()));
View currentView = currentActivity.findViewById(username_field);
assertThat(currentView, is(notNullValue()));
assertThat(currentView, instanceOf(EditText.class));
TouchUtils.clickView(this, currentView);
instrumentation.sendStringSync("MyUsername");
currentView = currentActivity.findViewById(password_field);
assertThat(currentView, is(notNullValue()));
assertThat(currentView, instanceOf(EditText.class));
TouchUtils.clickView(this, currentView);
instrumentation.sendStringSync("MyPassword");
instrumentation.removeMonitor(monitor);
monitor = instrumentation.addMonitor(WelcomeActivity.class.getName(), null, false);
currentView = currentActivity.findViewById(login_button;
assertThat(currentView, is(notNullValue()));
assertThat(currentView, instanceOf(Button.class));
TouchUtils.clickView(this, currentView);
currentActivity = getInstrumentation().waitForMonitorWithTimeout(monitor, 5);
assertThat(currentActivity, is(notNullValue()));
currentView = currentActivity.findViewById(welcome_message);
assertThat(currentView, is(notNullValue()));
assertThat(currentView, instanceOf(TextView.class));
assertThat(((TextView)currentView).getText().toString(), is("Welcome, MyUsername!"));
}
}
このコードは明らかにあまり読みにくいです。私は実際にそれを英語のようなAPIを備えた単純なライブラリに抽出したので、次のように言うことができます。
type("myUsername").intoThe(username_field);
click(login_button);
私は約4つのアクティビティの深さまでテストし、アプローチが機能することに満足していますが、私が言ったように、私が完全に理解していない時折のタイミングの問題があるようです。私はまだ、活動全体でテストする他の方法を聞くことに興味があります。