Es ist mir ein bisschen unangenehm, meine eigene Kopfgeldfrage zu beantworten, aber hier ist es ...
Ich habe hoch und niedrig gesucht und kann nicht glauben, dass nirgendwo eine Antwort veröffentlicht wird. Ich bin sehr nahe gekommen. Ich kann jetzt definitiv Tests ausführen, die sich über Aktivitäten erstrecken, aber meine Implementierung scheint einige Zeitprobleme zu haben, bei denen die Tests nicht immer zuverlässig bestehen. Dies ist das einzige mir bekannte Beispiel für Tests, die mehrere Aktivitäten erfolgreich durchführen. Hoffentlich hat meine Extraktion und Anonymisierung keine Fehler verursacht. Dies ist ein vereinfachter Test, bei dem ich einen Benutzernamen und ein Kennwort in eine Anmeldeaktivität eingebe und dann beobachte, dass bei einer anderen "Willkommen" -Aktivität eine ordnungsgemäße Begrüßungsnachricht angezeigt wird:
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!"));
}
}
Dieser Code ist offensichtlich nicht sehr lesbar. Ich habe es tatsächlich in eine einfache Bibliothek mit einer englischsprachigen API extrahiert, sodass ich einfach Folgendes sagen kann:
type("myUsername").intoThe(username_field);
click(login_button);
Ich habe bis zu einer Tiefe von ungefähr 4 Aktivitäten getestet und bin zufrieden, dass der Ansatz funktioniert, obwohl es, wie gesagt, gelegentlich ein Timing-Problem gibt, das ich nicht vollständig herausgefunden habe. Ich bin immer noch daran interessiert, von anderen Testmethoden für verschiedene Aktivitäten zu hören.