Czuję się trochę niezręcznie, odpowiadając na moje własne pytanie o nagrodę, ale oto jest ...
Szukałem tego wysoko i nisko i nie mogę uwierzyć, że nigdzie nie ma opublikowanej odpowiedzi. Podszedłem bardzo blisko. Zdecydowanie mogę teraz uruchamiać testy, które obejmują działania, ale wydaje się, że w mojej implementacji występują pewne problemy z synchronizacją, przez co testy nie zawsze kończą się rzetelnie. To jedyny znany mi przykład tego, że pomyślnie testuje wiele działań. Miejmy nadzieję, że moje wyodrębnienie i anonimizacja tego nie spowodowało błędów. To jest uproszczony test, w którym wpisuję nazwę użytkownika i hasło w czynności logowania, a następnie obserwuję, jak odpowiedni komunikat powitalny jest wyświetlany w innym działaniu „powitalnym”:
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!"));
}
}
Ten kod jest oczywiście niezbyt czytelny. Właściwie rozpakowałem go do prostej biblioteki z interfejsem API podobnym do angielskiego, więc mogę po prostu powiedzieć takie rzeczy:
type("myUsername").intoThe(username_field);
click(login_button);
Przetestowałem do głębokości około 4 czynności i jestem zadowolony, że to podejście działa, chociaż, jak powiedziałem, wydaje się, że czasami występuje problem z synchronizacją, którego nie do końca rozgryzłem. Nadal jestem zainteresowany innymi sposobami testowania różnych działań.