Me siento un poco incómodo por responder mi propia pregunta sobre recompensas, pero aquí está ...
He buscado alto y bajo sobre esto y no puedo creer que no haya una respuesta publicada en ninguna parte. Me he acercado mucho. Definitivamente puedo ejecutar pruebas que abarcan actividades ahora, pero mi implementación parece tener algunos problemas de sincronización donde las pruebas no siempre pasan de manera confiable. Este es el único ejemplo que conozco de pruebas exitosas en múltiples actividades. Con suerte, mi extracción y anonimización no introdujo errores. Esta es una prueba simplista en la que escribo un nombre de usuario y contraseña en una actividad de inicio de sesión, y luego observo que se muestra un mensaje de bienvenida adecuado en una actividad de "bienvenida" diferente:
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!"));
}
}
Obviamente, este código no es muy legible. De hecho, lo he extraído en una biblioteca simple con una API similar al inglés, así que puedo decir cosas como esta:
type("myUsername").intoThe(username_field);
click(login_button);
Probé a una profundidad de aproximadamente 4 actividades y estoy satisfecho de que el enfoque funcione, aunque, como dije, parece haber un problema de tiempo ocasional que no he descubierto por completo. Todavía estoy interesado en conocer otras formas de realizar pruebas en todas las actividades.