【发布时间】:2018-01-25 23:31:49
【问题描述】:
我想做一个简单的 UI 测试,按下一个按钮并启动一个活动。
我已经尝试基于this documentation.(安卓开发者)
SplashActivity 代码:
public class SplashActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
findViewById(R.id.launch_register_activity_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(SplashActivity.this, RegisterActivity.class);
startActivity(intent);
}
});
}
}
测试代码:
@RunWith(AndroidJUnit4.class)
public class SimpleIntentTest {
@Rule
public IntentsTestRule<SplashActivity> intentsRule = new IntentsTestRule<>(SplashActivity.class);
@Test
public void newActivityLaunchingTest() {
onView(withId(R.id.launch_register_activity_btn)).perform(click());
Log.i("register-package_name", RegisterActivity.class.getPackage().toString());
Log.i("register-class_name", RegisterActivity.class.getName());
Log.i("register-short_name", RegisterActivity.class.getSimpleName());
intended(allOf(
hasComponent(hasShortClassName(".RegisterActivity")),
toPackage("re.example.common")
));
}
}
Logcat:
01-22 13:37:51.615: I/register-package_name(25292): package re.example.common, Unknown, version 0.0
01-22 13:37:51.615: I/register-class_name(25292): re.example.common.RegisterActivity
01-22 13:37:51.615: I/register-short_name(25292): RegisterActivity
包结构:
测试输出:
android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: Wanted to match 1 intents. Actually matched 0 intents.
IntentMatcher: (has component: has component with: class name: an instance of java.lang.String package name: an instance of java.lang.String short class name: is ".RegisterActivity" and resolvesTo: re.example.common)
Matched intents:[]
无论我如何尝试,测试都无法验证我是否启动了 RegisterActivity。测试失败。
据我所知,我在上面链接中的浓缩咖啡测试示例中所做的完全一样。
我做错了什么?
我也试过了:
1.删除 . (点)来自“.RegisterActivity”
intended(allOf(
hasComponent(hasShortClassName("RegisterActivity")),
toPackage("re.example.common")
));
2。删除 . (点)来自 ".RegisterActivity" 和 toPackage("re.example.common")
intended(allOf(
hasComponent(hasShortClassName("RegisterActivity"))
));
我的 RegisterActivity 的包名称是 “re.example.common.RegisterActivity”。 短名称是“RegisterActivity”。不是吗?
为什么测试失败了?
这里发生了什么,我有什么误解或误解?
提前致谢。
【问题讨论】:
-
Matched intents:[]发生的事实表明 espresso 根本没有记录任何意图。您是否尝试过延迟以排除 ui-thread 同步,只是为了测试理论?还有一个愚蠢的问题——如果手动测试,按钮真的有效吗?最后一个问题是你在运行什么操作系统? -
@Be_Negative 推杆延迟应该是不必要的。 espresso 的核心功能之一是您不必在任何地方延迟。 (我按照文档的建议禁用了所有动画)我已经手动测试过它并且它可以工作,我正在测试我的真实设备,小米 Mi A1,Android 8.0
-
您在测试输出中没有 Recorded Intents 部分(您可以将该部分附加到您的问题中吗?)您是否尝试在这些匹配器上单独匹配?还要确保您没有使用前缀、后缀等更改构建文件中应用程序的实际包名称。
-
@AdamVarhegyi 这就是为什么我说“只是为了检验理论”。好的,我的最后一个 - 你可以尝试在 26 以下的 api 上运行相同的代码吗?有一个针对 api 26 的未解决问题 issuetracker.google.com/issues/37084501,因此我没有在更高版本上运行 intentstestrule。
标签: android android-espresso android-testing