如何在我的浓缩咖啡测试中通过 id 查看?

Posted

技术标签:

【中文标题】如何在我的浓缩咖啡测试中通过 id 查看?【英文标题】:How I can get view by id in my espresso tests? 【发布时间】:2019-06-14 10:00:06 【问题描述】:

我不明白如何在使用 findViewById. 进行浓缩咖啡测试时从屏幕上看到视图

我将使用 espresso 自动测试进入我的应用中的某个屏幕,然后我想检查屏幕是否正确。为此,我需要从屏幕上获取工具栏并检查他的一些属性。 首先,我尝试使用 ViewInteractions 对象来实现这一点,但我可以将其转换为 View 并且无法访问对象属性。

我想使用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("Мои заказы")));
    

【问题讨论】:

【参考方案1】:

不,我认为您对测试的想法有点错误。首先,Toolbar 不扩展/继承TextView,所以它不能有文本,但你可以在Toolbar 中放置一个TextView。我准备了简单的代码来向您展示使用 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_
    android:layout_
    tools:context=".MainActivity">

<Toolbar
        android:id="@+id/toolbar"
        android:layout_
        android:layout_
        app:layout_constraintHeight_percent="0.3"
        app:layout_constraintTop_toTopOf="parent"
        android:background="@color/colorAccent"/>

<TextView
        android:id="@+id/textview"
        android:layout_
        android:layout_
        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_
        android:layout_
        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 类似 - ToolbarTextViewButton 会更改 TextView 的文本。

现在让我们使用Espresso 进行自动化测试。

    在您的 androidTest 子文件夹中创建一个新类,将其命名为 MainActivityTest

    定义一个ActivityTestRule。在Android docs 中了解它 您可能还需要那些 Gradle 依赖项:

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

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

    然后定义一个返回类型为 void 的公共方法,用 @Test 注释。 在此方法中,您可以通过调用 Espresso.onView(ViewMatchers.withId(your.textview.id)); 来定义您的 TextView

要检查它是否包含指定的文本,您需要调用 `textview.check(ViewAssertions.matches(ViewMatchers.withText("expected text")));

我不会解释这些方法的具体作用,因为它们的名字不言自明,但如果您在理解它们时遇到了一些困难,您可以在 *** 上获得大量资源。对于我上面的代码,我写了以下简单的测试,所以你可以根据需要分析:

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")));




【讨论】:

【参考方案2】:

除了 ViewInteraction 之外,您还可以使用 ViewAction 通过 findviewbyId 获取视图。

对于 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 中的其他约束

【讨论】:

以上是关于如何在我的浓缩咖啡测试中通过 id 查看?的主要内容,如果未能解决你的问题,请参考以下文章

带有“hasBackground”的浓缩咖啡测试

意式浓缩咖啡测试时,Android 设备不会在屏幕上启动活动

勺子和浓缩咖啡测试

浓缩咖啡测试失败,进度对话框未从顶部删除

我想针对特定的构建类型运行单元测试和浓缩咖啡测试用例

带有 AsyncTask 的浓缩咖啡