【问题标题】:Android Espresso: How do I test a specific Fragment when following one activity to several fragment architectureAndroid Espresso:如何在将一个活动跟踪到多个片段架构时测试特定片段
【发布时间】:2016-07-14 13:53:58
【问题描述】:

我的应用由一个Activity 和多个Fragments 组成。

我希望使用 Espresso 来测试 Fragments 的 UI。但是我遇到了一个问题。

如何测试未添加到onCreate 中的ActivityFragment。我在Fragments 中看到的所有示例都涉及在onCreate 中添加的Fragment。 那么如何让 Espresso 转到特定的 Fragment 并从那里开始呢?

谢谢

【问题讨论】:

    标签: android android-fragments android-testing android-espresso


    【解决方案1】:

    如果您使用的是导航架构组件,您可以在测试开始时通过深度链接到目标片段(使用适当的参数)来立即测试每个片段。

    @Rule
    @JvmField
    var activityRule = ActivityTestRule(MainActivity::class.java)
    
    protected fun launchFragment(destinationId: Int,
                                 argBundle: Bundle? = null) {
        val launchFragmentIntent = buildLaunchFragmentIntent(destinationId, argBundle)
        activityRule.launchActivity(launchFragmentIntent)
    }
    
    private fun buildLaunchFragmentIntent(destinationId: Int, argBundle: Bundle?): Intent =
            NavDeepLinkBuilder(InstrumentationRegistry.getInstrumentation().targetContext)
                    .setGraph(R.navigation.navigation)
                    .setComponentName(MainActivity::class.java)
                    .setDestination(destinationId)
                    .setArguments(argBundle)
                    .createTaskStackBuilder().intents[0]
    

    destinationId 是导航图中的片段目标 ID。这是一个在您准备好启动片段后将执行的调用示例:

    launchFragment(R.id.target_fragment, targetBundle())
    
    private fun targetBundle(): Bundle? {
        val bundle = Bundle()
        bundle.putString(ARGUMENT_ID, "Argument needed by fragment")
        return bundle
    }
    

    这里也有更详细的回答:https://stackoverflow.com/a/55203154/2125351

    【讨论】:

      【解决方案2】:

      因此,根据几家公司的模式和推荐做法。您需要为每个视图编写有针对性的密封测试,无论是活动、片段、对话框片段还是自定义视图。

      如果你按照以下方式使用 gradle,首先需要通过 gradle 将以下库导入到你的项目中

      debugImplementation 'androidx.fragment:fragment-testing:1.2.0-rc03'
      debugImplementation 'androidx.test:core:1.3.0-alpha03'
      

      对于 Kotlin,debugImplementation 'androidx.test:core-ktx:1.3.0-alpha03'

      为了独立于活动测试片段,您可以通过以下方式启动/启动它:

      @Test
          fun sampleTesting(){
              launchFragmentInContainer<YourFragment>()
              onView(withId(R.id.sample_view_id)).perform(click())
          }
      

      这样,您可以从您的活动中独立测试您的片段,这也是实现密封和有针对性的 ui 测试的推荐方法之一。有关完整的详细信息,您可以阅读 android 文档中的片段测试文档

      https://developer.android.com/training/basics/fragments/testing

      而且我发现这个包含大量测试示例的存储库非常有用,尽管它极其限于具有超级简单测试的测试用例的复杂性。虽然它可以作为开始的指南。

      https://github.com/android/testing-samples

      【讨论】:

        【解决方案3】:

        只需使用 Activity 的 SupportFragmentManager 显示 Fragment。

        例如 (Kotlin) 与 ActivityTestRule:

        @Rule
        @JvmField
        var activityRule = ActivityTestRule(MainActivity::class.java)
        

        在测试之前这样做:

        @Before
        fun setup() {
            activityRule.activity.supportFragmentManager.beginTransaction().replace(R.id.main_activity_container_for_your_fragments, FragmentToShow(), "fragment-tag").commitAllowingStateLoss()
            Thread.sleep(500)
        }
        

        【讨论】:

        • 我没有仔细研究它,也许 FragmentManager 需要一些时间来提交新状态,也许它只是一个动画,你可以在测试设备上轻松禁用......但是我认为在测试代码 sn-p 中为 FragmentManager 创建空闲资源会被过度设计...或者您的解决方案会是什么样子?
        【解决方案4】:

        仅当 Fragments 显示时,Espresso 才能测试它们。这要求它们以Activity 显示。

        使用您当前的设置,您必须以您的方式(就像用户一样)使用 Espresso 到 click() 到您实际想要测试的 Fragment

        在我的一个项目中,我有一个显示FragmentsViewPager。对于那些Fragments,我使用自定义FragmentTestRule 来单独测试它们。我可以直接启动每个Fragment 并使用 Espresso 来测试它。见this answer

        你也可以:

        • 不要使用FragmentsActivities 更容易测试。您可以单独测试每个Activity。在大多数情况下,FragmentsActivities 相比没有优势。 Fragments 只是让实现和测试更加困难。
        • 让你的FragmentActivity在创建时直接显示某个Fragment。例如。通过向您的FragmentActivity 提供额外的特殊意图。但这会给您的应用添加测试代码,这通常不是一个好的解决方案。

        【讨论】:

        • FragmentTestRule 这是链接答案的实现。
        • Fragment 加载速度比 Activity 快(它们甚至可以预加载到内存中),它们允许组件的模块化和重用,并且不需要全屏显示(它们可以放在布局就像任何其他视图)。片段非常受欢迎,因为它们对 Activity 有很大的改进。说片段没有优势是非常不准确的,使用它们的好处远远超过测试难度。
        • 对不起,“不使用 Fragments” 不是解决方案。与活动相比,片段可重复使用且速度更快。
        • 是的,它们很有用。这只是一个建议。如果您不知道如何测试它们,也许可以尝试一种可测试的方法......我知道如何测试它们并且我也使用它们。
        • 我建议你删除(如果你喜欢的话)片段建议,或者指定这是你最喜欢的偏好,这样用户就可以像“我刚刚做的那样”为你投票,并且在未来的小辈阅读你的回复将理解您的回复的第一部分是完全有效的
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-21
        相关资源
        最近更新 更多