Как вы тестируете приложение для Android в нескольких видах деятельности? - PullRequest
79 голосов
/ 19 ноября 2009

Мы создаем сложное приложение для Android, состоящее из множества экранов и рабочих процессов, распределенных по многим видам деятельности. Наши рабочие процессы аналогичны тем, которые вы можете видеть на банкомате Банка, например, для входа в систему Activity происходит переход в главное меню Activity, которое может переходить к другим действиям в зависимости от выбора пользователя.

Поскольку у нас так много рабочих процессов, нам необходимо создать автоматические тесты, которые охватывают несколько действий, чтобы мы могли тестировать рабочий процесс от начала до конца. Например, используя пример банкомата, мы хотели бы ввести действительный PIN-код, проверить, что отправляет нас в главное меню, выбрать снятие наличных, убедиться, что мы находимся на экране снятия наличных и т. Д., И т. Д., И в конечном итоге окажемся вернуться в главное меню или «выйти».

Мы поиграли с тестовыми API, которые поставляются с Android (например, ActivityInstrumentationTestCase2), а также с Positron , но ни один из них не способен к тестированию за пределами одного Activity, и хотя в этих инструментах мы можем найти некоторую полезность для некоторых модульных тестов, они не будут соответствовать нашим потребностям в сценариях тестирования, которые охватывают несколько видов деятельности.

Мы открыты для платформы xUnit, создания сценариев, записи / воспроизведения графического интерфейса пользователя и т. Д. И будем благодарны за любые советы.

Ответы [ 14 ]

0 голосов
/ 30 марта 2015

Этот ответ основан на принятом ответе, но изменен для решения проблемы синхронизации, которая для меня стала последовательной после добавления примерно полдюжины тестов. @ pajato1 получает кредит за решение проблемы времени, как указано в принятых комментариях к ответу.

/**
 * Creates a test Activity for a given fully qualified test class name.
 *
 * @param fullyQualifiedClassName The fully qualified name of test activity class.
 *
 * @return The test activity object or null if it could not be located.
 */
protected AbstractTestActivity getTestActivity(final String fullyQualifiedClassName) {
    AbstractTestActivity result = null;

    // Register our interest in the given activity and start it.
    Log.d(TAG, String.format("Running test (%s) with main class: %s.", getName(), fullyQualifiedClassName));
    instrumentation = getInstrumentation();

    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setClassName(instrumentation.getTargetContext(), fullyQualifiedClassName);
    // Wait for the activity to finish starting
    Activity activity = instrumentation.startActivitySync(intent);

    // Perform basic sanity checks.
    assertTrue("The activity is null!  Aborting.", activity != null);
    String format = "The test activity is of the wrong type (%s).";
    assertTrue(String.format(format, activity.getClass().getName()), activity.getClass().getName().equals(fullyQualifiedClassName));
    result = (AbstractTestActivity) activity;

    return result;
}
0 голосов
/ 07 апреля 2011

Будет ли принятый подход работать с разными видами деятельности из разных приложений, подписанными разными сертификатами? Если нет, то Robotium - лучший способ проверить действия в одном приложении.

0 голосов
/ 08 декабря 2009

Есть еще один способ сделать несколько действий, используя класс ActivityInstrumentation. Это нормальный сценарий автоматизации ... Сначала сфокусируйтесь на объекте, который вы хотите, а затем отправьте ключ Просто как тот пример кода

button.requestFocus();
sendKeys(KeyEvent.KEYCODE_ENTER);

Единственное, что понимание того, что каждый вызов API поможет нам.

0 голосов
/ 20 ноября 2009

Лично я не использовал его, но ApplicationTestCase выглядит так, как будто вы ищете.

...