Я чувствую себя немного неловко, отвечая на мой собственный вопрос о вознаграждении, но вот он ...
Я искал все это, но не могу поверить, что нигде не опубликовано ни одного ответа. Я подошел очень близко. Я определенно могу запускать тесты, которые охватывают действия сейчас, но моя реализация, похоже, имеет некоторые временные проблемы, когда тесты не всегда проходят надежно. Это единственный известный мне пример того, как успешно проходят испытания по нескольким действиям. Надеюсь, мое извлечение и анонимизация не привели к ошибкам. Это упрощенный тест, в котором я ввожу имя пользователя и пароль в действие входа в систему, а затем наблюдаю, как на другом «приветствии» отображается правильное приветственное сообщение:
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();
// Register we are interested in the authentication activiry...
Instrumentation.ActivityMonitor monitor = instrumentation.addMonitor(AuthenticateActivity.class.getName(), null, false);
// Start the authentication activity as the first activity...
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setClassName(instrumentation.getTargetContext(), AuthenticateActivity.class.getName());
instrumentation.startActivitySync(intent);
// Wait for it to start...
Activity currentActivity = getInstrumentation().waitForMonitorWithTimeout(monitor, 5);
assertThat(currentActivity, is(notNullValue()));
// Type into the username field...
View currentView = currentActivity.findViewById(username_field);
assertThat(currentView, is(notNullValue()));
assertThat(currentView, instanceOf(EditText.class));
TouchUtils.clickView(this, currentView);
instrumentation.sendStringSync("MyUsername");
// Type into the password field...
currentView = currentActivity.findViewById(password_field);
assertThat(currentView, is(notNullValue()));
assertThat(currentView, instanceOf(EditText.class));
TouchUtils.clickView(this, currentView);
instrumentation.sendStringSync("MyPassword");
// Register we are interested in the welcome activity...
// this has to be done before we do something that will send us to that
// activity...
instrumentation.removeMonitor(monitor);
monitor = instrumentation.addMonitor(WelcomeActivity.class.getName(), null, false);
// Click the login button...
currentView = currentActivity.findViewById(login_button;
assertThat(currentView, is(notNullValue()));
assertThat(currentView, instanceOf(Button.class));
TouchUtils.clickView(this, currentView);
// Wait for the welcome page to start...
currentActivity = getInstrumentation().waitForMonitorWithTimeout(monitor, 5);
assertThat(currentActivity, is(notNullValue()));
// Make sure we are logged in...
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 упражнениях и удовлетворен тем, что подход работает, хотя, как я уже сказал, иногда возникает проблема с выбором времени, которую я до конца не выяснил. Я все еще заинтересован в том, чтобы услышать о любых других способах тестирования в разных видах деятельности.