我正在尝试为我的SignIn Activity编写测试,其中我正在使用AsyncTask.
public class SignInActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
.........
new AsyncSignButton().execute();
}
class AsyncSignButton extends AsyncTask<Void, Void, Integer>{
.......
}
Run Code Online (Sandbox Code Playgroud)
为了测试,我尝试过使用IdlingResource,但我不明白如何将它与AsyncTask一起使用,而不是像示例中那样使用WebView,只是简单的AsyncTask.
这是我的测试代码:
public class Test extends ActivityInstrumentationTestCase2<SplashActivity> {
private SplashActivity mActivity;
public Test(){
super(SplashActivity.class);
}
public Test(Class<SplashActivity> activityClass) {
super(activityClass);
}
@Override
protected void setUp() throws Exception{
super.setUp();
mActivity = getActivity();
//how call it?
}
@LargeTest
public void testList() throws InterruptedException {
//wait AsyncTask before call
onView(withId(R.id.action_bar_accept_button)).perform(click());
}
public final class AsyncIdlingResource implements IdlingResource { …Run Code Online (Sandbox Code Playgroud) 我正在编写一个Android ApplicationTestCase(来自Diego T. Milano的Android应用程序测试指南中的TemperatureConverterApplicationTests示例,第171页).这个例子是针对Android 2.3编写的,它似乎不适用于Android 4.你不必知道这本书来理解这个问题,因为我简化了它.
这适用于Android 2.3.3(API 10):
setContext(new MockContext());
createApplication();
Run Code Online (Sandbox Code Playgroud)
[确切地说,抛出了UnsupportedOperationException,因为没有实现getPackageName().但这是正常的,可以通过使用实现getPackageName()和getSharedPreferences()的MockContext()子类来解决.这是不相关的,因为即使这样做之后问题仍然存在.]
问题是,使用Android 4.1.2(API 16)它不起作用.我得到一个AssertionFailedError,通过一些调试我发现是由于在ApplicationTestCase的第100行抛出了ClassCastException.
mApplication = (T) Instrumentation.newApplication(mApplicationClass, getContext());
Run Code Online (Sandbox Code Playgroud)
的ClassCastException异常信息是:
java.lang.ClassCastException: android.test.mock.MockContext cannot be cast to android.app.ContextImpl
Run Code Online (Sandbox Code Playgroud)
任何建议为什么会发生这种情况以及如何避免?
我有个问题
我想测试是否在按下按钮后使用espresso启动Web浏览器.问题是:是否有可能测试这样的事情?如果有的话,我会怎么做?
我正在尝试通过Robolectric进行仪器测试和单元测试来运行Espresso(使用Double Espresso).到目前为止我所拥有的主要是基于deckard-gradle的例子.
注意: Gradle 1.10
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.10.4'
classpath 'org.robolectric.gradle:gradle-android-test-plugin:0.10.0'
}
}
apply plugin: 'android'
apply plugin: 'android-test'
android {
compileSdkVersion 19
buildToolsVersion '19.0.3'
defaultConfig {
packageName = 'com.example.app'
minSdkVersion 9
targetSdkVersion 19
versionCode 1
versionName '1.0.0'
testInstrumentationRunner "com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner"
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
buildTypes {
debug {
debuggable = true
runProguard = false
}
release {
debuggable = false
runProguard = true
}
}
sourceSets {
androidTest {
setRoot('src/test') …Run Code Online (Sandbox Code Playgroud) 我试图在我的表单中测试NestedScrollView中的EditTexts.我正在运行以下代码:
onView(withId(R.id.register_scroll_view)).perform(scrollTo()).perform(click());
Run Code Online (Sandbox Code Playgroud)
其中register_scroll_view是我的NestedScrollView.但是,我得到一个例外:
android.support.test.espresso.PerformException:在视图'上执行'滚动到'时出错,ID为:com.eazyigz.myapp:id/register_scroll_view'.引起:java.lang.RuntimeException:不会执行Action,因为目标视图不匹配以下一个或多个约束:(视图具有有效可见性= VISIBLE并且是a的后代:(可从类中分配:class android .widget.ScrollView或可从类中分配:class android.widget.HorizontalScrollView))
如何正确设计此测试,以便我可以测试需要滚动到可见的EditTexts?
这是我第一次使用espresso意图,我按照Android测试项目中提供的IntentsBasicSamle但没有解决.
在我的应用程序中,我有一个活动,用户选择多个图像然后返回的图像显示在gridview中,现在通过使用espresso意图我想模拟这个而不去实际的图像选择器并每次返回一些指定的图像.
没有错误,但在我运行测试时仍会打开图像选择器窗口.我觉得我做错了,但我没有得到它是如何工作的.
我正在测试使用apk.
这就是照片选择器的调用方式
应用代码
这就是我调用选择图像的方式Intent和结果在onActivityResult中处理.
if (ApiUtils.checkApiLevel(18)) {
//API18+
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
}
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, getActivity().getString(R.string.fragment_image_selection_select_picture)), 1);
Run Code Online (Sandbox Code Playgroud)
测试代码
@RunWith(AndroidJUnit4.class)
@LargeTest
public class ImagesTests {
private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME = "com.company.recorder.RecorderActivity";
private static Class<? extends Activity> activityClass;
private ServiceValidatorIdlingResource serviceValidatorIdlingResource;
static {
try {
activityClass = (Class<? extends Activity>) Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
/**
* Change espresso default view idling time
* so that test can wait for long time …Run Code Online (Sandbox Code Playgroud) java android android-intent android-testing android-espresso
我的Android应用程序使用Java 8 lambdas,如下所示:
myView.setOnClickListener(view -> someMethod());
Run Code Online (Sandbox Code Playgroud)
在构建应用程序或运行单元测试时,一切正常.但是,当我运行时./gradlew connectedAndroidTest,我收到以下错误:
Execution failed for task ':myModule:transformClassesWithDesugarForDebugAndroidTest'.
Exception in thread "main" java.lang.IllegalStateException: Couldn't desugar invokedynamic for com/.../MyActivity.onClick using java/lang/invoke/LambdaMetafactory.metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (6) with arguments [(Landroid/view/View;)V, com/.../MyActivity.lambda$onViewBound$0(Landroid/view/View;)V (7), (Landroid/view/View;)V]
at com.google.devtools.build.android.desugar.LambdaDesugaring$InvokedynamicRewriter.visitInvokeDynamicInsn(LambdaDesugaring.java:474)
at org.objectweb.asm.ClassReader.readCode(ClassReader.java:1623)
at org.objectweb.asm.ClassReader.readMethod(ClassReader.java:1126)
at org.objectweb.asm.ClassReader.accept(ClassReader.java:698)
at org.objectweb.asm.ClassReader.accept(ClassReader.java:500)
at com.google.devtools.build.android.desugar.Desugar.desugarClassesInInput(Desugar.java:477)
at com.google.devtools.build.android.desugar.Desugar.desugarOneInput(Desugar.java:361)
at com.google.devtools.build.android.desugar.Desugar.desugar(Desugar.java:314)
at com.google.devtools.build.android.desugar.Desugar.main(Desugar.java:711)
Caused by: java.lang.IllegalAccessException: no such method: com...MyActivity.lambda$onViewBound$0(View)void/invokeSpecial
at java.lang.invoke.MemberName.makeAccessException(MemberName.java:867)
at java.lang.invoke.MemberName$Factory.resolveOrFail(MemberName.java:1003)
at java.lang.invoke.MethodHandles$Lookup.resolveOrFail(MethodHandles.java:1386)
at java.lang.invoke.MethodHandles$Lookup.findSpecial(MethodHandles.java:1004)
at com.google.devtools.build.android.desugar.LambdaDesugaring$InvokedynamicRewriter.toMethodHandle(LambdaDesugaring.java:670)
at com.google.devtools.build.android.desugar.LambdaDesugaring$InvokedynamicRewriter.toJvmMetatype(LambdaDesugaring.java:647)
at com.google.devtools.build.android.desugar.LambdaDesugaring$InvokedynamicRewriter.visitInvokeDynamicInsn(LambdaDesugaring.java:408)
... 8 more
Caused by: java.lang.NoClassDefFoundError: com/.../databinding/MyActivityBinding …Run Code Online (Sandbox Code Playgroud) 添加了新的类来测试活动,例如ActivityScenarioRule和ActivityScenario 并且没有文档说明如何在您想要放置一些额外数据时使用它们。
现在我找到了两种工作方式,简而言之:
1) 使用 ActivityScenarioRule 并使用#onActivity将您的额外内容添加到带有 @Before 注释的方法中。但是,某些测试用例会有不必要的数据。
2) 其次,当你不需要额外的时候使用 ActivityScenario 和#launch(Class activityClass),当你想要额外的时候使用#launch(Intent startActivityIntent)。但是,这一次我失去了使用#onActivity的能力,可以在所有测试用例中通用
PS 这是我第一次进行 android 测试 :)
我正在尝试为我的 Android 应用程序编写一个简单的 UI 测试:
@RunWith(AndroidJUnit4::class)
class SimpleTest {
@get:Rule
val activityRule = activityScenarioRule<MainActivity>()
@Test
fun justPass() {}
}
Run Code Online (Sandbox Code Playgroud)
问题是这个测试永远挂起,并且应用程序卡在这个屏幕上:
它发生在模拟器和真实设备上。完整的标题是androidx.test.core.app.InstrumentationActivityInvoker$EmptyActivity.
奇怪的是,如果我按下方形按钮,然后从最近的应用程序中选择相同的屏幕,测试就会完成。
这些是我的测试依赖项:
testImplementation 'junit:junit:4.13.1'
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines_version"
testImplementation 'android.arch.core:core-testing:2.1.0'
testImplementation "io.mockk:mockk:$mockk_version"
androidTestImplementation 'androidx.test:core-ktx:1.3.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
androidTestImplementation 'androidx.test.ext:junit-ktx:1.1.2'
androidTestImplementation 'androidx.test:runner:1.3.0'
androidTestImplementation "io.mockk:mockk-android:$mockk_version"
Run Code Online (Sandbox Code Playgroud)
如果我添加androidx.test:rules:1.3.0并替换activityScenarioRule为ActivityTestRule,测试将按我的预期自动完成。但 ActivityTestRule 已被弃用,所以我认为这不是一个好的选择。
那么我应该怎么做才能让这个测试通过而不被卡住呢?
MainActivity 在清单中声明,启动模式为单实例:
testImplementation 'junit:junit:4.13.1'
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines_version"
testImplementation 'android.arch.core:core-testing:2.1.0'
testImplementation "io.mockk:mockk:$mockk_version"
androidTestImplementation 'androidx.test:core-ktx:1.3.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
androidTestImplementation 'androidx.test.ext:junit-ktx:1.1.2'
androidTestImplementation 'androidx.test:runner:1.3.0'
androidTestImplementation "io.mockk:mockk-android:$mockk_version"
Run Code Online (Sandbox Code Playgroud)
如果我删除该launchMode属性,测试将不再挂起。不过,应该可以测试具有该属性的活动,因此我仍在寻找解决方案。
android-testing ×10
android ×9
android-4.0-ice-cream-sandwich ×1
java ×1
lambda ×1
robolectric ×1