我正在尝试自动化应用程序的入门过程,需要在每次@Test之前清除应用程序数据
我已经实现了
public class Onboarding {
@Rule
public ActivityTestRule<AppStartActivity> mActivityTestRule = new ActivityTestRule<>(AppStartActivity.class);
@Before
public void clearPreferences() {
try {
// clearing app data
Runtime runtime = Runtime.getRuntime();
runtime.exec("pm clear packageName");
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void Mobile10DigitWithInvalidOtp () {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
OnboardingFragment onboardingFragment = new OnboardingFragment();
onboardingFragment.LoginAsExistingUserIndia("1325546852", "12345");
onboardingFragment.invalidOtpMessage.check(matches(isDisplayed()));
}
}
但是一旦运行,测试就会崩溃。
测试未能运行完成。原因:"由于'进程崩溃',检测运行失败。检查设备日志猫了解详细信息测试运行失败:由于"进程崩溃",检测运行失败。
此外,如果我在没有@Before的情况下运行@Test,它运行良好。
我应该如何实现这一点,以便在每次测试运行之前清除应用数据后可以继续运行我的测试用例?
运行插桩测试时,它们与同一线程中的受测应用程序一起运行。清除包或换句话说,终止测试线程下的应用程序也会终止检测测试。
可能的解决方案:
- 在开始使用检测测试之前清除包,例如
adb
命令:adb shell pm clear com.bla.bla
- 在被测应用程序中实现方法,该方法清除所需的数据(数据库、首选项等)并从测试方法内部调用
@Before
该方法。
您可以使用 Android Test Orchestrator。
https://developer.android.com/training/testing/junit-runner#using-android-test-orchestrator
要使用 Gradle 命令行工具启用 Android Test Orchestrator,请将以下语句添加到项目的 build.gradle 文件中:
android {
defaultConfig {
...
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
// The following argument makes the Android Test Orchestrator run its
// "pm clear" command after each test invocation. This command ensures
// that the app's state is completely cleared between tests.
testInstrumentationRunnerArguments clearPackageData: 'true'
}
testOptions {
execution 'ANDROIDX_TEST_ORCHESTRATOR'
}
}
dependencies {
androidTestImplementation 'androidx.test:runner:1.1.0'
androidTestUtil 'androidx.test:orchestrator:1.1.0'
}