Articles of android testing

什么是触摸模式?为什么它对* ActivityTestRule *类很重要?

android.support.test.rule.ActivityTestRule类(请参见此处 )在其构造函数中包含initialTouchMode参数。 除了以下内容之外,在类引用(或任何在线)中没有解释这一点: initialTouchMode – 如果在启动时应将Activity置于“触摸模式”,则为true “触摸模式”究竟是什么意思? 将ActivityTestRule initialTouchMode设置为true或false什么意义? (我看到此参数的默认值为false )。

如何使用Robolectric测试IntentService?

我正在尝试使用Robolectric测试onHandleIntent()方法。 我正在启动服务: Activity activity = new Activity(); Intent intent = new Intent(activity, MyService.class); activity.startService(intent); ShadowActivity shadowActivity = Robolectric.shadowOf(activity); Intent startedIntent = shadowActivity.getNextStartedService(); assertNotNull(startedIntent); 似乎startedIntent不为null,但似乎没有调用onHandleIntent() 。 我该怎么测试呢?

为什么我不应该使用消息总线而不是加载器和服务?

在典型的Android项目中,我们需要以干净的方式将数据从某个地方(REST,SQL,缓存等)提取到UI中,我们通常使用Loader,Service或(可能是yuk)AsyncTask,但我发现所有这些方法由于以下几个原因不满意: 它们很难看,尤其是具有令人震惊的API结构的Loaders 它很容易被包裹在线程中,并踩在UI线程上 我们的表示层代码受到Android代码和样板的污染。 我们经常将Android对象(例如Cursors)传递到UI层,这使得一个干净的架构几乎无法实现。 这迫使我们将业务领域特定代码(理想情况下是普通Java对象)与Android平台代码混合在一起 – 对于未来开发的可读性,维护,测试或灵活性而言并不是很好。 在实践中,我们经常会遇到庞大,混乱的Activity / Fragment类。 我被这些文章中概述的想法所吸引: http : //fernandocejas.com/2014/09/03/architecting-android-the-clean-way/ http://antonioleiva.com/mvp-android/ http://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html 成功开始使用MVP将活动/碎片/视图分解为更小/更清洁的部分,我现在认为上述问题的解决方案可能是依赖于消息总线(Otto,EventBus等)而不是服务或加载器或任何与域数据交互的内容。 所以在实践中,这意味着不是使用(例如)CursorLoader从数据库加载Cursor,而是使用消息总线发送消息来请求数据,数据被加载到后台线程以响应该消息,然后通过UI线程上的消息到达时处理响应数据。 对我来说至关重要的是,我更倾向于将数据结构从业务领域推出,而不是Android域,所以我更喜欢一个业务对象数组,一个Cursor。 这是工程设计,总是需要权衡,虽然这似乎提供了更清晰的关注点分离,但是装载机/服务模板的减少,缺点是什么? 理解代码可能更难(特别是对于新开发人员) 有必要确保在正确的线程上发送和接收消息(Otto似乎在这里可能有限制) 有必要避免将所有事情都作为一种信息实施的诱惑,这最终会适得其反 传递业务对象集合可能不如使用像Cursors这样的对象。 虽然在许多情况下它在实践中是一个问题吗? 我不知道Otto / EventBus是否只是为了传递非常小的消息,或者是否适合传递更大的对象(例如业务对象数组)。 我的问题是,有没有基本的原因不采取这种基于消息的方法与Android应用程序?

一种在多个android测试模块之间共享代码的方法

我希望实现这样的目标: [ComponentTestsModule] com.android.test [FunctionalTestsModule] com.android.test both depends on -> [TestLibraryModule] ? which depends on -> [AppModule] com.android.application 用android gradle插件3.0+有没有办法做到这一点? 为什么我需要多个测试模块? 我想要不同types的测试的不同测试运行器,也针对不同的变体。 它现在正在使用androidTest下的单个代码库,但在自定义测试运行器中有丑陋的开关。 为什么我需要一个测试库模块? 我想在不同types的测试之间共享相同的页面对象,也许是一些实用程序代码。 问题是:页面对象必须能够访问R类应用程序(定位器:R.id。*) 我所知道的模块types都不能依赖于APK生成模块,期望来自com.android.test ,但我不能依赖com.android.test与另一个com.android.test 。

不推荐使用espresso contrib的openDrawer

Espresso contrib( com.android.support.test.espresso:espresso-contrib:2.2.1 )openDrawer方法已弃用 那我该怎么打开抽屉?

Android Espresso,测试前唤醒设备。 如何使用自定义清单进行测试?

