Articles of android testing

如何使用ServiceTestCase测试IntentService?

我一直在尝试使用Android提供的ServiceTestCase类测试我的IntentService ,但测试失败, testServiceTestCaseSetUpProperly首先失败。 我的代码如下: public class MyClientServiceTest extends ServiceTestCase { public static final String TAG = MyClientServiceTest.class.getName(); public static final String FILE_PREFIX = “test_”; private boolean bLoggingIn = false; private boolean bLoggingOut = false; private boolean bSendingScanRequest = false; private boolean bGettingTemplates = false; private final Class SERVICE_CLASS = MyClientService.class; private RenamingDelegatingContext rdContext = null; […]

测试自定义View的onMeasure / onLayout / onDraw方法有什么好方法?

我刚刚编写了一个自定义View类,除其他外,它允许开发人员轻松设置边框(例如setBorderWidth , setBorderColor , setBorderWidthLeft等)。 我通过覆盖onMeasure / onDraw做到这一点,我想测试View正确绘制这些边框。 理想情况下,我想要一个比unit testing更高级别的东西:基本上我想强制执行如果我设置边框,它们按预期绘制; 如果我不设置它们就不会被绘制; 如果我更改它们,则会绘制新边框并且不再显示旧边框。 这让我知道我的观点在高层次上工作。 我考虑过的事情: 将视图与Robolectric隔离并使用模拟Canvas手动调用onDraw(但不测试失效) 制作一个Activity测试用例并以某种方式保存Activity的屏幕截图并以编程方式对其进行分析。 这些对我来说都不是很好,但我倾向于2)。 还有其他想法吗?

Android Espresso不等待UI完成

我有一个测试需要打开android.support.v7.preference.ListPreference对话框,选择一个选项,打开NavDrawer并从抽屉中选择一个项目。 对话框的定义如下: Espresso打开它像这样: onView(withText(mActivityRule.getActivity().getResources().getString(R.string.pref_title_VALUE)) .perform(click()); 这会打开ListPreference,但它不会阻塞,测试中的下一行会立即运行。 // click on setting onView(withText(VALUE_IN_LIST_PREFERENCE)) .perform(click()); 由于这种情况立即发生,因此没有出现对话框,并且withText(VALUE_IN_LIST_PREFERENCE)不匹配任何内容。 如果我单步执行调试器,暂停上面的行,对话框将及时显示,代码将起作用。 导航抽屉也会出现同样的问题。 它像这样打开: // open the nav drawer onView(withId(R.id.drawer_layout)) .perform(DrawerActions.open()); 点击一个项目: // click on phase 1 onView(withId(R.id.nav_view)) .perform(NavigationViewActions.navigateTo(R.id.nav_ITEM)); 与ListPreferences一样,测试代码继续而不等待UI完成,因此对onView的调用失败。 我试过让线程进入睡眠状态并按照这里的答案https://stackoverflow.com/a/22563297/4950621 但在这两种情况下,只有在Thread完成hibernate并且视图测试立即运行之后才会出现对话框。 所以,问题只是延迟,而不是解决。 在必要的视图可见之前,如何确保Espresso测试不会运行?

如何模拟android传感器事件?

例如,可以模拟android加速度计的事件吗? 想象一下以下场景:我有一个应用程序,在某些时候,如果从加速度计检测到X值,则向UI显示一个带有问题的对话框。 我想为它做一个测试。 为此,我想以编程方式模拟具有该X值的抖动,并检查对话框是否出现。 我已经知道传感器模拟器 ,但是有一种方法可以为加速度计或其他传感器发送值并使用SensorEventListener接收更改吗? 提前致谢,

测试无法匹配正确的意图组件

我无法使用espresso意图来测试使用意图启动的活动。 执行流程以下列方式工作 在主活动中,单击一个按钮 该按钮执行AsyncTask以获取一些数据 在AsyncTask的onPostExecute中,我创建了一个意图添加获取的数据作为Intent Extra,然后启动一个显示所获取数据的新活动。 创建intent并启动新活动的代码如下所示: @Override protected void onPostExecute(String result) { Intent intent = new Intent(context, NewActivity.class); intent.putExtra(key, result); context.startActivity(intent); } 当我运行应用程序时,这一切都有效。 至于使用espresso进行测试,测试代码如下所示: … @Rule public IntentsTestRule mIntentTestRule = new IntentsTestRule(MainActivity.class, false); @Test public void testMainActivityAsyncTask() { // Find view with button onView(withText(R.string.button_text)).perform(click()); // Ensure correct intent setup intended(allOf( hasComponent(NewActivity.class.getName()), hasExtraWithKey(key), toPackage(“com.example.espresso”))); // […]

Espresso:如何使用androidTest文件夹的R.string资源

我想将数据放在androidTest / res / values / string.xml文件夹的xml文件中。 我创建了文件说test.xml,内容如下。 hello 当我试图通过R.string.test访问现场测试时。 它无法访问,并说“无法解决符号测试”。 有人可以在这里建议我。

运行androidConnectedTest时修复“无法desugar invokedynamic”

我的Android应用程序使用Java 8 lambdas,如下所示: myView.setOnClickListener(view -> someMethod()); 在构建应用程序或运行unit testing时,一切正常。 但是,当我运行./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: […]

当我检查Roboelectric测试中的运行服务时,Nullpointerexception

当我对onCreate()方法检查某个特定服务是否正在运行的活动运行测试时,我得到一个NPE。 在测试的设置方法中,我调用: ActivityController ac = Robolectric.buildActivity(MyActivity.class).create(); mActivity = ac.get(); 在活动的onCreate()方法中,我调用isServiceRunning() ActivityManager manager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE); if(manager != null) { for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { if (service.service != null && “MyService”.equals(service.service.getClassName())) { return true; } } } return false; 执行此操作时,NPE失败: for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) manager不是null,但NPE在android库中的ActivityManager.getRunningServices(int)中抛出。 如果我需要这种方法通过,我该怎么办? 我正在使用Roboelectric 2.2-20130612.001729-6-jar-with-dependencies.jar,但即使使用最新版本,我现在也看到了问题。 我使用Android SDK版本19,但我现在切换到18,我仍然看到问题。 有任何想法吗? 堆栈跟踪: java.lang.NullPointerException at […]

如何让Gradle for Android从其他测试代码中查找库的测试代码?

我有一个Android应用程序,下面有两个库层。 每个库都有自己的测试代码。 我想上层库的测试代码扩展下层库的测试代码,但我无法弄清楚如何让Gradlefind下层库的测试代码(它只find生产代码)。 我的文件结构如下所示: myproject/ + myapp/ + src/ + main/ + java + com/myapp + lib1/ + src/ + main/ + java + com/myapp/lib1 + androidTest + java + com/myapp/lib1/test + lib2/ + src/ + main/ + java + com/myapp/lib2 + androidTest + java + com/myapp/lib2/test 该应用程序的gradle文件如下所示: apply plugin: ‘com.android.application’ android { … } […]

错误:任务执行失败’:app:transformClassesWithMultidexlistForDebugAndroidTest’

我无法弄清楚为什么会出现这个错误 这是完整的错误 Error:Execution failed for task ‘:app:transformClassesWithMultidexlistForDebugAndroidTest’. > java.io.IOException: The output jar is empty. Did you specify the proper ‘-keep’ options? 我的gradle android项目没有“androidTest”所以我手动创建,测试文件夹在这里是文件夹结构的截图