仅当满足特定条件时,如何测试新 Activity 的 UI?
How do I test the UI of a new Activity only if certain condition is met?
假设我有一个带有输入字段和按钮的应用程序。当用户输入正确的数字并按下按钮时,我创建了一个新的 Activity 。我如何使用 Espresso 测试是否触发了正确的意图以及新 Activity 中的所有内容是否就位?
我了解到你有一个 EditText 和一个 Button,当用户点击按钮时,你将开始一个新的 activity 只要编辑文本中的文本等于特定文本。
这是一个完整的工作代码和解释:
activity_home.xml
假设同时具有 Button 和 EditText 的 activity 是 HomeActivity
创建如下布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_home"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<EditText
android:id="@+id/edit_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Go" />
</LinearLayout>
HomeActivity.java
创建您的 java activity 实现您的逻辑如下:
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class HomeActivity extends AppCompatActivity {
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
editText = (EditText)findViewById(R.id.edit_text);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String text = editText.getText().toString();
if (text.equals("1")) {
Intent intent = new Intent(HomeActivity.this, ThirdActivity.class);
startActivity(intent);
}
}
});
}
}
请注意,我在这里只是检查文本是否等于 1 然后我开始一个新的 activity,我称之为 ThirdActivity
HomeActivityText.java
在您的 androidTest 文件夹中创建一个名为 class 的 HomeActivityText
import android.app.Activity;
import android.support.test.InstrumentationRegistry;
import android.support.test.espresso.Espresso;
import android.support.test.espresso.action.ViewActions;
import android.support.test.espresso.matcher.ViewMatchers;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.support.test.runner.lifecycle.ActivityLifecycleMonitorRegistry;
import android.support.test.runner.lifecycle.Stage;
import junit.framework.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.Collection;
@RunWith(AndroidJUnit4.class)
public class HomeActivityTest {
@Rule
public ActivityTestRule<HomeActivity> mActivityRule =
new ActivityTestRule<>(HomeActivity.class);
@Test
public void testHappyScenario() {
Espresso.onView(ViewMatchers.withId(R.id.edit_text)).perform(ViewActions.typeText("1"));
Espresso.onView(ViewMatchers.withId(R.id.button)).perform(ViewActions.click());
Assert.assertEquals(getActivityInstance().getClass(), ThirdActivity.class);
}
private Activity getActivityInstance() {
final Activity[] currentActivity = {null};
InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
public void run() {
Collection resumedActivities = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED);
if (resumedActivities.iterator().hasNext()) {
currentActivity[0] = (Activity) resumedActivities.iterator().next();
}
}
});
return currentActivity[0];
}
}
当您输入 1 作为编辑文本的值时,测试将通过,否则将失败。
单元测试的代码模拟了快乐的场景,在这个场景中,您将值 1 设置为编辑文本,然后单击按钮,然后检查是否有新的 activity 已开始
请注意,我开发了一个函数来检索设备中显示的最后一个 activity,并将其 class 与预期的 ThirdActivity class
进行比较
有什么不明白的可以告诉我吗?
假设我有一个带有输入字段和按钮的应用程序。当用户输入正确的数字并按下按钮时,我创建了一个新的 Activity 。我如何使用 Espresso 测试是否触发了正确的意图以及新 Activity 中的所有内容是否就位?
我了解到你有一个 EditText 和一个 Button,当用户点击按钮时,你将开始一个新的 activity 只要编辑文本中的文本等于特定文本。
这是一个完整的工作代码和解释:
activity_home.xml
假设同时具有 Button 和 EditText 的 activity 是 HomeActivity
创建如下布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_home"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<EditText
android:id="@+id/edit_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Go" />
</LinearLayout>
HomeActivity.java
创建您的 java activity 实现您的逻辑如下:
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class HomeActivity extends AppCompatActivity {
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
editText = (EditText)findViewById(R.id.edit_text);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String text = editText.getText().toString();
if (text.equals("1")) {
Intent intent = new Intent(HomeActivity.this, ThirdActivity.class);
startActivity(intent);
}
}
});
}
}
请注意,我在这里只是检查文本是否等于 1 然后我开始一个新的 activity,我称之为 ThirdActivity
HomeActivityText.java
在您的 androidTest 文件夹中创建一个名为 class 的 HomeActivityText
import android.app.Activity;
import android.support.test.InstrumentationRegistry;
import android.support.test.espresso.Espresso;
import android.support.test.espresso.action.ViewActions;
import android.support.test.espresso.matcher.ViewMatchers;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.support.test.runner.lifecycle.ActivityLifecycleMonitorRegistry;
import android.support.test.runner.lifecycle.Stage;
import junit.framework.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.Collection;
@RunWith(AndroidJUnit4.class)
public class HomeActivityTest {
@Rule
public ActivityTestRule<HomeActivity> mActivityRule =
new ActivityTestRule<>(HomeActivity.class);
@Test
public void testHappyScenario() {
Espresso.onView(ViewMatchers.withId(R.id.edit_text)).perform(ViewActions.typeText("1"));
Espresso.onView(ViewMatchers.withId(R.id.button)).perform(ViewActions.click());
Assert.assertEquals(getActivityInstance().getClass(), ThirdActivity.class);
}
private Activity getActivityInstance() {
final Activity[] currentActivity = {null};
InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
public void run() {
Collection resumedActivities = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED);
if (resumedActivities.iterator().hasNext()) {
currentActivity[0] = (Activity) resumedActivities.iterator().next();
}
}
});
return currentActivity[0];
}
}
当您输入 1 作为编辑文本的值时,测试将通过,否则将失败。
单元测试的代码模拟了快乐的场景,在这个场景中,您将值 1 设置为编辑文本,然后单击按钮,然后检查是否有新的 activity 已开始
请注意,我开发了一个函数来检索设备中显示的最后一个 activity,并将其 class 与预期的 ThirdActivity class
进行比较有什么不明白的可以告诉我吗?