2013-12-06 3 views

ответ

32

Да, это возможно. В одном из образцов они предназначались это здесь https://github.com/googlesamples/android-testing/blob/master/ui/espresso/BasicSample/app/src/androidTest/java/com/example/android/testing/espresso/BasicSample/ChangeTextBehaviorTest.java

@Test 
public void changeText_newActivity() { 
    // Type text and then press the button. 
    onView(withId(R.id.editTextUserInput)).perform(typeText(STRING_TO_BE_TYPED), 
      closeSoftKeyboard()); 
    onView(withId(R.id.activityChangeTextBtn)).perform(click()); 

    // This view is in a different Activity, no need to tell Espresso. 
    onView(withId(R.id.show_text_view)).check(matches(withText(STRING_TO_BE_TYPED))); 
} 

Читать встроенный комментарий.

В ожидании новой активности, которую необходимо загрузить, Espresso не подразумевает.

+0

Возможно ли это сейчас? с Espresso 2. У меня есть какое-то приложение вроде этого, когда пользователь нажимает на файл, который он перемещает на другое действие, и мне нужно проверить этот интерфейс. Есть идеи? – AQU

+1

@AQU Я долгое время не работал с 'Espresso'. Я рекомендую ознакомиться с примерами Espresso 2. –

+0

Yaa, теперь он работает для меня. Я могу делать все, что хочу. – AQU

9

Настоятельно можно написать тест Espresso (или любой измерительный прибор), который пересекает несколько видов деятельности. Вы должны начать с одного действия, но можете перемещаться по пользовательскому интерфейсу своего приложения в другие действия. Единственное предостережение - из-за ограничений безопасности тестовый поток должен оставаться в процессе вашего приложения.

+0

Как утверждать, что как только я нажал на виджет, открылась правильная активность? – Bolhoso

+6

Как и пользователь приложения, утверждается, что отображается конкретный вид из этого действия. – ValeraZakharov

8

Я проверил это, как:

onView(withId(R.id.hello_visitor)).perform(click()); 
pressBack(); 
onView(withId(R.id.hello_visitor)).check(matches(isDisplayed())); //fails here 

Действие мыши начинает новый вид деятельности, очевидно.

+0

Возможно, это слишком быстро, и вам нужно дождаться активности. – dnkoutso

6

Допустим, у вас есть два вида деятельности: HomeActivity и SearchResultsActivity. Для теста вы хотите сделать некоторые действия в HomeActivity и проверить результат на SearchResultsActivity. Тогда тест будет записан, как показано ниже:

public class SearchTest extends ActivityInstrumentationTestCase2<HomeActivity> { 

    public SearchTest() { 
     super(HomeActivity.class); 
    } 

    protected void setUp() throws Exception { 
     super.setUp(); 
     getActivity(); // launch HomeActivity 
    } 

    protected void tearDown() throws Exception { 
     super.tearDown(); 
    } 

    public void testSearch() { 
     onView(withId(R.id.edit_text_search_input)).perform(typeText("Hello World")); 
     onView(withId(R.id.button_search)).perform(click()); 
     // at this point, another activity SearchResultsActivity is started 
     onView(withId(R.id.text_view_search_result)).check(matches(withText(containsString("Hello World")))); 
    } 

} 

Так что единственное, что вам нужно заботиться, что вы должны проходит тест-класс от ActivityInstrumentationTestCase2 < FirstActivity>, и вызвать супер (FirstActivity .class) в вашем конструкторе.

Вышеприведенный пример довольно прост.

Advance пример (когда startActivityForResult бывает):

Иногда это действительно заблуждение, чтобы написать тест, в котором все еще есть два задания А и В, а также применение потока отличается от указанного выше:

  1. пользователь ничего не делает в деятельности A, но активность A вызывает startActivityForResult для запуска активности B;
  2. затем пользователь вносит некоторые входы и нажимает на активность B (эта часть является реальным тестом);
  3. Наконец, активность B завершается, она вызывает setResult и возобновляет активность A (здесь вы должны проверить результат).

Даже если все испытания часть происходит на активности B, вы можете просто нужно проверить один маленький кусочек на активности А, но ваш тест должен простираться от ActivityInstrumentationTestCase2 < ActivityWhoCallsStartActivityForResult> который является деятельность A, но не деятельность B. В противном случае, когда тестовая часть будет выполнена, активность A не будет возобновлена, у вас нет шансов проверить ваш результат.

Смежные вопросы