我一直在用androids新的espresso框架编写测试,并发现它运行良好。 一个恼人的事情(特别是浓缩咖啡)是我必须确保我的屏幕醒来并解锁以便运行测试。 我发现了一种解决方法(通过各种来源),但我不确定整合它的最佳方法。 所以这就是我所做的,在我的“Home”活动中,我有以下代码: Home.class: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /************ Put this in a conditional for a test version ***********/ KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); KeyguardManager.KeyguardLock keyguardLock = km.newKeyguardLock(“TAG”); keyguardLock.disableKeyguard(); getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); } 您还需要添加以下权限: 所以在这样做之后,我的测试现在唤醒我的手机运行所以我没有必须站岗并确保屏幕在测试开始之前没有关闭。 我宁愿不在我的应用程序中包含这些权限。 我知道使用gradle可以制作具有自己的android清单的不同“风味”,它将合并到主清单中。 我正在考虑使用它,但我不想仅仅为了这个原因添加一种味道,因为这已经使用了测试构建types来运行。 从android gradle文档看起来,您无法为instrumentTest目录创建AndroidManifest,因为它将自动生成。 但是,我想知道是否有其他方法可以在不创建variables的情况下执行此操作,然后指定测试应该运行该变体。 此外,我不确定所有这些的确切语法,并认为只是在网站上为其他人提供此信息会很好,因为它似乎分散了。 最后,如果有人知道更好的方法来解决唤醒手机测试的问题,我很乐意听到它,因为我不是这种方式的忠实粉丝,我正在尝试。

Espresso意图测试失败

我正在学习使用浓缩咖啡的android仪器测试。 我有一个有抽屉菜单的应用程序,有一个叫做关于的菜单。 我正在测试点击该菜单项和活动内容。 testfunction: @Test public void testNavigationDrawerAboutMenu() { onView(withId(R.id.drawer_layout)) .perform(DrawerActions.open()); //open drawer onView(withText(“About”)).perform(click()); onView(withId(R.id.aboutsptemail)).check(matches(withText(R.string.screen_about_support_email))); onView(withId(R.id.aboutcpright)).check(matches(isDisplayed())); onView(withId(R.id.aboutprivacy)).check(matches(isDisplayed())); onView(withId(R.id.abouttermsconditions)).check(matches(isDisplayed())); onView(withId(R.id.aboutsptemail)).perform(click()); } 现在最后一个textview中嵌入了weblink。 因此,当您点击它时,它会自动在应用程序的Web视图中打开链接(www.support.com)。 我想测试这个function。 所以我试过这个: intended(hasComponent(WebViewActivity.class.getName())); //check if webview called on supportEmail link click 但是此错误跟踪测试失败: java.lang.NullPointerException: Attempt to invoke virtual method ‘android.support.test.espresso.intent.OngoingStubbing android.support.test.espresso.intent.Intents.internalIntending(org.hamcrest.Matcher)’ on a null object reference at android.support.test.espresso.intent.Intents.intending(Intents.java:155) at com.ScanBuy.SmartLabel.NavigationDrawerActivityTests.testNavigationDrawerAboutMenu(NavigationDrawerActivityTests.java:94) at java.lang.reflect.Method.invoke(Native Method) at […]

Android测试模块(Gradle Plugin 1.3)不起作用:“找不到调试类”

我正在尝试设置一个unit testing模块,如android studio博客文章中所述。 但是,执行gradle构建失败告诉我“找不到名为’debug-classes’的配置”。 Debug是它试图构建的targetVariant的名称,但我不明白这里出了什么问题。 这是我的测试模块的gradle文件。 apply plugin: ‘com.android.test’ android { compileSdkVersion 22 buildToolsVersion “22.0.1” targetProjectPath ‘:app’ targetVariant ‘debug’ } 这是描述新测试模块function的博客文章。 http://android-developers.blogspot.com/2015/07/get-your-hands-on-android-studio-13.html 我正在使用Gradle插件v1.3.0

Android alpha测试“找不到项目”

我已经发布了我的alpha测试应用程序,但无法从Play商店下载。 我已打开url“ https://play.google.com/apps/testing/com。* ”并接受成为测试人员,现在它向我显示“您是测试人员”。 但是,当我点击“从Play商店下载”链接时,它会在我的测试设备游戏商店中显示“找不到商品”,并在桌面浏览器中显示“未find请求的URL”。 应用程序已发布状态超过48小时。 App已在所有国家/地区发布。 添加了针对测试人员的Google论坛,我可以在管理测试人员标签中看到该论坛。 测试人员帐户被添加到组中(三重检查) 测试设备只有一个测试人员帐户。 我可以访问应用内购买,这意味着应用程序已正确发布。 Google不再支持草稿模式。 我在stackoverflow中经历了一些类似的post,但没有明确的答案。 对于某些人来说它看起来像是自动解决了,有些人不够幸运。

如何在Android Unit测试中打开控制台输出?

有没有办法在控制台输出中打开测试日志记录? 我知道我们可以查看HTML文件中生成的测试结果并检查那里的标准输出,但我发现它有点不方便。 我知道有一种方法可以使用标准的java插件来做到这一点: test { testLogging { events “passed”, “skipped”, “failed”, “standardOut”, “standardError” } } 但在Android项目中使用它会导致错误: Could not find method test() 当然,应用java插件是不可接受的,因为它与Android插件不兼容。