gpt4 book ai didi

android - 如何跨多个 Activity 测试 Android 应用程序?

转载 作者:IT老高 更新时间:2023-10-28 13:10:03 24 4
gpt4 key购买 nike

我们正在构建一个复杂的 Android 应用程序,该应用程序由分布在许多 Activity 中的许多屏幕和工作流组成。我们的工作流程类似于您在银行的 ATM 机上看到的工作流程,例如,有一个 Activity 可以登录,转换到主菜单 Activity 可以转换到基于用户选择的其他 Activity 。

由于我们有如此多的工作流程,我们需要创建跨越多个 Activity 的自动化测试,以便我们可以端到端地测试工作流程。例如,使用 ATM 示例,我们想输入一个有效的 PIN,验证将我们发送到主菜单,选择提取现金,验证我们是否在提取现金屏幕上等等,最终找到自己返回主菜单或“退出”。

我们玩弄了 Android 附带的测试 API(例如 ActivityInstrumentationTestCase2)以及 Positron ,但似乎都无法测试超出单个 Activity 的范围,虽然我们可以在这些工具中找到一些用于某些单元测试的实用程序,但它们无法满足我们对跨越的测试场景的需求多个 Activity 。

我们对 xUnit 框架、脚本、GUI 记录器/回放等持开放态度,并希望得到任何建议。

最佳答案

回答我自己的悬赏问题有点尴尬,但这里是......

我对此进行了高低搜索,无法相信任何地方都没有发布答案。我已经非常接近了。我现在绝对可以运行跨越 Activity 的测试,但我的实现似乎有一些时间问题,测试并不总是可靠地通过。这是我所知道的成功跨多个 Activity 进行测试的唯一示例。希望我对它的提取和匿名化不会引入错误。这是一个简单的测试,我在登录 Activity 中输入用户名和密码,然后观察在不同的“欢迎” Activity 中显示正确的欢迎消息:

package com.mycompany;

import android.app.*;
import android.content.*;
import android.test.*;
import android.test.suitebuilder.annotation.*;
import android.util.*;
import android.view.*;
import android.widget.*;

import static org.hamcrest.core.Is.*;
import static org.hamcrest.core.IsNull.*;
import static org.hamcrest.core.IsInstanceOf.instanceOf;
import static org.junit.Assert.*;
import static com.mycompany.R.id.*;

public class LoginTests extends InstrumentationTestCase {

@MediumTest
public void testAValidUserCanLogIn() {

Instrumentation instrumentation = getInstrumentation();

// Register we are interested in the authentication activiry...
Instrumentation.ActivityMonitor monitor = instrumentation.addMonitor(AuthenticateActivity.class.getName(), null, false);

// Start the authentication activity as the first activity...
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setClassName(instrumentation.getTargetContext(), AuthenticateActivity.class.getName());
instrumentation.startActivitySync(intent);

// Wait for it to start...
Activity currentActivity = getInstrumentation().waitForMonitorWithTimeout(monitor, 5);
assertThat(currentActivity, is(notNullValue()));

// Type into the username field...
View currentView = currentActivity.findViewById(username_field);
assertThat(currentView, is(notNullValue()));
assertThat(currentView, instanceOf(EditText.class));
TouchUtils.clickView(this, currentView);
instrumentation.sendStringSync("MyUsername");

// Type into the password field...
currentView = currentActivity.findViewById(password_field);
assertThat(currentView, is(notNullValue()));
assertThat(currentView, instanceOf(EditText.class));
TouchUtils.clickView(this, currentView);
instrumentation.sendStringSync("MyPassword");

// Register we are interested in the welcome activity...
// this has to be done before we do something that will send us to that
// activity...
instrumentation.removeMonitor(monitor);
monitor = instrumentation.addMonitor(WelcomeActivity.class.getName(), null, false);

// Click the login button...
currentView = currentActivity.findViewById(login_button;
assertThat(currentView, is(notNullValue()));
assertThat(currentView, instanceOf(Button.class));
TouchUtils.clickView(this, currentView);

// Wait for the welcome page to start...
currentActivity = getInstrumentation().waitForMonitorWithTimeout(monitor, 5);
assertThat(currentActivity, is(notNullValue()));

// Make sure we are logged in...
currentView = currentActivity.findViewById(welcome_message);
assertThat(currentView, is(notNullValue()));
assertThat(currentView, instanceOf(TextView.class));
assertThat(((TextView)currentView).getText().toString(), is("Welcome, MyUsername!"));
}
}

这段代码显然不是很可读。我实际上已经将它提取到一个带有类似英语 API 的简单库中,所以我可以这样说:

type("myUsername").intoThe(username_field);
click(login_button);

我已经对大约 4 项 Activity 进行了深度测试,并且对这种方法的工作感到满意,尽管正如我所说,似乎偶尔会出现一个我还没有完全弄清楚的时间问题。我仍然有兴趣了解跨 Activity 的任何其他测试方式。

关于android - 如何跨多个 Activity 测试 Android 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1759626/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com