Как я могу получить представление по id в моих тестах эспрессо? - PullRequest
0 голосов
/ 14 июня 2019

Я не понимаю, как я могу получить представление с экрана в моих тестах эспрессо с findViewById.

Я иду на один из экранов в моем приложении с автоматическим тестированием эспрессо, и затем я хочу проверить правильность экрана. Для этого мне нужно получить панель инструментов с экрана и проверить некоторые его свойства. Сначала я попытался сделать это с ViewInteractions объектами, но я могу привести его к представлению и не могу получить доступ к свойствам объекта.

Я хочу использовать findViewById для прямого просмотра, но я понимаю, как правильно его использовать.

public void goToMyOrders (){
        BottomTabBar bottomTabBar = new BottomTabBar();
        bottomTabBar.profileButton.perform(click());
        myOrderButton.perform(click());
        ViewInteraction toolbarView = onView(allOf(withId(R.id.custom_font_toolbar)));
        toolbarView.getContext();
        toolbarView.check(matches(withText("Мои заказы")));
    }

Ответы [ 2 ]

0 голосов
/ 15 июня 2019

вы можете использовать ViewAction, чтобы получить представление по findviewbyId в дополнение к ViewInteraction.

Для YourCase это будет выглядеть так:

Public View getView(int Rid) {
   onView(allOf(withId(Rid))).perform(new ViewAction() {
        @Override
        public Matcher<View> getConstraints() {
            return isAssignableFrom(TextView.class);
        }

        @Override
        public String getDescription() {
            return "getting text from a TextView"; 
        }

        @Override
        public void perform(UiController uiController, View view) {
            TextView tv = (TextView) view; 
        }
    });
    return tv
}

Примечание: я использовал textview в качестве ограничения, если для textview. Вы можете использовать другие ограничения также из ViewMatchers

0 голосов
/ 14 июня 2019

Нет, я думаю, что вы поняли, что тестирование немного не так. Во-первых, Toolbar не расширяет / не наследует TextView, поэтому у него не может быть текста, но вы можете поместить TextView внутри Toolbar. Я подготовил простой код, чтобы показать вам идею автоматизированных тестов с использованием Espresso.

Создайте новый образец приложения, поместите этот макет в activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

<Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintHeight_percent="0.3"
        app:layout_constraintTop_toTopOf="parent"
        android:background="@color/colorAccent"/>

<TextView
        android:id="@+id/textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="@id/toolbar"
        app:layout_constraintBottom_toBottomOf="@id/toolbar"
        app:layout_constraintLeft_toLeftOf="@id/toolbar"
        app:layout_constraintRight_toRightOf="@id/toolbar"
        android:text="SomeTextBeforeChange"
        android:textColor="#FFFFFF"/>

<Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@id/toolbar"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:text="Change text after click"/>

в вашем MainActivity:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button button = findViewById(R.id.button);
    final TextView textView = findViewById(R.id.textview);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            textView.setText("Changed text");
        }
    });
}

}

Как вы видите, может быть похожим View на ваши - Toolbar, TextView и Button, что изменяет текст TextView.

Давайте сделаем автоматический тест, используя Espresso.

  1. В подпапке androidTest создайте новый класс, назовите его, например, MainActivityTest.

  2. Определите ActivityTestRule. Читайте об этом в Android документах Вам также могут понадобиться эти Gradle зависимости:

    androidTestImplementation 'com.android.support.test:runner:1.0.2'<br> androidTestImplementation 'com.android.support.test:rules:1.0.2'<br> androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

    Правило:
    @Rule public ActivityTestRule<MainActivity> rule = new ActivityTestRule<> (MainActivity.class);

    Затем определите открытый метод с типом возврата void, аннотированным @Test. Внутри этого метода вы можете определить свой TextView, вызвав Espresso.onView(ViewMatchers.withId(your.textview.id));

Чтобы проверить, содержит ли он указанный текст, необходимо вызвать `textview.check (ViewAssertions.matches (ViewMatchers.withText (" ожидаемый текст ")));

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

public class MainActivityTest {

@Rule
public ActivityTestRule<MainActivity> rule = new ActivityTestRule<>(MainActivity.class);

@Test
public void checkIfButtonChangesText(){
    // TextView
    ViewInteraction textView = Espresso.onView(ViewMatchers.withId(R.id.textview));
    // Button
    ViewInteraction button = Espresso.onView(ViewMatchers.withId(R.id.button));

    //check if TextView contains text: "SomeTextBeforeChange"
    textView.check(ViewAssertions.matches(ViewMatchers.withText("SomeTextBeforeChange")));

    // analogically with Button, text: "Change text after click"
    button.check(ViewAssertions.matches(ViewMatchers.withText("Change text after click")));

    // perform button click:
    button.perform(ViewActions.click());

    //Check if text has been changed to "Changed text"
    textView.check(ViewAssertions.matches(ViewMatchers.withText("Changed text")));

}

}
...