Android Espresso:如何在将一个活动跟踪到多个片段架构时测试特定片段

时间:2016-07-14 13:53:59

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

对于很多Activity,我的应用包含一个Fragments

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

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

由于

4 个答案:

答案 0 :(得分:1)

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

@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

答案 1 :(得分:0)

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

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

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

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

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

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

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

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

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

答案 2 :(得分:-1)

只需使用Activity的SupportFragmentManager显示片段。

例如(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)
}

答案 3 :(得分:-7)

Espresso只有在显示时才能测试Fragments。这要求它们由Activity显示。

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

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

你也可以:

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