Создание и выполнение теста

Для того, чтобы убедиться, что нет никакой регрессии в разработке макета и функционального поведения в вашем приложении, важно создать тест для каждой Activity в вашем приложении. Для каждого теста, необходимо создать отдельные части, включающие в себя испытательный стенд, метода предварительных условий, и тестовые методы Activity . После этого можно запустить тест для получения отчета. Если какой-либо метод теста завершился ошибкой, это может указывать на потенциальный дефект в коде.

Примечание: В подходе Разработка через тестирование, вместо того чтобы в начале писать почти или весь код приложения, а затем выполняя тесты позже в цикле разработки, вы бы постепенно написали достаточно просто рабочий код, удовлетворяющий ваши тестовые зависимости, обновите тесты с учетом новых функциональных требований, и выполняйте итерации используя данный подход.

Создание теста

Activity тесты написаны в структурированном виде. Убедитесь в том, что ваши тесты лежат в отдельном пакете, отдельно тестируемого от кода.

В соответствии с соглашением, имя вашего тестового пакета должно совпадать тем же именем, что и пакет программы, с суффиксом ".tests". В созданном тестовом пакете, добавьте Java класс для вашего теста. В соответствии с соглашением, имя вашего теста должно также совпадать с именем Java или Android класса, который вы хотите проверить, но с суффиксом “Test”.

Для создания нового теста в Eclipse:

  1. В Package Explorer щелкните правой кнопкой мыши на /src каталоге тестового проекта и выберите New > Package.
  2. Установите Name поле в <your_app_package_name>.tests (например, com.example.android.testingfun.tests) и нажмите Finish.
  3. Щелкните правой кнопкой мыши на тестовом пакете, который вы создали, и выберите New > Class.
  4. Установите Name поле в <your_app_activity_name>Test (например, MyFirstTestActivityTest) и нажмите Finish.

Создайте свой испытательный стенд

Ипытательный стенд состоит из объектов, которые должны быть проинициализированы для запуска одного или нескольких тестов. Чтобы настроить испытательный стенд, можно переопределить методы setUp() и tearDown() в вашем тесте. Код запуска тестов автоматически вызывает setUp() перед выполнением всех методов теста, а tearDown() в конце выполнения каждого метода теста. Вы можете использовать эти методы, чтобы написать код для инициализации до и очищения после выполнения отдельных методов теста.

Чтобы настроить испытательный стенд в Eclipse:

  1. В Package Explorer, дважды щелкните на тесте, созданный ранее для вызова Java редактора Eclipse, а затем измените ваш класс теста расширения одиного из подклассов ActivityTestCase.

    Например:

    public class MyFirstTestActivityTest
            extends ActivityInstrumentationTestCase2<MyFirstTestActivity> {
    
  2. Затем добавьте конструктор и setUp() метод в ваш тест, а также добавьте объявления переменных для Activity , которую вы хотите проверить.

    Например:

    public class MyFirstTestActivityTest
            extends ActivityInstrumentationTestCase2<MyFirstTestActivity> {
    
        private MyFirstTestActivity mFirstTestActivity;
        private TextView mFirstTestText;
    
        public MyFirstTestActivityTest() {
            super(MyFirstTestActivity.class);
        }
    
        @Override
        protected void setUp() throws Exception {
            super.setUp();
            mFirstTestActivity = getActivity();
            mFirstTestText =
                    (TextView) mFirstTestActivity
                    .findViewById(R.id.my_first_test_text_view);
        }
    }
    

    Конструктор вызывается исполнителем тестов для создания экземпляра тестового класса, в то время как setUp() метод вызывается исполнителем тестов перед выполнением каждого теста в тестовом классе.

Как правило, в setUp() методе, вы должны:

  • Вызвать конструктор родительского класса для setUp(), которая необходима для JUnit.
  • Инициализировать состояние тестового стенда следующим образом:
    • Определите переменные экземпляра, которые хранят состояние стенда.
    • Создайте и храните ссылку на экземпляр Activity в тесте.
    • Получите ссылку на любые компоненты пользовательского интерфейса в Activity , которую вы хотите проверить.

Вы можете использовать getActivity() метод для получения ссылки на Activity в тесте.

Добавьте предварительные условия

В качестве проверки разумности, хорошая практика убедиться, что тест был настроен правильно, и объекты, которые вы хотите проверить были правильно созданы или инициализированы. Таким образом, вы не будете видеть проваленных тестов из-за того, что что-то было не так с настройкой вашего теста. По соглашению, метод проверки называется testPreconditions().

Например, вы можете добавить testPreconditons() метод как этот в ваш тест:

public void testPreconditions() {
    assertNotNull(“mFirstTestActivity is null”, mFirstTestActivity);
    assertNotNull(“mFirstTestText is null”, mFirstTestText);
}

Методы проверки реализованы в классе JUnit Assert . Как правило, вы можете использовать их для проверки является ли конкретное условие, которое вы хотите проверить, истинным.

  • Если условие ложно, то метод бросает AssertionFailedError исключение, которое затем, как правило, сообщается исполнителем тестов. Вы можете предоставить строку в первом аргументе вашего проверочного метода, что бы предоставить некоторые контекстные детали на случай, если утверждение не выполнится.
  • Если условие истинно, тест пройден.

В обоих случаях, тестирование переходит на выполнение других методов в тестовом классе.

Добавьте тестовые методы для проверки вашей активности

Теперь добавьте один или несколько тестовых методов для проверки макета и функционального поведение вашей Activity.

Например, если ваш Activity включает в себя TextView, вы можете добавить тестовый метод как этот, чтобы проверить, что он имеет правильный текст метки:

public void testMyFirstTestTextView_labelText() {
    final String expected =
            mFirstTestActivity.getString(R.string.my_first_test);
    final String actual = mFirstTestText.getText().toString();
    assertEquals(expected, actual);
}

testMyFirstTestTextView_labelText() метод просто проверяет, что текст по умолчанию TextView который установлен на макете является таким же как ожидаемый тест, определенный в strings.xml ресурсе.

Примечание: При выборе названия тестовых методов, вы можете использовать символ подчеркивания для отделения того что испытывается от конкретного испытания. Этот стиль позволяет легче увидеть какой тестовый случай проходит испытание.

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

Для выполнения сравнения, положите как ожидаемую так и фактическую строку в качестве аргументов assertEquals() метода. Если значения не совпадают, то метод будет бросать AssertionFailedError исключение.

Если вы добавили testPreconditions() метод, положить ваши методы испытаний после testPreconditions() определение в Java классе.

Для просмотра завершенного примера теста, взгляните на MyFirstTestActivityTest.java в примере приложения.

Соберите и запустите тест

Вы можете собрать и запустить тест легко из Package Explorer в Eclipse.

Чтобы собрать и запустить тест:

  1. Подключите Android устройство к машине. На устройстве или эмуляторе, откройте меню Настройки , выберите Для разработчиков и убедитесь, что отладка через USB включена.
  2. В окне Project Explorer щелкните правой кнопкой мыши на тестовом классе, который вы создали ранее, и выберите Run As > Android Junit Test.
  3. В диалоговом окне выбора Android устройства, выберите устройство, которое вы только что подключили, а затем нажмите OK.
  4. В окне JUnit, убедитесь, что тест пройден без ошибок или сбоев.

Например, если тест проходит без ошибок, то результат должен выглядеть следующим образом:

Рисунок 1. Результат теста без ошибок.