如何在我的浓缩咖啡测试中通过 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
类似 - Toolbar
、TextView
和 Button
会更改 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 查看?的主要内容,如果未能解决你的问题,请参考以下文章